44509 lines
1.7 MiB
44509 lines
1.7 MiB
|
|
lwip_test.elf: file format elf32-littlearm
|
|
|
|
Sections:
|
|
Idx Name Size VMA LMA File off Algn
|
|
0 .isr_vector 000002cc 08000000 08000000 00010000 2**0
|
|
CONTENTS, ALLOC, LOAD, READONLY, DATA
|
|
1 .text 000112d4 080002d0 080002d0 000102d0 2**4
|
|
CONTENTS, ALLOC, LOAD, READONLY, CODE
|
|
2 .rodata 000039e4 080115a4 080115a4 000215a4 2**2
|
|
CONTENTS, ALLOC, LOAD, READONLY, DATA
|
|
3 .init_array 00000004 08014f88 08014f88 00024f88 2**2
|
|
CONTENTS, ALLOC, LOAD, DATA
|
|
4 .fini_array 00000004 08014f8c 08014f8c 00024f8c 2**2
|
|
CONTENTS, ALLOC, LOAD, DATA
|
|
5 .data 000000d0 24000000 08014f90 00030000 2**2
|
|
CONTENTS, ALLOC, LOAD, DATA
|
|
6 .bss 00007d48 240000d0 08015060 000300d0 2**2
|
|
ALLOC
|
|
7 ._user_heap_stack 00000600 24007e18 08015060 00037e18 2**0
|
|
ALLOC
|
|
8 .lwip_sec 00000160 30000000 30000000 00040000 2**2
|
|
ALLOC
|
|
9 .ARM.attributes 0000002e 00000000 00000000 000300d0 2**0
|
|
CONTENTS, READONLY
|
|
10 .comment 00000043 00000000 00000000 000300fe 2**0
|
|
CONTENTS, READONLY
|
|
11 .debug_info 0001f0ff 00000000 00000000 00030141 2**0
|
|
CONTENTS, READONLY, DEBUGGING, OCTETS
|
|
12 .debug_abbrev 000054e0 00000000 00000000 0004f240 2**0
|
|
CONTENTS, READONLY, DEBUGGING, OCTETS
|
|
13 .debug_aranges 00001508 00000000 00000000 00054720 2**3
|
|
CONTENTS, READONLY, DEBUGGING, OCTETS
|
|
14 .debug_rnglists 00001094 00000000 00000000 00055c28 2**0
|
|
CONTENTS, READONLY, DEBUGGING, OCTETS
|
|
15 .debug_macro 0003e829 00000000 00000000 00056cbc 2**0
|
|
CONTENTS, READONLY, DEBUGGING, OCTETS
|
|
16 .debug_line 00026379 00000000 00000000 000954e5 2**0
|
|
CONTENTS, READONLY, DEBUGGING, OCTETS
|
|
17 .debug_str 00150dcb 00000000 00000000 000bb85e 2**0
|
|
CONTENTS, READONLY, DEBUGGING, OCTETS
|
|
18 .debug_frame 00005dfc 00000000 00000000 0020c62c 2**2
|
|
CONTENTS, READONLY, DEBUGGING, OCTETS
|
|
19 .debug_line_str 0000004a 00000000 00000000 00212428 2**0
|
|
CONTENTS, READONLY, DEBUGGING, OCTETS
|
|
|
|
Disassembly of section .text:
|
|
|
|
080002d0 <__do_global_dtors_aux>:
|
|
80002d0: b510 push {r4, lr}
|
|
80002d2: 4c05 ldr r4, [pc, #20] ; (80002e8 <__do_global_dtors_aux+0x18>)
|
|
80002d4: 7823 ldrb r3, [r4, #0]
|
|
80002d6: b933 cbnz r3, 80002e6 <__do_global_dtors_aux+0x16>
|
|
80002d8: 4b04 ldr r3, [pc, #16] ; (80002ec <__do_global_dtors_aux+0x1c>)
|
|
80002da: b113 cbz r3, 80002e2 <__do_global_dtors_aux+0x12>
|
|
80002dc: 4804 ldr r0, [pc, #16] ; (80002f0 <__do_global_dtors_aux+0x20>)
|
|
80002de: f3af 8000 nop.w
|
|
80002e2: 2301 movs r3, #1
|
|
80002e4: 7023 strb r3, [r4, #0]
|
|
80002e6: bd10 pop {r4, pc}
|
|
80002e8: 240000d0 .word 0x240000d0
|
|
80002ec: 00000000 .word 0x00000000
|
|
80002f0: 0801158c .word 0x0801158c
|
|
|
|
080002f4 <frame_dummy>:
|
|
80002f4: b508 push {r3, lr}
|
|
80002f6: 4b03 ldr r3, [pc, #12] ; (8000304 <frame_dummy+0x10>)
|
|
80002f8: b11b cbz r3, 8000302 <frame_dummy+0xe>
|
|
80002fa: 4903 ldr r1, [pc, #12] ; (8000308 <frame_dummy+0x14>)
|
|
80002fc: 4803 ldr r0, [pc, #12] ; (800030c <frame_dummy+0x18>)
|
|
80002fe: f3af 8000 nop.w
|
|
8000302: bd08 pop {r3, pc}
|
|
8000304: 00000000 .word 0x00000000
|
|
8000308: 240000d4 .word 0x240000d4
|
|
800030c: 0801158c .word 0x0801158c
|
|
|
|
08000310 <memchr>:
|
|
8000310: f001 01ff and.w r1, r1, #255 ; 0xff
|
|
8000314: 2a10 cmp r2, #16
|
|
8000316: db2b blt.n 8000370 <memchr+0x60>
|
|
8000318: f010 0f07 tst.w r0, #7
|
|
800031c: d008 beq.n 8000330 <memchr+0x20>
|
|
800031e: f810 3b01 ldrb.w r3, [r0], #1
|
|
8000322: 3a01 subs r2, #1
|
|
8000324: 428b cmp r3, r1
|
|
8000326: d02d beq.n 8000384 <memchr+0x74>
|
|
8000328: f010 0f07 tst.w r0, #7
|
|
800032c: b342 cbz r2, 8000380 <memchr+0x70>
|
|
800032e: d1f6 bne.n 800031e <memchr+0xe>
|
|
8000330: b4f0 push {r4, r5, r6, r7}
|
|
8000332: ea41 2101 orr.w r1, r1, r1, lsl #8
|
|
8000336: ea41 4101 orr.w r1, r1, r1, lsl #16
|
|
800033a: f022 0407 bic.w r4, r2, #7
|
|
800033e: f07f 0700 mvns.w r7, #0
|
|
8000342: 2300 movs r3, #0
|
|
8000344: e8f0 5602 ldrd r5, r6, [r0], #8
|
|
8000348: 3c08 subs r4, #8
|
|
800034a: ea85 0501 eor.w r5, r5, r1
|
|
800034e: ea86 0601 eor.w r6, r6, r1
|
|
8000352: fa85 f547 uadd8 r5, r5, r7
|
|
8000356: faa3 f587 sel r5, r3, r7
|
|
800035a: fa86 f647 uadd8 r6, r6, r7
|
|
800035e: faa5 f687 sel r6, r5, r7
|
|
8000362: b98e cbnz r6, 8000388 <memchr+0x78>
|
|
8000364: d1ee bne.n 8000344 <memchr+0x34>
|
|
8000366: bcf0 pop {r4, r5, r6, r7}
|
|
8000368: f001 01ff and.w r1, r1, #255 ; 0xff
|
|
800036c: f002 0207 and.w r2, r2, #7
|
|
8000370: b132 cbz r2, 8000380 <memchr+0x70>
|
|
8000372: f810 3b01 ldrb.w r3, [r0], #1
|
|
8000376: 3a01 subs r2, #1
|
|
8000378: ea83 0301 eor.w r3, r3, r1
|
|
800037c: b113 cbz r3, 8000384 <memchr+0x74>
|
|
800037e: d1f8 bne.n 8000372 <memchr+0x62>
|
|
8000380: 2000 movs r0, #0
|
|
8000382: 4770 bx lr
|
|
8000384: 3801 subs r0, #1
|
|
8000386: 4770 bx lr
|
|
8000388: 2d00 cmp r5, #0
|
|
800038a: bf06 itte eq
|
|
800038c: 4635 moveq r5, r6
|
|
800038e: 3803 subeq r0, #3
|
|
8000390: 3807 subne r0, #7
|
|
8000392: f015 0f01 tst.w r5, #1
|
|
8000396: d107 bne.n 80003a8 <memchr+0x98>
|
|
8000398: 3001 adds r0, #1
|
|
800039a: f415 7f80 tst.w r5, #256 ; 0x100
|
|
800039e: bf02 ittt eq
|
|
80003a0: 3001 addeq r0, #1
|
|
80003a2: f415 3fc0 tsteq.w r5, #98304 ; 0x18000
|
|
80003a6: 3001 addeq r0, #1
|
|
80003a8: bcf0 pop {r4, r5, r6, r7}
|
|
80003aa: 3801 subs r0, #1
|
|
80003ac: 4770 bx lr
|
|
80003ae: bf00 nop
|
|
|
|
080003b0 <strlen>:
|
|
80003b0: 4603 mov r3, r0
|
|
80003b2: f813 2b01 ldrb.w r2, [r3], #1
|
|
80003b6: 2a00 cmp r2, #0
|
|
80003b8: d1fb bne.n 80003b2 <strlen+0x2>
|
|
80003ba: 1a18 subs r0, r3, r0
|
|
80003bc: 3801 subs r0, #1
|
|
80003be: 4770 bx lr
|
|
|
|
080003c0 <ITM_SendChar>:
|
|
\li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.
|
|
\param [in] ch Character to transmit.
|
|
\returns Character to transmit.
|
|
*/
|
|
__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
|
|
{
|
|
80003c0: b480 push {r7}
|
|
80003c2: b083 sub sp, #12
|
|
80003c4: af00 add r7, sp, #0
|
|
80003c6: 6078 str r0, [r7, #4]
|
|
if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */
|
|
80003c8: f04f 4360 mov.w r3, #3758096384 ; 0xe0000000
|
|
80003cc: f8d3 3e80 ldr.w r3, [r3, #3712] ; 0xe80
|
|
80003d0: f003 0301 and.w r3, r3, #1
|
|
80003d4: 2b00 cmp r3, #0
|
|
80003d6: d013 beq.n 8000400 <ITM_SendChar+0x40>
|
|
((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */
|
|
80003d8: f04f 4360 mov.w r3, #3758096384 ; 0xe0000000
|
|
80003dc: f8d3 3e00 ldr.w r3, [r3, #3584] ; 0xe00
|
|
80003e0: f003 0301 and.w r3, r3, #1
|
|
if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */
|
|
80003e4: 2b00 cmp r3, #0
|
|
80003e6: d00b beq.n 8000400 <ITM_SendChar+0x40>
|
|
{
|
|
while (ITM->PORT[0U].u32 == 0UL)
|
|
80003e8: e000 b.n 80003ec <ITM_SendChar+0x2c>
|
|
{
|
|
__NOP();
|
|
80003ea: bf00 nop
|
|
while (ITM->PORT[0U].u32 == 0UL)
|
|
80003ec: f04f 4360 mov.w r3, #3758096384 ; 0xe0000000
|
|
80003f0: 681b ldr r3, [r3, #0]
|
|
80003f2: 2b00 cmp r3, #0
|
|
80003f4: d0f9 beq.n 80003ea <ITM_SendChar+0x2a>
|
|
}
|
|
ITM->PORT[0U].u8 = (uint8_t)ch;
|
|
80003f6: f04f 4360 mov.w r3, #3758096384 ; 0xe0000000
|
|
80003fa: 687a ldr r2, [r7, #4]
|
|
80003fc: b2d2 uxtb r2, r2
|
|
80003fe: 701a strb r2, [r3, #0]
|
|
}
|
|
return (ch);
|
|
8000400: 687b ldr r3, [r7, #4]
|
|
}
|
|
8000402: 4618 mov r0, r3
|
|
8000404: 370c adds r7, #12
|
|
8000406: 46bd mov sp, r7
|
|
8000408: f85d 7b04 ldr.w r7, [sp], #4
|
|
800040c: 4770 bx lr
|
|
|
|
0800040e <_write>:
|
|
/* Private user code ---------------------------------------------------------*/
|
|
/* USER CODE BEGIN 0 */
|
|
#define min(x, y) (x) < (y) ? (x) : (y)
|
|
#define max(x, y) (x) > (y) ? (x) : (y)
|
|
|
|
int _write(int32_t file, uint8_t *ptr, int32_t len) {
|
|
800040e: b580 push {r7, lr}
|
|
8000410: b086 sub sp, #24
|
|
8000412: af00 add r7, sp, #0
|
|
8000414: 60f8 str r0, [r7, #12]
|
|
8000416: 60b9 str r1, [r7, #8]
|
|
8000418: 607a str r2, [r7, #4]
|
|
for (int32_t i = 0; i < len; ++i)
|
|
800041a: 2300 movs r3, #0
|
|
800041c: 617b str r3, [r7, #20]
|
|
800041e: e009 b.n 8000434 <_write+0x26>
|
|
ITM_SendChar(*ptr++);
|
|
8000420: 68bb ldr r3, [r7, #8]
|
|
8000422: 1c5a adds r2, r3, #1
|
|
8000424: 60ba str r2, [r7, #8]
|
|
8000426: 781b ldrb r3, [r3, #0]
|
|
8000428: 4618 mov r0, r3
|
|
800042a: f7ff ffc9 bl 80003c0 <ITM_SendChar>
|
|
for (int32_t i = 0; i < len; ++i)
|
|
800042e: 697b ldr r3, [r7, #20]
|
|
8000430: 3301 adds r3, #1
|
|
8000432: 617b str r3, [r7, #20]
|
|
8000434: 697a ldr r2, [r7, #20]
|
|
8000436: 687b ldr r3, [r7, #4]
|
|
8000438: 429a cmp r2, r3
|
|
800043a: dbf1 blt.n 8000420 <_write+0x12>
|
|
return len;
|
|
800043c: 687b ldr r3, [r7, #4]
|
|
}
|
|
800043e: 4618 mov r0, r3
|
|
8000440: 3718 adds r7, #24
|
|
8000442: 46bd mov sp, r7
|
|
8000444: bd80 pop {r7, pc}
|
|
...
|
|
|
|
08000448 <LOG_ERROR>:
|
|
|
|
extern void LOG_ERROR(const char *format, ...) {
|
|
8000448: b40f push {r0, r1, r2, r3}
|
|
800044a: b580 push {r7, lr}
|
|
800044c: b082 sub sp, #8
|
|
800044e: af00 add r7, sp, #0
|
|
va_list args;
|
|
va_start(args, format);
|
|
8000450: f107 0314 add.w r3, r7, #20
|
|
8000454: 607b str r3, [r7, #4]
|
|
fprintf(stderr, "ERROR: ");
|
|
8000456: 4b0f ldr r3, [pc, #60] ; (8000494 <LOG_ERROR+0x4c>)
|
|
8000458: 681b ldr r3, [r3, #0]
|
|
800045a: 68db ldr r3, [r3, #12]
|
|
800045c: 2207 movs r2, #7
|
|
800045e: 2101 movs r1, #1
|
|
8000460: 480d ldr r0, [pc, #52] ; (8000498 <LOG_ERROR+0x50>)
|
|
8000462: f010 fba3 bl 8010bac <fwrite>
|
|
vfprintf(stderr, format, args);
|
|
8000466: 4b0b ldr r3, [pc, #44] ; (8000494 <LOG_ERROR+0x4c>)
|
|
8000468: 681b ldr r3, [r3, #0]
|
|
800046a: 68db ldr r3, [r3, #12]
|
|
800046c: 687a ldr r2, [r7, #4]
|
|
800046e: 6939 ldr r1, [r7, #16]
|
|
8000470: 4618 mov r0, r3
|
|
8000472: f010 f8f3 bl 801065c <vfiprintf>
|
|
fprintf(stderr, "\r\n");
|
|
8000476: 4b07 ldr r3, [pc, #28] ; (8000494 <LOG_ERROR+0x4c>)
|
|
8000478: 681b ldr r3, [r3, #0]
|
|
800047a: 68db ldr r3, [r3, #12]
|
|
800047c: 2202 movs r2, #2
|
|
800047e: 2101 movs r1, #1
|
|
8000480: 4806 ldr r0, [pc, #24] ; (800049c <LOG_ERROR+0x54>)
|
|
8000482: f010 fb93 bl 8010bac <fwrite>
|
|
va_end(args);
|
|
}
|
|
8000486: bf00 nop
|
|
8000488: 3708 adds r7, #8
|
|
800048a: 46bd mov sp, r7
|
|
800048c: e8bd 4080 ldmia.w sp!, {r7, lr}
|
|
8000490: b004 add sp, #16
|
|
8000492: 4770 bx lr
|
|
8000494: 240000cc .word 0x240000cc
|
|
8000498: 080115a4 .word 0x080115a4
|
|
800049c: 080115ac .word 0x080115ac
|
|
|
|
080004a0 <LOG_TRACE>:
|
|
extern void LOG_TRACE(const char *message) {
|
|
80004a0: b580 push {r7, lr}
|
|
80004a2: b082 sub sp, #8
|
|
80004a4: af00 add r7, sp, #0
|
|
80004a6: 6078 str r0, [r7, #4]
|
|
printf("TRACE: %s \r\n", message);
|
|
80004a8: 6879 ldr r1, [r7, #4]
|
|
80004aa: 4803 ldr r0, [pc, #12] ; (80004b8 <LOG_TRACE+0x18>)
|
|
80004ac: f010 fb8c bl 8010bc8 <iprintf>
|
|
}
|
|
80004b0: bf00 nop
|
|
80004b2: 3708 adds r7, #8
|
|
80004b4: 46bd mov sp, r7
|
|
80004b6: bd80 pop {r7, pc}
|
|
80004b8: 080115b0 .word 0x080115b0
|
|
|
|
080004bc <data_source>:
|
|
LOG_ERROR("lwftp_retrieve failed (%d)", error);
|
|
}
|
|
// FTP session will continue with RETR and sink callbacks
|
|
}
|
|
|
|
static uint data_source(void *arg, const char **pptr, uint maxlen) {
|
|
80004bc: b480 push {r7}
|
|
80004be: b087 sub sp, #28
|
|
80004c0: af00 add r7, sp, #0
|
|
80004c2: 60f8 str r0, [r7, #12]
|
|
80004c4: 60b9 str r1, [r7, #8]
|
|
80004c6: 607a str r2, [r7, #4]
|
|
static const uint mylen = 12345;
|
|
static const char *const mydata = (char*) 0x20000000;
|
|
static uint offset = 0;
|
|
uint len = 0;
|
|
80004c8: 2300 movs r3, #0
|
|
80004ca: 617b str r3, [r7, #20]
|
|
|
|
// Check for data request or data sent notice
|
|
if (pptr) {
|
|
80004cc: 68bb ldr r3, [r7, #8]
|
|
80004ce: 2b00 cmp r3, #0
|
|
80004d0: d013 beq.n 80004fa <data_source+0x3e>
|
|
len = mylen - offset;
|
|
80004d2: 4b15 ldr r3, [pc, #84] ; (8000528 <data_source+0x6c>)
|
|
80004d4: 681a ldr r2, [r3, #0]
|
|
80004d6: 4b15 ldr r3, [pc, #84] ; (800052c <data_source+0x70>)
|
|
80004d8: 681b ldr r3, [r3, #0]
|
|
80004da: 1ad3 subs r3, r2, r3
|
|
80004dc: 617b str r3, [r7, #20]
|
|
if (len > maxlen)
|
|
80004de: 697a ldr r2, [r7, #20]
|
|
80004e0: 687b ldr r3, [r7, #4]
|
|
80004e2: 429a cmp r2, r3
|
|
80004e4: d901 bls.n 80004ea <data_source+0x2e>
|
|
len = maxlen;
|
|
80004e6: 687b ldr r3, [r7, #4]
|
|
80004e8: 617b str r3, [r7, #20]
|
|
*pptr = mydata + offset;
|
|
80004ea: 4b11 ldr r3, [pc, #68] ; (8000530 <data_source+0x74>)
|
|
80004ec: 681a ldr r2, [r3, #0]
|
|
80004ee: 4b0f ldr r3, [pc, #60] ; (800052c <data_source+0x70>)
|
|
80004f0: 681b ldr r3, [r3, #0]
|
|
80004f2: 441a add r2, r3
|
|
80004f4: 68bb ldr r3, [r7, #8]
|
|
80004f6: 601a str r2, [r3, #0]
|
|
80004f8: e00f b.n 800051a <data_source+0x5e>
|
|
} else {
|
|
offset += maxlen;
|
|
80004fa: 4b0c ldr r3, [pc, #48] ; (800052c <data_source+0x70>)
|
|
80004fc: 681a ldr r2, [r3, #0]
|
|
80004fe: 687b ldr r3, [r7, #4]
|
|
8000500: 4413 add r3, r2
|
|
8000502: 4a0a ldr r2, [pc, #40] ; (800052c <data_source+0x70>)
|
|
8000504: 6013 str r3, [r2, #0]
|
|
if (offset > mylen)
|
|
8000506: 4b09 ldr r3, [pc, #36] ; (800052c <data_source+0x70>)
|
|
8000508: 681a ldr r2, [r3, #0]
|
|
800050a: 4b07 ldr r3, [pc, #28] ; (8000528 <data_source+0x6c>)
|
|
800050c: 681b ldr r3, [r3, #0]
|
|
800050e: 429a cmp r2, r3
|
|
8000510: d903 bls.n 800051a <data_source+0x5e>
|
|
offset = mylen;
|
|
8000512: 4b05 ldr r3, [pc, #20] ; (8000528 <data_source+0x6c>)
|
|
8000514: 681b ldr r3, [r3, #0]
|
|
8000516: 4a05 ldr r2, [pc, #20] ; (800052c <data_source+0x70>)
|
|
8000518: 6013 str r3, [r2, #0]
|
|
}
|
|
return len;
|
|
800051a: 697b ldr r3, [r7, #20]
|
|
}
|
|
800051c: 4618 mov r0, r3
|
|
800051e: 371c adds r7, #28
|
|
8000520: 46bd mov sp, r7
|
|
8000522: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000526: 4770 bx lr
|
|
8000528: 08014c78 .word 0x08014c78
|
|
800052c: 240000ec .word 0x240000ec
|
|
8000530: 08014c7c .word 0x08014c7c
|
|
|
|
08000534 <ftp_connect_callback>:
|
|
|
|
static void ftp_connect_callback(void *arg, int result) {
|
|
8000534: b580 push {r7, lr}
|
|
8000536: b084 sub sp, #16
|
|
8000538: af00 add r7, sp, #0
|
|
800053a: 6078 str r0, [r7, #4]
|
|
800053c: 6039 str r1, [r7, #0]
|
|
lwftp_session_t *s = (lwftp_session_t*) arg;
|
|
800053e: 687b ldr r3, [r7, #4]
|
|
8000540: 60fb str r3, [r7, #12]
|
|
err_t error;
|
|
if (result == LWFTP_RESULT_LOGGED) {
|
|
8000542: 683b ldr r3, [r7, #0]
|
|
8000544: 2b02 cmp r3, #2
|
|
8000546: d103 bne.n 8000550 <ftp_connect_callback+0x1c>
|
|
LOG_TRACE("login success !!!!! \r\n");
|
|
8000548: 4806 ldr r0, [pc, #24] ; (8000564 <ftp_connect_callback+0x30>)
|
|
800054a: f7ff ffa9 bl 80004a0 <LOG_TRACE>
|
|
800054e: e002 b.n 8000556 <ftp_connect_callback+0x22>
|
|
} else {
|
|
LOG_TRACE("login failed !!!!! \r\n");
|
|
8000550: 4805 ldr r0, [pc, #20] ; (8000568 <ftp_connect_callback+0x34>)
|
|
8000552: f7ff ffa5 bl 80004a0 <LOG_TRACE>
|
|
// return lwftp_close(s);
|
|
// }
|
|
|
|
return
|
|
// Continue with STOR request
|
|
s->data_source = data_source;
|
|
8000556: 68fb ldr r3, [r7, #12]
|
|
8000558: 4a04 ldr r2, [pc, #16] ; (800056c <ftp_connect_callback+0x38>)
|
|
800055a: 619a str r2, [r3, #24]
|
|
error = lwftp_store(s);
|
|
if (error != LWFTP_RESULT_INPROGRESS) {
|
|
LOG_ERROR("lwftp_store failed (%d)", error);
|
|
}
|
|
// FTP session will continue with STOR and source callbacks
|
|
}
|
|
800055c: 3710 adds r7, #16
|
|
800055e: 46bd mov sp, r7
|
|
8000560: bd80 pop {r7, pc}
|
|
8000562: bf00 nop
|
|
8000564: 08011610 .word 0x08011610
|
|
8000568: 08011628 .word 0x08011628
|
|
800056c: 080004bd .word 0x080004bd
|
|
|
|
08000570 <ftp_test>:
|
|
|
|
static void ftp_test(void) {
|
|
8000570: b580 push {r7, lr}
|
|
8000572: b082 sub sp, #8
|
|
8000574: af00 add r7, sp, #0
|
|
static lwftp_session_t s; // static content for the whole FTP session
|
|
err_t error;
|
|
|
|
// Initialize session data
|
|
memset(&s, 0, sizeof(s));
|
|
8000576: 2234 movs r2, #52 ; 0x34
|
|
8000578: 2100 movs r1, #0
|
|
800057a: 4814 ldr r0, [pc, #80] ; (80005cc <ftp_test+0x5c>)
|
|
800057c: f010 fc82 bl 8010e84 <memset>
|
|
|
|
IP4_ADDR(&s.server_ip, 192, 168, 0, 100);
|
|
8000580: 4b12 ldr r3, [pc, #72] ; (80005cc <ftp_test+0x5c>)
|
|
8000582: 4a13 ldr r2, [pc, #76] ; (80005d0 <ftp_test+0x60>)
|
|
8000584: 601a str r2, [r3, #0]
|
|
s.server_port = 21;
|
|
8000586: 4b11 ldr r3, [pc, #68] ; (80005cc <ftp_test+0x5c>)
|
|
8000588: 2215 movs r2, #21
|
|
800058a: 809a strh r2, [r3, #4]
|
|
s.done_fn = ftp_connect_callback;
|
|
800058c: 4b0f ldr r3, [pc, #60] ; (80005cc <ftp_test+0x5c>)
|
|
800058e: 4a11 ldr r2, [pc, #68] ; (80005d4 <ftp_test+0x64>)
|
|
8000590: 621a str r2, [r3, #32]
|
|
s.user = "anonymous"; // Anonymous client
|
|
8000592: 4b0e ldr r3, [pc, #56] ; (80005cc <ftp_test+0x5c>)
|
|
8000594: 4a10 ldr r2, [pc, #64] ; (80005d8 <ftp_test+0x68>)
|
|
8000596: 60da str r2, [r3, #12]
|
|
s.pass = "space2lim@naver.com";
|
|
8000598: 4b0c ldr r3, [pc, #48] ; (80005cc <ftp_test+0x5c>)
|
|
800059a: 4a10 ldr r2, [pc, #64] ; (80005dc <ftp_test+0x6c>)
|
|
800059c: 611a str r2, [r3, #16]
|
|
// We have no extra user data, simply use the session structure
|
|
s.handle = &s;
|
|
800059e: 4b0b ldr r3, [pc, #44] ; (80005cc <ftp_test+0x5c>)
|
|
80005a0: 4a0a ldr r2, [pc, #40] ; (80005cc <ftp_test+0x5c>)
|
|
80005a2: 615a str r2, [r3, #20]
|
|
|
|
// Start the connection state machine
|
|
error = lwftp_connect(&s);
|
|
80005a4: 4809 ldr r0, [pc, #36] ; (80005cc <ftp_test+0x5c>)
|
|
80005a6: f004 fa09 bl 80049bc <lwftp_connect>
|
|
80005aa: 4603 mov r3, r0
|
|
80005ac: 71fb strb r3, [r7, #7]
|
|
if (error != LWFTP_RESULT_INPROGRESS) {
|
|
80005ae: f997 3007 ldrsb.w r3, [r7, #7]
|
|
80005b2: 2b01 cmp r3, #1
|
|
80005b4: d005 beq.n 80005c2 <ftp_test+0x52>
|
|
LOG_ERROR("lwftp_connect failed (%d)", error);
|
|
80005b6: f997 3007 ldrsb.w r3, [r7, #7]
|
|
80005ba: 4619 mov r1, r3
|
|
80005bc: 4808 ldr r0, [pc, #32] ; (80005e0 <ftp_test+0x70>)
|
|
80005be: f7ff ff43 bl 8000448 <LOG_ERROR>
|
|
}
|
|
// FTP session will continue with the connection callback
|
|
}
|
|
80005c2: bf00 nop
|
|
80005c4: 3708 adds r7, #8
|
|
80005c6: 46bd mov sp, r7
|
|
80005c8: bd80 pop {r7, pc}
|
|
80005ca: bf00 nop
|
|
80005cc: 240000f0 .word 0x240000f0
|
|
80005d0: 6400a8c0 .word 0x6400a8c0
|
|
80005d4: 08000535 .word 0x08000535
|
|
80005d8: 08011640 .word 0x08011640
|
|
80005dc: 0801164c .word 0x0801164c
|
|
80005e0: 08011660 .word 0x08011660
|
|
|
|
080005e4 <main>:
|
|
|
|
/**
|
|
* @brief The application entry point.
|
|
* @retval int
|
|
*/
|
|
int main(void) {
|
|
80005e4: b580 push {r7, lr}
|
|
80005e6: b084 sub sp, #16
|
|
80005e8: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN 1 */
|
|
|
|
/* USER CODE END 1 */
|
|
|
|
/* MPU Configuration--------------------------------------------------------*/
|
|
MPU_Config();
|
|
80005ea: f000 f929 bl 8000840 <MPU_Config>
|
|
if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */
|
|
80005ee: 4b38 ldr r3, [pc, #224] ; (80006d0 <main+0xec>)
|
|
80005f0: 695b ldr r3, [r3, #20]
|
|
80005f2: f403 3300 and.w r3, r3, #131072 ; 0x20000
|
|
80005f6: 2b00 cmp r3, #0
|
|
80005f8: d11b bne.n 8000632 <main+0x4e>
|
|
\details Acts as a special kind of Data Memory Barrier.
|
|
It completes when all explicit memory accesses before this instruction complete.
|
|
*/
|
|
__STATIC_FORCEINLINE void __DSB(void)
|
|
{
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
80005fa: f3bf 8f4f dsb sy
|
|
}
|
|
80005fe: bf00 nop
|
|
__ASM volatile ("isb 0xF":::"memory");
|
|
8000600: f3bf 8f6f isb sy
|
|
}
|
|
8000604: bf00 nop
|
|
SCB->ICIALLU = 0UL; /* invalidate I-Cache */
|
|
8000606: 4b32 ldr r3, [pc, #200] ; (80006d0 <main+0xec>)
|
|
8000608: 2200 movs r2, #0
|
|
800060a: f8c3 2250 str.w r2, [r3, #592] ; 0x250
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
800060e: f3bf 8f4f dsb sy
|
|
}
|
|
8000612: bf00 nop
|
|
__ASM volatile ("isb 0xF":::"memory");
|
|
8000614: f3bf 8f6f isb sy
|
|
}
|
|
8000618: bf00 nop
|
|
SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */
|
|
800061a: 4b2d ldr r3, [pc, #180] ; (80006d0 <main+0xec>)
|
|
800061c: 695b ldr r3, [r3, #20]
|
|
800061e: 4a2c ldr r2, [pc, #176] ; (80006d0 <main+0xec>)
|
|
8000620: f443 3300 orr.w r3, r3, #131072 ; 0x20000
|
|
8000624: 6153 str r3, [r2, #20]
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
8000626: f3bf 8f4f dsb sy
|
|
}
|
|
800062a: bf00 nop
|
|
__ASM volatile ("isb 0xF":::"memory");
|
|
800062c: f3bf 8f6f isb sy
|
|
}
|
|
8000630: e000 b.n 8000634 <main+0x50>
|
|
if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */
|
|
8000632: bf00 nop
|
|
if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */
|
|
8000634: 4b26 ldr r3, [pc, #152] ; (80006d0 <main+0xec>)
|
|
8000636: 695b ldr r3, [r3, #20]
|
|
8000638: f403 3380 and.w r3, r3, #65536 ; 0x10000
|
|
800063c: 2b00 cmp r3, #0
|
|
800063e: d138 bne.n 80006b2 <main+0xce>
|
|
SCB->CSSELR = 0U; /* select Level 1 data cache */
|
|
8000640: 4b23 ldr r3, [pc, #140] ; (80006d0 <main+0xec>)
|
|
8000642: 2200 movs r2, #0
|
|
8000644: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
8000648: f3bf 8f4f dsb sy
|
|
}
|
|
800064c: bf00 nop
|
|
ccsidr = SCB->CCSIDR;
|
|
800064e: 4b20 ldr r3, [pc, #128] ; (80006d0 <main+0xec>)
|
|
8000650: f8d3 3080 ldr.w r3, [r3, #128] ; 0x80
|
|
8000654: 60fb str r3, [r7, #12]
|
|
sets = (uint32_t)(CCSIDR_SETS(ccsidr));
|
|
8000656: 68fb ldr r3, [r7, #12]
|
|
8000658: 0b5b lsrs r3, r3, #13
|
|
800065a: f3c3 030e ubfx r3, r3, #0, #15
|
|
800065e: 60bb str r3, [r7, #8]
|
|
ways = (uint32_t)(CCSIDR_WAYS(ccsidr));
|
|
8000660: 68fb ldr r3, [r7, #12]
|
|
8000662: 08db lsrs r3, r3, #3
|
|
8000664: f3c3 0309 ubfx r3, r3, #0, #10
|
|
8000668: 607b str r3, [r7, #4]
|
|
SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) |
|
|
800066a: 68bb ldr r3, [r7, #8]
|
|
800066c: 015a lsls r2, r3, #5
|
|
800066e: f643 73e0 movw r3, #16352 ; 0x3fe0
|
|
8000672: 4013 ands r3, r2
|
|
((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) );
|
|
8000674: 687a ldr r2, [r7, #4]
|
|
8000676: 0792 lsls r2, r2, #30
|
|
SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) |
|
|
8000678: 4915 ldr r1, [pc, #84] ; (80006d0 <main+0xec>)
|
|
800067a: 4313 orrs r3, r2
|
|
800067c: f8c1 3260 str.w r3, [r1, #608] ; 0x260
|
|
} while (ways-- != 0U);
|
|
8000680: 687b ldr r3, [r7, #4]
|
|
8000682: 1e5a subs r2, r3, #1
|
|
8000684: 607a str r2, [r7, #4]
|
|
8000686: 2b00 cmp r3, #0
|
|
8000688: d1ef bne.n 800066a <main+0x86>
|
|
} while(sets-- != 0U);
|
|
800068a: 68bb ldr r3, [r7, #8]
|
|
800068c: 1e5a subs r2, r3, #1
|
|
800068e: 60ba str r2, [r7, #8]
|
|
8000690: 2b00 cmp r3, #0
|
|
8000692: d1e5 bne.n 8000660 <main+0x7c>
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
8000694: f3bf 8f4f dsb sy
|
|
}
|
|
8000698: bf00 nop
|
|
SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */
|
|
800069a: 4b0d ldr r3, [pc, #52] ; (80006d0 <main+0xec>)
|
|
800069c: 695b ldr r3, [r3, #20]
|
|
800069e: 4a0c ldr r2, [pc, #48] ; (80006d0 <main+0xec>)
|
|
80006a0: f443 3380 orr.w r3, r3, #65536 ; 0x10000
|
|
80006a4: 6153 str r3, [r2, #20]
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
80006a6: f3bf 8f4f dsb sy
|
|
}
|
|
80006aa: bf00 nop
|
|
__ASM volatile ("isb 0xF":::"memory");
|
|
80006ac: f3bf 8f6f isb sy
|
|
}
|
|
80006b0: e000 b.n 80006b4 <main+0xd0>
|
|
if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */
|
|
80006b2: bf00 nop
|
|
SCB_EnableDCache();
|
|
|
|
/* MCU Configuration--------------------------------------------------------*/
|
|
|
|
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
|
|
HAL_Init();
|
|
80006b4: f000 fc24 bl 8000f00 <HAL_Init>
|
|
/* USER CODE BEGIN Init */
|
|
|
|
/* USER CODE END Init */
|
|
|
|
/* Configure the system clock */
|
|
SystemClock_Config();
|
|
80006b8: f000 f80c bl 80006d4 <SystemClock_Config>
|
|
/* USER CODE BEGIN SysInit */
|
|
|
|
/* USER CODE END SysInit */
|
|
|
|
/* Initialize all configured peripherals */
|
|
MX_GPIO_Init();
|
|
80006bc: f000 f878 bl 80007b0 <MX_GPIO_Init>
|
|
MX_LWIP_Init();
|
|
80006c0: f004 fa04 bl 8004acc <MX_LWIP_Init>
|
|
|
|
/* Infinite loop */
|
|
/* USER CODE BEGIN WHILE */
|
|
|
|
/* ============ LWFTP Code ============*/
|
|
ftp_test();
|
|
80006c4: f7ff ff54 bl 8000570 <ftp_test>
|
|
// ftp_connect();
|
|
|
|
while (1) {
|
|
MX_LWIP_Process();
|
|
80006c8: f004 fb40 bl 8004d4c <MX_LWIP_Process>
|
|
80006cc: e7fc b.n 80006c8 <main+0xe4>
|
|
80006ce: bf00 nop
|
|
80006d0: e000ed00 .word 0xe000ed00
|
|
|
|
080006d4 <SystemClock_Config>:
|
|
|
|
/**
|
|
* @brief System Clock Configuration
|
|
* @retval None
|
|
*/
|
|
void SystemClock_Config(void) {
|
|
80006d4: b580 push {r7, lr}
|
|
80006d6: b09c sub sp, #112 ; 0x70
|
|
80006d8: af00 add r7, sp, #0
|
|
RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
|
|
80006da: f107 0324 add.w r3, r7, #36 ; 0x24
|
|
80006de: 224c movs r2, #76 ; 0x4c
|
|
80006e0: 2100 movs r1, #0
|
|
80006e2: 4618 mov r0, r3
|
|
80006e4: f010 fbce bl 8010e84 <memset>
|
|
RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
|
|
80006e8: 1d3b adds r3, r7, #4
|
|
80006ea: 2220 movs r2, #32
|
|
80006ec: 2100 movs r1, #0
|
|
80006ee: 4618 mov r0, r3
|
|
80006f0: f010 fbc8 bl 8010e84 <memset>
|
|
|
|
/** Supply configuration update enable
|
|
*/
|
|
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
|
|
80006f4: 2002 movs r0, #2
|
|
80006f6: f002 fce9 bl 80030cc <HAL_PWREx_ConfigSupply>
|
|
|
|
/** Configure the main internal regulator output voltage
|
|
*/
|
|
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
|
|
80006fa: 2300 movs r3, #0
|
|
80006fc: 603b str r3, [r7, #0]
|
|
80006fe: 4b2b ldr r3, [pc, #172] ; (80007ac <SystemClock_Config+0xd8>)
|
|
8000700: 699b ldr r3, [r3, #24]
|
|
8000702: 4a2a ldr r2, [pc, #168] ; (80007ac <SystemClock_Config+0xd8>)
|
|
8000704: f423 4340 bic.w r3, r3, #49152 ; 0xc000
|
|
8000708: 6193 str r3, [r2, #24]
|
|
800070a: 4b28 ldr r3, [pc, #160] ; (80007ac <SystemClock_Config+0xd8>)
|
|
800070c: 699b ldr r3, [r3, #24]
|
|
800070e: f403 4340 and.w r3, r3, #49152 ; 0xc000
|
|
8000712: 603b str r3, [r7, #0]
|
|
8000714: 683b ldr r3, [r7, #0]
|
|
|
|
while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {
|
|
8000716: bf00 nop
|
|
8000718: 4b24 ldr r3, [pc, #144] ; (80007ac <SystemClock_Config+0xd8>)
|
|
800071a: 699b ldr r3, [r3, #24]
|
|
800071c: f403 5300 and.w r3, r3, #8192 ; 0x2000
|
|
8000720: f5b3 5f00 cmp.w r3, #8192 ; 0x2000
|
|
8000724: d1f8 bne.n 8000718 <SystemClock_Config+0x44>
|
|
}
|
|
|
|
/** Initializes the RCC Oscillators according to the specified parameters
|
|
* in the RCC_OscInitTypeDef structure.
|
|
*/
|
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
|
8000726: 2301 movs r3, #1
|
|
8000728: 627b str r3, [r7, #36] ; 0x24
|
|
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
|
800072a: f44f 3380 mov.w r3, #65536 ; 0x10000
|
|
800072e: 62bb str r3, [r7, #40] ; 0x28
|
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
|
8000730: 2302 movs r3, #2
|
|
8000732: 64bb str r3, [r7, #72] ; 0x48
|
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
|
8000734: 2302 movs r3, #2
|
|
8000736: 64fb str r3, [r7, #76] ; 0x4c
|
|
RCC_OscInitStruct.PLL.PLLM = 5;
|
|
8000738: 2305 movs r3, #5
|
|
800073a: 653b str r3, [r7, #80] ; 0x50
|
|
RCC_OscInitStruct.PLL.PLLN = 96;
|
|
800073c: 2360 movs r3, #96 ; 0x60
|
|
800073e: 657b str r3, [r7, #84] ; 0x54
|
|
RCC_OscInitStruct.PLL.PLLP = 1;
|
|
8000740: 2301 movs r3, #1
|
|
8000742: 65bb str r3, [r7, #88] ; 0x58
|
|
RCC_OscInitStruct.PLL.PLLQ = 2;
|
|
8000744: 2302 movs r3, #2
|
|
8000746: 65fb str r3, [r7, #92] ; 0x5c
|
|
RCC_OscInitStruct.PLL.PLLR = 2;
|
|
8000748: 2302 movs r3, #2
|
|
800074a: 663b str r3, [r7, #96] ; 0x60
|
|
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
|
|
800074c: 2308 movs r3, #8
|
|
800074e: 667b str r3, [r7, #100] ; 0x64
|
|
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
|
|
8000750: 2300 movs r3, #0
|
|
8000752: 66bb str r3, [r7, #104] ; 0x68
|
|
RCC_OscInitStruct.PLL.PLLFRACN = 0;
|
|
8000754: 2300 movs r3, #0
|
|
8000756: 66fb str r3, [r7, #108] ; 0x6c
|
|
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
|
|
8000758: f107 0324 add.w r3, r7, #36 ; 0x24
|
|
800075c: 4618 mov r0, r3
|
|
800075e: f002 fcef bl 8003140 <HAL_RCC_OscConfig>
|
|
8000762: 4603 mov r3, r0
|
|
8000764: 2b00 cmp r3, #0
|
|
8000766: d001 beq.n 800076c <SystemClock_Config+0x98>
|
|
Error_Handler();
|
|
8000768: f000 f8b7 bl 80008da <Error_Handler>
|
|
}
|
|
|
|
/** Initializes the CPU, AHB and APB buses clocks
|
|
*/
|
|
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
|
|
800076c: 233f movs r3, #63 ; 0x3f
|
|
800076e: 607b str r3, [r7, #4]
|
|
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1
|
|
| RCC_CLOCKTYPE_D1PCLK1;
|
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
|
8000770: 2303 movs r3, #3
|
|
8000772: 60bb str r3, [r7, #8]
|
|
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
|
|
8000774: 2300 movs r3, #0
|
|
8000776: 60fb str r3, [r7, #12]
|
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
|
|
8000778: 2308 movs r3, #8
|
|
800077a: 613b str r3, [r7, #16]
|
|
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
|
|
800077c: 2340 movs r3, #64 ; 0x40
|
|
800077e: 617b str r3, [r7, #20]
|
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
|
|
8000780: 2340 movs r3, #64 ; 0x40
|
|
8000782: 61bb str r3, [r7, #24]
|
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
|
|
8000784: f44f 6380 mov.w r3, #1024 ; 0x400
|
|
8000788: 61fb str r3, [r7, #28]
|
|
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
|
|
800078a: 2340 movs r3, #64 ; 0x40
|
|
800078c: 623b str r3, [r7, #32]
|
|
|
|
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) {
|
|
800078e: 1d3b adds r3, r7, #4
|
|
8000790: 2103 movs r1, #3
|
|
8000792: 4618 mov r0, r3
|
|
8000794: f003 f8ae bl 80038f4 <HAL_RCC_ClockConfig>
|
|
8000798: 4603 mov r3, r0
|
|
800079a: 2b00 cmp r3, #0
|
|
800079c: d001 beq.n 80007a2 <SystemClock_Config+0xce>
|
|
Error_Handler();
|
|
800079e: f000 f89c bl 80008da <Error_Handler>
|
|
}
|
|
}
|
|
80007a2: bf00 nop
|
|
80007a4: 3770 adds r7, #112 ; 0x70
|
|
80007a6: 46bd mov sp, r7
|
|
80007a8: bd80 pop {r7, pc}
|
|
80007aa: bf00 nop
|
|
80007ac: 58024800 .word 0x58024800
|
|
|
|
080007b0 <MX_GPIO_Init>:
|
|
/**
|
|
* @brief GPIO Initialization Function
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
static void MX_GPIO_Init(void) {
|
|
80007b0: b480 push {r7}
|
|
80007b2: b085 sub sp, #20
|
|
80007b4: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN MX_GPIO_Init_1 */
|
|
/* USER CODE END MX_GPIO_Init_1 */
|
|
|
|
/* GPIO Ports Clock Enable */
|
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
|
80007b6: 4b21 ldr r3, [pc, #132] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
80007b8: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
80007bc: 4a1f ldr r2, [pc, #124] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
80007be: f043 0302 orr.w r3, r3, #2
|
|
80007c2: f8c2 30e0 str.w r3, [r2, #224] ; 0xe0
|
|
80007c6: 4b1d ldr r3, [pc, #116] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
80007c8: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
80007cc: f003 0302 and.w r3, r3, #2
|
|
80007d0: 60fb str r3, [r7, #12]
|
|
80007d2: 68fb ldr r3, [r7, #12]
|
|
__HAL_RCC_GPIOA_CLK_ENABLE();
|
|
80007d4: 4b19 ldr r3, [pc, #100] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
80007d6: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
80007da: 4a18 ldr r2, [pc, #96] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
80007dc: f043 0301 orr.w r3, r3, #1
|
|
80007e0: f8c2 30e0 str.w r3, [r2, #224] ; 0xe0
|
|
80007e4: 4b15 ldr r3, [pc, #84] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
80007e6: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
80007ea: f003 0301 and.w r3, r3, #1
|
|
80007ee: 60bb str r3, [r7, #8]
|
|
80007f0: 68bb ldr r3, [r7, #8]
|
|
__HAL_RCC_GPIOH_CLK_ENABLE();
|
|
80007f2: 4b12 ldr r3, [pc, #72] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
80007f4: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
80007f8: 4a10 ldr r2, [pc, #64] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
80007fa: f043 0380 orr.w r3, r3, #128 ; 0x80
|
|
80007fe: f8c2 30e0 str.w r3, [r2, #224] ; 0xe0
|
|
8000802: 4b0e ldr r3, [pc, #56] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
8000804: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
8000808: f003 0380 and.w r3, r3, #128 ; 0x80
|
|
800080c: 607b str r3, [r7, #4]
|
|
800080e: 687b ldr r3, [r7, #4]
|
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
|
8000810: 4b0a ldr r3, [pc, #40] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
8000812: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
8000816: 4a09 ldr r2, [pc, #36] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
8000818: f043 0304 orr.w r3, r3, #4
|
|
800081c: f8c2 30e0 str.w r3, [r2, #224] ; 0xe0
|
|
8000820: 4b06 ldr r3, [pc, #24] ; (800083c <MX_GPIO_Init+0x8c>)
|
|
8000822: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
8000826: f003 0304 and.w r3, r3, #4
|
|
800082a: 603b str r3, [r7, #0]
|
|
800082c: 683b ldr r3, [r7, #0]
|
|
|
|
/* USER CODE BEGIN MX_GPIO_Init_2 */
|
|
/* USER CODE END MX_GPIO_Init_2 */
|
|
}
|
|
800082e: bf00 nop
|
|
8000830: 3714 adds r7, #20
|
|
8000832: 46bd mov sp, r7
|
|
8000834: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000838: 4770 bx lr
|
|
800083a: bf00 nop
|
|
800083c: 58024400 .word 0x58024400
|
|
|
|
08000840 <MPU_Config>:
|
|
|
|
/* USER CODE END 4 */
|
|
|
|
/* MPU Configuration */
|
|
|
|
void MPU_Config(void) {
|
|
8000840: b580 push {r7, lr}
|
|
8000842: b084 sub sp, #16
|
|
8000844: af00 add r7, sp, #0
|
|
MPU_Region_InitTypeDef MPU_InitStruct = { 0 };
|
|
8000846: 463b mov r3, r7
|
|
8000848: 2200 movs r2, #0
|
|
800084a: 601a str r2, [r3, #0]
|
|
800084c: 605a str r2, [r3, #4]
|
|
800084e: 609a str r2, [r3, #8]
|
|
8000850: 60da str r2, [r3, #12]
|
|
|
|
/* Disables the MPU */
|
|
HAL_MPU_Disable();
|
|
8000852: f000 fd0b bl 800126c <HAL_MPU_Disable>
|
|
|
|
/** Initializes and configures the Region and the memory to be protected
|
|
*/
|
|
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
|
|
8000856: 2301 movs r3, #1
|
|
8000858: 703b strb r3, [r7, #0]
|
|
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
|
|
800085a: 2300 movs r3, #0
|
|
800085c: 707b strb r3, [r7, #1]
|
|
MPU_InitStruct.BaseAddress = 0x0;
|
|
800085e: 2300 movs r3, #0
|
|
8000860: 607b str r3, [r7, #4]
|
|
MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
|
|
8000862: 231f movs r3, #31
|
|
8000864: 723b strb r3, [r7, #8]
|
|
MPU_InitStruct.SubRegionDisable = 0x87;
|
|
8000866: 2387 movs r3, #135 ; 0x87
|
|
8000868: 727b strb r3, [r7, #9]
|
|
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
|
|
800086a: 2300 movs r3, #0
|
|
800086c: 72bb strb r3, [r7, #10]
|
|
MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
|
|
800086e: 2300 movs r3, #0
|
|
8000870: 72fb strb r3, [r7, #11]
|
|
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
|
|
8000872: 2301 movs r3, #1
|
|
8000874: 733b strb r3, [r7, #12]
|
|
MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
|
|
8000876: 2301 movs r3, #1
|
|
8000878: 737b strb r3, [r7, #13]
|
|
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
|
|
800087a: 2300 movs r3, #0
|
|
800087c: 73bb strb r3, [r7, #14]
|
|
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
|
|
800087e: 2300 movs r3, #0
|
|
8000880: 73fb strb r3, [r7, #15]
|
|
|
|
HAL_MPU_ConfigRegion(&MPU_InitStruct);
|
|
8000882: 463b mov r3, r7
|
|
8000884: 4618 mov r0, r3
|
|
8000886: f000 fd29 bl 80012dc <HAL_MPU_ConfigRegion>
|
|
|
|
/** Initializes and configures the Region and the memory to be protected
|
|
*/
|
|
MPU_InitStruct.Number = MPU_REGION_NUMBER1;
|
|
800088a: 2301 movs r3, #1
|
|
800088c: 707b strb r3, [r7, #1]
|
|
MPU_InitStruct.BaseAddress = 0x30000000;
|
|
800088e: f04f 5340 mov.w r3, #805306368 ; 0x30000000
|
|
8000892: 607b str r3, [r7, #4]
|
|
MPU_InitStruct.Size = MPU_REGION_SIZE_32KB;
|
|
8000894: 230e movs r3, #14
|
|
8000896: 723b strb r3, [r7, #8]
|
|
MPU_InitStruct.SubRegionDisable = 0x0;
|
|
8000898: 2300 movs r3, #0
|
|
800089a: 727b strb r3, [r7, #9]
|
|
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
|
|
800089c: 2301 movs r3, #1
|
|
800089e: 72bb strb r3, [r7, #10]
|
|
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
|
|
80008a0: 2303 movs r3, #3
|
|
80008a2: 72fb strb r3, [r7, #11]
|
|
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
|
|
80008a4: 2300 movs r3, #0
|
|
80008a6: 737b strb r3, [r7, #13]
|
|
|
|
HAL_MPU_ConfigRegion(&MPU_InitStruct);
|
|
80008a8: 463b mov r3, r7
|
|
80008aa: 4618 mov r0, r3
|
|
80008ac: f000 fd16 bl 80012dc <HAL_MPU_ConfigRegion>
|
|
|
|
/** Initializes and configures the Region and the memory to be protected
|
|
*/
|
|
MPU_InitStruct.Number = MPU_REGION_NUMBER2;
|
|
80008b0: 2302 movs r3, #2
|
|
80008b2: 707b strb r3, [r7, #1]
|
|
MPU_InitStruct.Size = MPU_REGION_SIZE_512B;
|
|
80008b4: 2308 movs r3, #8
|
|
80008b6: 723b strb r3, [r7, #8]
|
|
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
|
|
80008b8: 2300 movs r3, #0
|
|
80008ba: 72bb strb r3, [r7, #10]
|
|
MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
|
|
80008bc: 2301 movs r3, #1
|
|
80008be: 737b strb r3, [r7, #13]
|
|
MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
|
|
80008c0: 2301 movs r3, #1
|
|
80008c2: 73fb strb r3, [r7, #15]
|
|
|
|
HAL_MPU_ConfigRegion(&MPU_InitStruct);
|
|
80008c4: 463b mov r3, r7
|
|
80008c6: 4618 mov r0, r3
|
|
80008c8: f000 fd08 bl 80012dc <HAL_MPU_ConfigRegion>
|
|
/* Enables the MPU */
|
|
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
|
|
80008cc: 2004 movs r0, #4
|
|
80008ce: f000 fce5 bl 800129c <HAL_MPU_Enable>
|
|
|
|
}
|
|
80008d2: bf00 nop
|
|
80008d4: 3710 adds r7, #16
|
|
80008d6: 46bd mov sp, r7
|
|
80008d8: bd80 pop {r7, pc}
|
|
|
|
080008da <Error_Handler>:
|
|
|
|
/**
|
|
* @brief This function is executed in case of error occurrence.
|
|
* @retval None
|
|
*/
|
|
void Error_Handler(void) {
|
|
80008da: b480 push {r7}
|
|
80008dc: af00 add r7, sp, #0
|
|
__ASM volatile ("cpsid i" : : : "memory");
|
|
80008de: b672 cpsid i
|
|
}
|
|
80008e0: bf00 nop
|
|
/* USER CODE BEGIN Error_Handler_Debug */
|
|
/* User can add his own implementation to report the HAL error return state */
|
|
__disable_irq();
|
|
while (1) {
|
|
80008e2: e7fe b.n 80008e2 <Error_Handler+0x8>
|
|
|
|
080008e4 <HAL_MspInit>:
|
|
/* USER CODE END 0 */
|
|
/**
|
|
* Initializes the Global MSP.
|
|
*/
|
|
void HAL_MspInit(void)
|
|
{
|
|
80008e4: b480 push {r7}
|
|
80008e6: b083 sub sp, #12
|
|
80008e8: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN MspInit 0 */
|
|
|
|
/* USER CODE END MspInit 0 */
|
|
|
|
__HAL_RCC_SYSCFG_CLK_ENABLE();
|
|
80008ea: 4b0a ldr r3, [pc, #40] ; (8000914 <HAL_MspInit+0x30>)
|
|
80008ec: f8d3 30f4 ldr.w r3, [r3, #244] ; 0xf4
|
|
80008f0: 4a08 ldr r2, [pc, #32] ; (8000914 <HAL_MspInit+0x30>)
|
|
80008f2: f043 0302 orr.w r3, r3, #2
|
|
80008f6: f8c2 30f4 str.w r3, [r2, #244] ; 0xf4
|
|
80008fa: 4b06 ldr r3, [pc, #24] ; (8000914 <HAL_MspInit+0x30>)
|
|
80008fc: f8d3 30f4 ldr.w r3, [r3, #244] ; 0xf4
|
|
8000900: f003 0302 and.w r3, r3, #2
|
|
8000904: 607b str r3, [r7, #4]
|
|
8000906: 687b ldr r3, [r7, #4]
|
|
/* System interrupt init*/
|
|
|
|
/* USER CODE BEGIN MspInit 1 */
|
|
|
|
/* USER CODE END MspInit 1 */
|
|
}
|
|
8000908: bf00 nop
|
|
800090a: 370c adds r7, #12
|
|
800090c: 46bd mov sp, r7
|
|
800090e: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000912: 4770 bx lr
|
|
8000914: 58024400 .word 0x58024400
|
|
|
|
08000918 <NMI_Handler>:
|
|
/******************************************************************************/
|
|
/**
|
|
* @brief This function handles Non maskable interrupt.
|
|
*/
|
|
void NMI_Handler(void)
|
|
{
|
|
8000918: b480 push {r7}
|
|
800091a: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */
|
|
|
|
/* USER CODE END NonMaskableInt_IRQn 0 */
|
|
/* USER CODE BEGIN NonMaskableInt_IRQn 1 */
|
|
while (1)
|
|
800091c: e7fe b.n 800091c <NMI_Handler+0x4>
|
|
|
|
0800091e <HardFault_Handler>:
|
|
|
|
/**
|
|
* @brief This function handles Hard fault interrupt.
|
|
*/
|
|
void HardFault_Handler(void)
|
|
{
|
|
800091e: b480 push {r7}
|
|
8000920: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN HardFault_IRQn 0 */
|
|
|
|
/* USER CODE END HardFault_IRQn 0 */
|
|
while (1)
|
|
8000922: e7fe b.n 8000922 <HardFault_Handler+0x4>
|
|
|
|
08000924 <MemManage_Handler>:
|
|
|
|
/**
|
|
* @brief This function handles Memory management fault.
|
|
*/
|
|
void MemManage_Handler(void)
|
|
{
|
|
8000924: b480 push {r7}
|
|
8000926: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN MemoryManagement_IRQn 0 */
|
|
|
|
/* USER CODE END MemoryManagement_IRQn 0 */
|
|
while (1)
|
|
8000928: e7fe b.n 8000928 <MemManage_Handler+0x4>
|
|
|
|
0800092a <BusFault_Handler>:
|
|
|
|
/**
|
|
* @brief This function handles Pre-fetch fault, memory access fault.
|
|
*/
|
|
void BusFault_Handler(void)
|
|
{
|
|
800092a: b480 push {r7}
|
|
800092c: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN BusFault_IRQn 0 */
|
|
|
|
/* USER CODE END BusFault_IRQn 0 */
|
|
while (1)
|
|
800092e: e7fe b.n 800092e <BusFault_Handler+0x4>
|
|
|
|
08000930 <UsageFault_Handler>:
|
|
|
|
/**
|
|
* @brief This function handles Undefined instruction or illegal state.
|
|
*/
|
|
void UsageFault_Handler(void)
|
|
{
|
|
8000930: b480 push {r7}
|
|
8000932: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN UsageFault_IRQn 0 */
|
|
|
|
/* USER CODE END UsageFault_IRQn 0 */
|
|
while (1)
|
|
8000934: e7fe b.n 8000934 <UsageFault_Handler+0x4>
|
|
|
|
08000936 <SVC_Handler>:
|
|
|
|
/**
|
|
* @brief This function handles System service call via SWI instruction.
|
|
*/
|
|
void SVC_Handler(void)
|
|
{
|
|
8000936: b480 push {r7}
|
|
8000938: af00 add r7, sp, #0
|
|
|
|
/* USER CODE END SVCall_IRQn 0 */
|
|
/* USER CODE BEGIN SVCall_IRQn 1 */
|
|
|
|
/* USER CODE END SVCall_IRQn 1 */
|
|
}
|
|
800093a: bf00 nop
|
|
800093c: 46bd mov sp, r7
|
|
800093e: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000942: 4770 bx lr
|
|
|
|
08000944 <DebugMon_Handler>:
|
|
|
|
/**
|
|
* @brief This function handles Debug monitor.
|
|
*/
|
|
void DebugMon_Handler(void)
|
|
{
|
|
8000944: b480 push {r7}
|
|
8000946: af00 add r7, sp, #0
|
|
|
|
/* USER CODE END DebugMonitor_IRQn 0 */
|
|
/* USER CODE BEGIN DebugMonitor_IRQn 1 */
|
|
|
|
/* USER CODE END DebugMonitor_IRQn 1 */
|
|
}
|
|
8000948: bf00 nop
|
|
800094a: 46bd mov sp, r7
|
|
800094c: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000950: 4770 bx lr
|
|
|
|
08000952 <PendSV_Handler>:
|
|
|
|
/**
|
|
* @brief This function handles Pendable request for system service.
|
|
*/
|
|
void PendSV_Handler(void)
|
|
{
|
|
8000952: b480 push {r7}
|
|
8000954: af00 add r7, sp, #0
|
|
|
|
/* USER CODE END PendSV_IRQn 0 */
|
|
/* USER CODE BEGIN PendSV_IRQn 1 */
|
|
|
|
/* USER CODE END PendSV_IRQn 1 */
|
|
}
|
|
8000956: bf00 nop
|
|
8000958: 46bd mov sp, r7
|
|
800095a: f85d 7b04 ldr.w r7, [sp], #4
|
|
800095e: 4770 bx lr
|
|
|
|
08000960 <SysTick_Handler>:
|
|
|
|
/**
|
|
* @brief This function handles System tick timer.
|
|
*/
|
|
void SysTick_Handler(void)
|
|
{
|
|
8000960: b580 push {r7, lr}
|
|
8000962: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN SysTick_IRQn 0 */
|
|
|
|
/* USER CODE END SysTick_IRQn 0 */
|
|
HAL_IncTick();
|
|
8000964: f000 fb3e bl 8000fe4 <HAL_IncTick>
|
|
/* USER CODE BEGIN SysTick_IRQn 1 */
|
|
|
|
/* USER CODE END SysTick_IRQn 1 */
|
|
}
|
|
8000968: bf00 nop
|
|
800096a: bd80 pop {r7, pc}
|
|
|
|
0800096c <ETH_IRQHandler>:
|
|
|
|
/**
|
|
* @brief This function handles Ethernet global interrupt.
|
|
*/
|
|
void ETH_IRQHandler(void)
|
|
{
|
|
800096c: b580 push {r7, lr}
|
|
800096e: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN ETH_IRQn 0 */
|
|
|
|
/* USER CODE END ETH_IRQn 0 */
|
|
HAL_ETH_IRQHandler(&heth);
|
|
8000970: 4802 ldr r0, [pc, #8] ; (800097c <ETH_IRQHandler+0x10>)
|
|
8000972: f001 f855 bl 8001a20 <HAL_ETH_IRQHandler>
|
|
/* USER CODE BEGIN ETH_IRQn 1 */
|
|
|
|
/* USER CODE END ETH_IRQn 1 */
|
|
}
|
|
8000976: bf00 nop
|
|
8000978: bd80 pop {r7, pc}
|
|
800097a: bf00 nop
|
|
800097c: 24004b08 .word 0x24004b08
|
|
|
|
08000980 <_getpid>:
|
|
void initialise_monitor_handles()
|
|
{
|
|
}
|
|
|
|
int _getpid(void)
|
|
{
|
|
8000980: b480 push {r7}
|
|
8000982: af00 add r7, sp, #0
|
|
return 1;
|
|
8000984: 2301 movs r3, #1
|
|
}
|
|
8000986: 4618 mov r0, r3
|
|
8000988: 46bd mov sp, r7
|
|
800098a: f85d 7b04 ldr.w r7, [sp], #4
|
|
800098e: 4770 bx lr
|
|
|
|
08000990 <_kill>:
|
|
|
|
int _kill(int pid, int sig)
|
|
{
|
|
8000990: b480 push {r7}
|
|
8000992: b083 sub sp, #12
|
|
8000994: af00 add r7, sp, #0
|
|
8000996: 6078 str r0, [r7, #4]
|
|
8000998: 6039 str r1, [r7, #0]
|
|
(void)pid;
|
|
(void)sig;
|
|
errno = EINVAL;
|
|
800099a: 4b05 ldr r3, [pc, #20] ; (80009b0 <_kill+0x20>)
|
|
800099c: 2216 movs r2, #22
|
|
800099e: 601a str r2, [r3, #0]
|
|
return -1;
|
|
80009a0: f04f 33ff mov.w r3, #4294967295
|
|
}
|
|
80009a4: 4618 mov r0, r3
|
|
80009a6: 370c adds r7, #12
|
|
80009a8: 46bd mov sp, r7
|
|
80009aa: f85d 7b04 ldr.w r7, [sp], #4
|
|
80009ae: 4770 bx lr
|
|
80009b0: 24007e08 .word 0x24007e08
|
|
|
|
080009b4 <_exit>:
|
|
|
|
void _exit (int status)
|
|
{
|
|
80009b4: b580 push {r7, lr}
|
|
80009b6: b082 sub sp, #8
|
|
80009b8: af00 add r7, sp, #0
|
|
80009ba: 6078 str r0, [r7, #4]
|
|
_kill(status, -1);
|
|
80009bc: f04f 31ff mov.w r1, #4294967295
|
|
80009c0: 6878 ldr r0, [r7, #4]
|
|
80009c2: f7ff ffe5 bl 8000990 <_kill>
|
|
while (1) {} /* Make sure we hang here */
|
|
80009c6: e7fe b.n 80009c6 <_exit+0x12>
|
|
|
|
080009c8 <_read>:
|
|
}
|
|
|
|
__attribute__((weak)) int _read(int file, char *ptr, int len)
|
|
{
|
|
80009c8: b580 push {r7, lr}
|
|
80009ca: b086 sub sp, #24
|
|
80009cc: af00 add r7, sp, #0
|
|
80009ce: 60f8 str r0, [r7, #12]
|
|
80009d0: 60b9 str r1, [r7, #8]
|
|
80009d2: 607a str r2, [r7, #4]
|
|
(void)file;
|
|
int DataIdx;
|
|
|
|
for (DataIdx = 0; DataIdx < len; DataIdx++)
|
|
80009d4: 2300 movs r3, #0
|
|
80009d6: 617b str r3, [r7, #20]
|
|
80009d8: e00a b.n 80009f0 <_read+0x28>
|
|
{
|
|
*ptr++ = __io_getchar();
|
|
80009da: f3af 8000 nop.w
|
|
80009de: 4601 mov r1, r0
|
|
80009e0: 68bb ldr r3, [r7, #8]
|
|
80009e2: 1c5a adds r2, r3, #1
|
|
80009e4: 60ba str r2, [r7, #8]
|
|
80009e6: b2ca uxtb r2, r1
|
|
80009e8: 701a strb r2, [r3, #0]
|
|
for (DataIdx = 0; DataIdx < len; DataIdx++)
|
|
80009ea: 697b ldr r3, [r7, #20]
|
|
80009ec: 3301 adds r3, #1
|
|
80009ee: 617b str r3, [r7, #20]
|
|
80009f0: 697a ldr r2, [r7, #20]
|
|
80009f2: 687b ldr r3, [r7, #4]
|
|
80009f4: 429a cmp r2, r3
|
|
80009f6: dbf0 blt.n 80009da <_read+0x12>
|
|
}
|
|
|
|
return len;
|
|
80009f8: 687b ldr r3, [r7, #4]
|
|
}
|
|
80009fa: 4618 mov r0, r3
|
|
80009fc: 3718 adds r7, #24
|
|
80009fe: 46bd mov sp, r7
|
|
8000a00: bd80 pop {r7, pc}
|
|
|
|
08000a02 <_close>:
|
|
}
|
|
return len;
|
|
}
|
|
|
|
int _close(int file)
|
|
{
|
|
8000a02: b480 push {r7}
|
|
8000a04: b083 sub sp, #12
|
|
8000a06: af00 add r7, sp, #0
|
|
8000a08: 6078 str r0, [r7, #4]
|
|
(void)file;
|
|
return -1;
|
|
8000a0a: f04f 33ff mov.w r3, #4294967295
|
|
}
|
|
8000a0e: 4618 mov r0, r3
|
|
8000a10: 370c adds r7, #12
|
|
8000a12: 46bd mov sp, r7
|
|
8000a14: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000a18: 4770 bx lr
|
|
|
|
08000a1a <_fstat>:
|
|
|
|
|
|
int _fstat(int file, struct stat *st)
|
|
{
|
|
8000a1a: b480 push {r7}
|
|
8000a1c: b083 sub sp, #12
|
|
8000a1e: af00 add r7, sp, #0
|
|
8000a20: 6078 str r0, [r7, #4]
|
|
8000a22: 6039 str r1, [r7, #0]
|
|
(void)file;
|
|
st->st_mode = S_IFCHR;
|
|
8000a24: 683b ldr r3, [r7, #0]
|
|
8000a26: f44f 5200 mov.w r2, #8192 ; 0x2000
|
|
8000a2a: 605a str r2, [r3, #4]
|
|
return 0;
|
|
8000a2c: 2300 movs r3, #0
|
|
}
|
|
8000a2e: 4618 mov r0, r3
|
|
8000a30: 370c adds r7, #12
|
|
8000a32: 46bd mov sp, r7
|
|
8000a34: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000a38: 4770 bx lr
|
|
|
|
08000a3a <_isatty>:
|
|
|
|
int _isatty(int file)
|
|
{
|
|
8000a3a: b480 push {r7}
|
|
8000a3c: b083 sub sp, #12
|
|
8000a3e: af00 add r7, sp, #0
|
|
8000a40: 6078 str r0, [r7, #4]
|
|
(void)file;
|
|
return 1;
|
|
8000a42: 2301 movs r3, #1
|
|
}
|
|
8000a44: 4618 mov r0, r3
|
|
8000a46: 370c adds r7, #12
|
|
8000a48: 46bd mov sp, r7
|
|
8000a4a: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000a4e: 4770 bx lr
|
|
|
|
08000a50 <_lseek>:
|
|
|
|
int _lseek(int file, int ptr, int dir)
|
|
{
|
|
8000a50: b480 push {r7}
|
|
8000a52: b085 sub sp, #20
|
|
8000a54: af00 add r7, sp, #0
|
|
8000a56: 60f8 str r0, [r7, #12]
|
|
8000a58: 60b9 str r1, [r7, #8]
|
|
8000a5a: 607a str r2, [r7, #4]
|
|
(void)file;
|
|
(void)ptr;
|
|
(void)dir;
|
|
return 0;
|
|
8000a5c: 2300 movs r3, #0
|
|
}
|
|
8000a5e: 4618 mov r0, r3
|
|
8000a60: 3714 adds r7, #20
|
|
8000a62: 46bd mov sp, r7
|
|
8000a64: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000a68: 4770 bx lr
|
|
...
|
|
|
|
08000a6c <_sbrk>:
|
|
*
|
|
* @param incr Memory size
|
|
* @return Pointer to allocated memory
|
|
*/
|
|
void *_sbrk(ptrdiff_t incr)
|
|
{
|
|
8000a6c: b480 push {r7}
|
|
8000a6e: b087 sub sp, #28
|
|
8000a70: af00 add r7, sp, #0
|
|
8000a72: 6078 str r0, [r7, #4]
|
|
extern uint8_t _end; /* Symbol defined in the linker script */
|
|
extern uint8_t _estack; /* Symbol defined in the linker script */
|
|
extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */
|
|
const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size;
|
|
8000a74: 4a14 ldr r2, [pc, #80] ; (8000ac8 <_sbrk+0x5c>)
|
|
8000a76: 4b15 ldr r3, [pc, #84] ; (8000acc <_sbrk+0x60>)
|
|
8000a78: 1ad3 subs r3, r2, r3
|
|
8000a7a: 617b str r3, [r7, #20]
|
|
const uint8_t *max_heap = (uint8_t *)stack_limit;
|
|
8000a7c: 697b ldr r3, [r7, #20]
|
|
8000a7e: 613b str r3, [r7, #16]
|
|
uint8_t *prev_heap_end;
|
|
|
|
/* Initialize heap end at first call */
|
|
if (NULL == __sbrk_heap_end)
|
|
8000a80: 4b13 ldr r3, [pc, #76] ; (8000ad0 <_sbrk+0x64>)
|
|
8000a82: 681b ldr r3, [r3, #0]
|
|
8000a84: 2b00 cmp r3, #0
|
|
8000a86: d102 bne.n 8000a8e <_sbrk+0x22>
|
|
{
|
|
__sbrk_heap_end = &_end;
|
|
8000a88: 4b11 ldr r3, [pc, #68] ; (8000ad0 <_sbrk+0x64>)
|
|
8000a8a: 4a12 ldr r2, [pc, #72] ; (8000ad4 <_sbrk+0x68>)
|
|
8000a8c: 601a str r2, [r3, #0]
|
|
}
|
|
|
|
/* Protect heap from growing into the reserved MSP stack */
|
|
if (__sbrk_heap_end + incr > max_heap)
|
|
8000a8e: 4b10 ldr r3, [pc, #64] ; (8000ad0 <_sbrk+0x64>)
|
|
8000a90: 681a ldr r2, [r3, #0]
|
|
8000a92: 687b ldr r3, [r7, #4]
|
|
8000a94: 4413 add r3, r2
|
|
8000a96: 693a ldr r2, [r7, #16]
|
|
8000a98: 429a cmp r2, r3
|
|
8000a9a: d205 bcs.n 8000aa8 <_sbrk+0x3c>
|
|
{
|
|
errno = ENOMEM;
|
|
8000a9c: 4b0e ldr r3, [pc, #56] ; (8000ad8 <_sbrk+0x6c>)
|
|
8000a9e: 220c movs r2, #12
|
|
8000aa0: 601a str r2, [r3, #0]
|
|
return (void *)-1;
|
|
8000aa2: f04f 33ff mov.w r3, #4294967295
|
|
8000aa6: e009 b.n 8000abc <_sbrk+0x50>
|
|
}
|
|
|
|
prev_heap_end = __sbrk_heap_end;
|
|
8000aa8: 4b09 ldr r3, [pc, #36] ; (8000ad0 <_sbrk+0x64>)
|
|
8000aaa: 681b ldr r3, [r3, #0]
|
|
8000aac: 60fb str r3, [r7, #12]
|
|
__sbrk_heap_end += incr;
|
|
8000aae: 4b08 ldr r3, [pc, #32] ; (8000ad0 <_sbrk+0x64>)
|
|
8000ab0: 681a ldr r2, [r3, #0]
|
|
8000ab2: 687b ldr r3, [r7, #4]
|
|
8000ab4: 4413 add r3, r2
|
|
8000ab6: 4a06 ldr r2, [pc, #24] ; (8000ad0 <_sbrk+0x64>)
|
|
8000ab8: 6013 str r3, [r2, #0]
|
|
|
|
return (void *)prev_heap_end;
|
|
8000aba: 68fb ldr r3, [r7, #12]
|
|
}
|
|
8000abc: 4618 mov r0, r3
|
|
8000abe: 371c adds r7, #28
|
|
8000ac0: 46bd mov sp, r7
|
|
8000ac2: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000ac6: 4770 bx lr
|
|
8000ac8: 24050000 .word 0x24050000
|
|
8000acc: 00000400 .word 0x00000400
|
|
8000ad0: 24000124 .word 0x24000124
|
|
8000ad4: 24007e18 .word 0x24007e18
|
|
8000ad8: 24007e08 .word 0x24007e08
|
|
|
|
08000adc <SystemInit>:
|
|
* configuration.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void SystemInit (void)
|
|
{
|
|
8000adc: b480 push {r7}
|
|
8000ade: b083 sub sp, #12
|
|
8000ae0: af00 add r7, sp, #0
|
|
__IO uint32_t tmpreg;
|
|
#endif /* DATA_IN_D2_SRAM */
|
|
|
|
/* FPU settings ------------------------------------------------------------*/
|
|
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
|
SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */
|
|
8000ae2: 4b3a ldr r3, [pc, #232] ; (8000bcc <SystemInit+0xf0>)
|
|
8000ae4: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
8000ae8: 4a38 ldr r2, [pc, #224] ; (8000bcc <SystemInit+0xf0>)
|
|
8000aea: f443 0370 orr.w r3, r3, #15728640 ; 0xf00000
|
|
8000aee: f8c2 3088 str.w r3, [r2, #136] ; 0x88
|
|
#endif
|
|
/* Reset the RCC clock configuration to the default reset state ------------*/
|
|
|
|
/* Increasing the CPU frequency */
|
|
if(FLASH_LATENCY_DEFAULT > (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)))
|
|
8000af2: 4b37 ldr r3, [pc, #220] ; (8000bd0 <SystemInit+0xf4>)
|
|
8000af4: 681b ldr r3, [r3, #0]
|
|
8000af6: f003 030f and.w r3, r3, #15
|
|
8000afa: 2b06 cmp r3, #6
|
|
8000afc: d807 bhi.n 8000b0e <SystemInit+0x32>
|
|
{
|
|
/* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
|
|
MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT));
|
|
8000afe: 4b34 ldr r3, [pc, #208] ; (8000bd0 <SystemInit+0xf4>)
|
|
8000b00: 681b ldr r3, [r3, #0]
|
|
8000b02: f023 030f bic.w r3, r3, #15
|
|
8000b06: 4a32 ldr r2, [pc, #200] ; (8000bd0 <SystemInit+0xf4>)
|
|
8000b08: f043 0307 orr.w r3, r3, #7
|
|
8000b0c: 6013 str r3, [r2, #0]
|
|
}
|
|
|
|
/* Set HSION bit */
|
|
RCC->CR |= RCC_CR_HSION;
|
|
8000b0e: 4b31 ldr r3, [pc, #196] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b10: 681b ldr r3, [r3, #0]
|
|
8000b12: 4a30 ldr r2, [pc, #192] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b14: f043 0301 orr.w r3, r3, #1
|
|
8000b18: 6013 str r3, [r2, #0]
|
|
|
|
/* Reset CFGR register */
|
|
RCC->CFGR = 0x00000000;
|
|
8000b1a: 4b2e ldr r3, [pc, #184] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b1c: 2200 movs r2, #0
|
|
8000b1e: 611a str r2, [r3, #16]
|
|
|
|
/* Reset HSEON, HSECSSON, CSION, HSI48ON, CSIKERON, PLL1ON, PLL2ON and PLL3ON bits */
|
|
RCC->CR &= 0xEAF6ED7FU;
|
|
8000b20: 4b2c ldr r3, [pc, #176] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b22: 681a ldr r2, [r3, #0]
|
|
8000b24: 492b ldr r1, [pc, #172] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b26: 4b2c ldr r3, [pc, #176] ; (8000bd8 <SystemInit+0xfc>)
|
|
8000b28: 4013 ands r3, r2
|
|
8000b2a: 600b str r3, [r1, #0]
|
|
|
|
/* Decreasing the number of wait states because of lower CPU frequency */
|
|
if(FLASH_LATENCY_DEFAULT < (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)))
|
|
8000b2c: 4b28 ldr r3, [pc, #160] ; (8000bd0 <SystemInit+0xf4>)
|
|
8000b2e: 681b ldr r3, [r3, #0]
|
|
8000b30: f003 0308 and.w r3, r3, #8
|
|
8000b34: 2b00 cmp r3, #0
|
|
8000b36: d007 beq.n 8000b48 <SystemInit+0x6c>
|
|
{
|
|
/* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
|
|
MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT));
|
|
8000b38: 4b25 ldr r3, [pc, #148] ; (8000bd0 <SystemInit+0xf4>)
|
|
8000b3a: 681b ldr r3, [r3, #0]
|
|
8000b3c: f023 030f bic.w r3, r3, #15
|
|
8000b40: 4a23 ldr r2, [pc, #140] ; (8000bd0 <SystemInit+0xf4>)
|
|
8000b42: f043 0307 orr.w r3, r3, #7
|
|
8000b46: 6013 str r3, [r2, #0]
|
|
}
|
|
|
|
#if defined(D3_SRAM_BASE)
|
|
/* Reset D1CFGR register */
|
|
RCC->D1CFGR = 0x00000000;
|
|
8000b48: 4b22 ldr r3, [pc, #136] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b4a: 2200 movs r2, #0
|
|
8000b4c: 619a str r2, [r3, #24]
|
|
|
|
/* Reset D2CFGR register */
|
|
RCC->D2CFGR = 0x00000000;
|
|
8000b4e: 4b21 ldr r3, [pc, #132] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b50: 2200 movs r2, #0
|
|
8000b52: 61da str r2, [r3, #28]
|
|
|
|
/* Reset D3CFGR register */
|
|
RCC->D3CFGR = 0x00000000;
|
|
8000b54: 4b1f ldr r3, [pc, #124] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b56: 2200 movs r2, #0
|
|
8000b58: 621a str r2, [r3, #32]
|
|
|
|
/* Reset SRDCFGR register */
|
|
RCC->SRDCFGR = 0x00000000;
|
|
#endif
|
|
/* Reset PLLCKSELR register */
|
|
RCC->PLLCKSELR = 0x02020200;
|
|
8000b5a: 4b1e ldr r3, [pc, #120] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b5c: 4a1f ldr r2, [pc, #124] ; (8000bdc <SystemInit+0x100>)
|
|
8000b5e: 629a str r2, [r3, #40] ; 0x28
|
|
|
|
/* Reset PLLCFGR register */
|
|
RCC->PLLCFGR = 0x01FF0000;
|
|
8000b60: 4b1c ldr r3, [pc, #112] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b62: 4a1f ldr r2, [pc, #124] ; (8000be0 <SystemInit+0x104>)
|
|
8000b64: 62da str r2, [r3, #44] ; 0x2c
|
|
/* Reset PLL1DIVR register */
|
|
RCC->PLL1DIVR = 0x01010280;
|
|
8000b66: 4b1b ldr r3, [pc, #108] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b68: 4a1e ldr r2, [pc, #120] ; (8000be4 <SystemInit+0x108>)
|
|
8000b6a: 631a str r2, [r3, #48] ; 0x30
|
|
/* Reset PLL1FRACR register */
|
|
RCC->PLL1FRACR = 0x00000000;
|
|
8000b6c: 4b19 ldr r3, [pc, #100] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b6e: 2200 movs r2, #0
|
|
8000b70: 635a str r2, [r3, #52] ; 0x34
|
|
|
|
/* Reset PLL2DIVR register */
|
|
RCC->PLL2DIVR = 0x01010280;
|
|
8000b72: 4b18 ldr r3, [pc, #96] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b74: 4a1b ldr r2, [pc, #108] ; (8000be4 <SystemInit+0x108>)
|
|
8000b76: 639a str r2, [r3, #56] ; 0x38
|
|
|
|
/* Reset PLL2FRACR register */
|
|
|
|
RCC->PLL2FRACR = 0x00000000;
|
|
8000b78: 4b16 ldr r3, [pc, #88] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b7a: 2200 movs r2, #0
|
|
8000b7c: 63da str r2, [r3, #60] ; 0x3c
|
|
/* Reset PLL3DIVR register */
|
|
RCC->PLL3DIVR = 0x01010280;
|
|
8000b7e: 4b15 ldr r3, [pc, #84] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b80: 4a18 ldr r2, [pc, #96] ; (8000be4 <SystemInit+0x108>)
|
|
8000b82: 641a str r2, [r3, #64] ; 0x40
|
|
|
|
/* Reset PLL3FRACR register */
|
|
RCC->PLL3FRACR = 0x00000000;
|
|
8000b84: 4b13 ldr r3, [pc, #76] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b86: 2200 movs r2, #0
|
|
8000b88: 645a str r2, [r3, #68] ; 0x44
|
|
|
|
/* Reset HSEBYP bit */
|
|
RCC->CR &= 0xFFFBFFFFU;
|
|
8000b8a: 4b12 ldr r3, [pc, #72] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b8c: 681b ldr r3, [r3, #0]
|
|
8000b8e: 4a11 ldr r2, [pc, #68] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b90: f423 2380 bic.w r3, r3, #262144 ; 0x40000
|
|
8000b94: 6013 str r3, [r2, #0]
|
|
|
|
/* Disable all interrupts */
|
|
RCC->CIER = 0x00000000;
|
|
8000b96: 4b0f ldr r3, [pc, #60] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b98: 2200 movs r2, #0
|
|
8000b9a: 661a str r2, [r3, #96] ; 0x60
|
|
#if defined(DATA_IN_D2_SRAM)
|
|
/* in case of initialized data in D2 SRAM (AHB SRAM), enable the D2 SRAM clock (AHB SRAM clock) */
|
|
#if defined(RCC_AHB2ENR_D2SRAM3EN)
|
|
RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN);
|
|
#elif defined(RCC_AHB2ENR_D2SRAM2EN)
|
|
RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN);
|
|
8000b9c: 4b0d ldr r3, [pc, #52] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000b9e: f8d3 30dc ldr.w r3, [r3, #220] ; 0xdc
|
|
8000ba2: 4a0c ldr r2, [pc, #48] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000ba4: f043 43c0 orr.w r3, r3, #1610612736 ; 0x60000000
|
|
8000ba8: f8c2 30dc str.w r3, [r2, #220] ; 0xdc
|
|
#else
|
|
RCC->AHB2ENR |= (RCC_AHB2ENR_AHBSRAM1EN | RCC_AHB2ENR_AHBSRAM2EN);
|
|
#endif /* RCC_AHB2ENR_D2SRAM3EN */
|
|
|
|
tmpreg = RCC->AHB2ENR;
|
|
8000bac: 4b09 ldr r3, [pc, #36] ; (8000bd4 <SystemInit+0xf8>)
|
|
8000bae: f8d3 30dc ldr.w r3, [r3, #220] ; 0xdc
|
|
8000bb2: 607b str r3, [r7, #4]
|
|
(void) tmpreg;
|
|
8000bb4: 687b ldr r3, [r7, #4]
|
|
/*
|
|
* Disable the FMC bank1 (enabled after reset).
|
|
* This, prevents CPU speculation access on this bank which blocks the use of FMC during
|
|
* 24us. During this time the others FMC master (such as LTDC) cannot use it!
|
|
*/
|
|
FMC_Bank1_R->BTCR[0] = 0x000030D2;
|
|
8000bb6: 4b0c ldr r3, [pc, #48] ; (8000be8 <SystemInit+0x10c>)
|
|
8000bb8: f243 02d2 movw r2, #12498 ; 0x30d2
|
|
8000bbc: 601a str r2, [r3, #0]
|
|
#if defined(USER_VECT_TAB_ADDRESS)
|
|
SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal D1 AXI-RAM or in Internal FLASH */
|
|
#endif /* USER_VECT_TAB_ADDRESS */
|
|
|
|
#endif /*DUAL_CORE && CORE_CM4*/
|
|
}
|
|
8000bbe: bf00 nop
|
|
8000bc0: 370c adds r7, #12
|
|
8000bc2: 46bd mov sp, r7
|
|
8000bc4: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000bc8: 4770 bx lr
|
|
8000bca: bf00 nop
|
|
8000bcc: e000ed00 .word 0xe000ed00
|
|
8000bd0: 52002000 .word 0x52002000
|
|
8000bd4: 58024400 .word 0x58024400
|
|
8000bd8: eaf6ed7f .word 0xeaf6ed7f
|
|
8000bdc: 02020200 .word 0x02020200
|
|
8000be0: 01ff0000 .word 0x01ff0000
|
|
8000be4: 01010280 .word 0x01010280
|
|
8000be8: 52004000 .word 0x52004000
|
|
|
|
08000bec <Reset_Handler>:
|
|
|
|
.section .text.Reset_Handler
|
|
.weak Reset_Handler
|
|
.type Reset_Handler, %function
|
|
Reset_Handler:
|
|
ldr sp, =_estack /* set stack pointer */
|
|
8000bec: f8df d034 ldr.w sp, [pc, #52] ; 8000c24 <LoopFillZerobss+0xe>
|
|
|
|
/* Call the clock system initialization function.*/
|
|
bl SystemInit
|
|
8000bf0: f7ff ff74 bl 8000adc <SystemInit>
|
|
|
|
/* Copy the data segment initializers from flash to SRAM */
|
|
ldr r0, =_sdata
|
|
8000bf4: 480c ldr r0, [pc, #48] ; (8000c28 <LoopFillZerobss+0x12>)
|
|
ldr r1, =_edata
|
|
8000bf6: 490d ldr r1, [pc, #52] ; (8000c2c <LoopFillZerobss+0x16>)
|
|
ldr r2, =_sidata
|
|
8000bf8: 4a0d ldr r2, [pc, #52] ; (8000c30 <LoopFillZerobss+0x1a>)
|
|
movs r3, #0
|
|
8000bfa: 2300 movs r3, #0
|
|
b LoopCopyDataInit
|
|
8000bfc: e002 b.n 8000c04 <LoopCopyDataInit>
|
|
|
|
08000bfe <CopyDataInit>:
|
|
|
|
CopyDataInit:
|
|
ldr r4, [r2, r3]
|
|
8000bfe: 58d4 ldr r4, [r2, r3]
|
|
str r4, [r0, r3]
|
|
8000c00: 50c4 str r4, [r0, r3]
|
|
adds r3, r3, #4
|
|
8000c02: 3304 adds r3, #4
|
|
|
|
08000c04 <LoopCopyDataInit>:
|
|
|
|
LoopCopyDataInit:
|
|
adds r4, r0, r3
|
|
8000c04: 18c4 adds r4, r0, r3
|
|
cmp r4, r1
|
|
8000c06: 428c cmp r4, r1
|
|
bcc CopyDataInit
|
|
8000c08: d3f9 bcc.n 8000bfe <CopyDataInit>
|
|
/* Zero fill the bss segment. */
|
|
ldr r2, =_sbss
|
|
8000c0a: 4a0a ldr r2, [pc, #40] ; (8000c34 <LoopFillZerobss+0x1e>)
|
|
ldr r4, =_ebss
|
|
8000c0c: 4c0a ldr r4, [pc, #40] ; (8000c38 <LoopFillZerobss+0x22>)
|
|
movs r3, #0
|
|
8000c0e: 2300 movs r3, #0
|
|
b LoopFillZerobss
|
|
8000c10: e001 b.n 8000c16 <LoopFillZerobss>
|
|
|
|
08000c12 <FillZerobss>:
|
|
|
|
FillZerobss:
|
|
str r3, [r2]
|
|
8000c12: 6013 str r3, [r2, #0]
|
|
adds r2, r2, #4
|
|
8000c14: 3204 adds r2, #4
|
|
|
|
08000c16 <LoopFillZerobss>:
|
|
|
|
LoopFillZerobss:
|
|
cmp r2, r4
|
|
8000c16: 42a2 cmp r2, r4
|
|
bcc FillZerobss
|
|
8000c18: d3fb bcc.n 8000c12 <FillZerobss>
|
|
|
|
/* Call static constructors */
|
|
bl __libc_init_array
|
|
8000c1a: f010 f98f bl 8010f3c <__libc_init_array>
|
|
/* Call the application's entry point.*/
|
|
bl main
|
|
8000c1e: f7ff fce1 bl 80005e4 <main>
|
|
bx lr
|
|
8000c22: 4770 bx lr
|
|
ldr sp, =_estack /* set stack pointer */
|
|
8000c24: 24050000 .word 0x24050000
|
|
ldr r0, =_sdata
|
|
8000c28: 24000000 .word 0x24000000
|
|
ldr r1, =_edata
|
|
8000c2c: 240000d0 .word 0x240000d0
|
|
ldr r2, =_sidata
|
|
8000c30: 08014f90 .word 0x08014f90
|
|
ldr r2, =_sbss
|
|
8000c34: 240000d0 .word 0x240000d0
|
|
ldr r4, =_ebss
|
|
8000c38: 24007e18 .word 0x24007e18
|
|
|
|
08000c3c <ADC3_IRQHandler>:
|
|
* @retval None
|
|
*/
|
|
.section .text.Default_Handler,"ax",%progbits
|
|
Default_Handler:
|
|
Infinite_Loop:
|
|
b Infinite_Loop
|
|
8000c3c: e7fe b.n 8000c3c <ADC3_IRQHandler>
|
|
|
|
08000c3e <LAN8742_RegisterBusIO>:
|
|
* @param ioctx: holds device IO functions.
|
|
* @retval LAN8742_STATUS_OK if OK
|
|
* LAN8742_STATUS_ERROR if missing mandatory function
|
|
*/
|
|
int32_t LAN8742_RegisterBusIO(lan8742_Object_t *pObj, lan8742_IOCtx_t *ioctx)
|
|
{
|
|
8000c3e: b480 push {r7}
|
|
8000c40: b083 sub sp, #12
|
|
8000c42: af00 add r7, sp, #0
|
|
8000c44: 6078 str r0, [r7, #4]
|
|
8000c46: 6039 str r1, [r7, #0]
|
|
if(!pObj || !ioctx->ReadReg || !ioctx->WriteReg || !ioctx->GetTick)
|
|
8000c48: 687b ldr r3, [r7, #4]
|
|
8000c4a: 2b00 cmp r3, #0
|
|
8000c4c: d00b beq.n 8000c66 <LAN8742_RegisterBusIO+0x28>
|
|
8000c4e: 683b ldr r3, [r7, #0]
|
|
8000c50: 68db ldr r3, [r3, #12]
|
|
8000c52: 2b00 cmp r3, #0
|
|
8000c54: d007 beq.n 8000c66 <LAN8742_RegisterBusIO+0x28>
|
|
8000c56: 683b ldr r3, [r7, #0]
|
|
8000c58: 689b ldr r3, [r3, #8]
|
|
8000c5a: 2b00 cmp r3, #0
|
|
8000c5c: d003 beq.n 8000c66 <LAN8742_RegisterBusIO+0x28>
|
|
8000c5e: 683b ldr r3, [r7, #0]
|
|
8000c60: 691b ldr r3, [r3, #16]
|
|
8000c62: 2b00 cmp r3, #0
|
|
8000c64: d102 bne.n 8000c6c <LAN8742_RegisterBusIO+0x2e>
|
|
{
|
|
return LAN8742_STATUS_ERROR;
|
|
8000c66: f04f 33ff mov.w r3, #4294967295
|
|
8000c6a: e014 b.n 8000c96 <LAN8742_RegisterBusIO+0x58>
|
|
}
|
|
|
|
pObj->IO.Init = ioctx->Init;
|
|
8000c6c: 683b ldr r3, [r7, #0]
|
|
8000c6e: 681a ldr r2, [r3, #0]
|
|
8000c70: 687b ldr r3, [r7, #4]
|
|
8000c72: 609a str r2, [r3, #8]
|
|
pObj->IO.DeInit = ioctx->DeInit;
|
|
8000c74: 683b ldr r3, [r7, #0]
|
|
8000c76: 685a ldr r2, [r3, #4]
|
|
8000c78: 687b ldr r3, [r7, #4]
|
|
8000c7a: 60da str r2, [r3, #12]
|
|
pObj->IO.ReadReg = ioctx->ReadReg;
|
|
8000c7c: 683b ldr r3, [r7, #0]
|
|
8000c7e: 68da ldr r2, [r3, #12]
|
|
8000c80: 687b ldr r3, [r7, #4]
|
|
8000c82: 615a str r2, [r3, #20]
|
|
pObj->IO.WriteReg = ioctx->WriteReg;
|
|
8000c84: 683b ldr r3, [r7, #0]
|
|
8000c86: 689a ldr r2, [r3, #8]
|
|
8000c88: 687b ldr r3, [r7, #4]
|
|
8000c8a: 611a str r2, [r3, #16]
|
|
pObj->IO.GetTick = ioctx->GetTick;
|
|
8000c8c: 683b ldr r3, [r7, #0]
|
|
8000c8e: 691a ldr r2, [r3, #16]
|
|
8000c90: 687b ldr r3, [r7, #4]
|
|
8000c92: 619a str r2, [r3, #24]
|
|
|
|
return LAN8742_STATUS_OK;
|
|
8000c94: 2300 movs r3, #0
|
|
}
|
|
8000c96: 4618 mov r0, r3
|
|
8000c98: 370c adds r7, #12
|
|
8000c9a: 46bd mov sp, r7
|
|
8000c9c: f85d 7b04 ldr.w r7, [sp], #4
|
|
8000ca0: 4770 bx lr
|
|
|
|
08000ca2 <LAN8742_Init>:
|
|
* LAN8742_STATUS_READ_ERROR if connot read register
|
|
* LAN8742_STATUS_WRITE_ERROR if connot write to register
|
|
* LAN8742_STATUS_RESET_TIMEOUT if cannot perform a software reset
|
|
*/
|
|
int32_t LAN8742_Init(lan8742_Object_t *pObj)
|
|
{
|
|
8000ca2: b580 push {r7, lr}
|
|
8000ca4: b086 sub sp, #24
|
|
8000ca6: af00 add r7, sp, #0
|
|
8000ca8: 6078 str r0, [r7, #4]
|
|
uint32_t tickstart = 0, regvalue = 0, addr = 0;
|
|
8000caa: 2300 movs r3, #0
|
|
8000cac: 60fb str r3, [r7, #12]
|
|
8000cae: 2300 movs r3, #0
|
|
8000cb0: 60bb str r3, [r7, #8]
|
|
8000cb2: 2300 movs r3, #0
|
|
8000cb4: 617b str r3, [r7, #20]
|
|
int32_t status = LAN8742_STATUS_OK;
|
|
8000cb6: 2300 movs r3, #0
|
|
8000cb8: 613b str r3, [r7, #16]
|
|
|
|
if(pObj->Is_Initialized == 0)
|
|
8000cba: 687b ldr r3, [r7, #4]
|
|
8000cbc: 685b ldr r3, [r3, #4]
|
|
8000cbe: 2b00 cmp r3, #0
|
|
8000cc0: d17c bne.n 8000dbc <LAN8742_Init+0x11a>
|
|
{
|
|
if(pObj->IO.Init != 0)
|
|
8000cc2: 687b ldr r3, [r7, #4]
|
|
8000cc4: 689b ldr r3, [r3, #8]
|
|
8000cc6: 2b00 cmp r3, #0
|
|
8000cc8: d002 beq.n 8000cd0 <LAN8742_Init+0x2e>
|
|
{
|
|
/* GPIO and Clocks initialization */
|
|
pObj->IO.Init();
|
|
8000cca: 687b ldr r3, [r7, #4]
|
|
8000ccc: 689b ldr r3, [r3, #8]
|
|
8000cce: 4798 blx r3
|
|
}
|
|
|
|
/* for later check */
|
|
pObj->DevAddr = LAN8742_MAX_DEV_ADDR + 1;
|
|
8000cd0: 687b ldr r3, [r7, #4]
|
|
8000cd2: 2220 movs r2, #32
|
|
8000cd4: 601a str r2, [r3, #0]
|
|
|
|
/* Get the device address from special mode register */
|
|
for(addr = 0; addr <= LAN8742_MAX_DEV_ADDR; addr ++)
|
|
8000cd6: 2300 movs r3, #0
|
|
8000cd8: 617b str r3, [r7, #20]
|
|
8000cda: e01c b.n 8000d16 <LAN8742_Init+0x74>
|
|
{
|
|
if(pObj->IO.ReadReg(addr, LAN8742_SMR, ®value) < 0)
|
|
8000cdc: 687b ldr r3, [r7, #4]
|
|
8000cde: 695b ldr r3, [r3, #20]
|
|
8000ce0: f107 0208 add.w r2, r7, #8
|
|
8000ce4: 2112 movs r1, #18
|
|
8000ce6: 6978 ldr r0, [r7, #20]
|
|
8000ce8: 4798 blx r3
|
|
8000cea: 4603 mov r3, r0
|
|
8000cec: 2b00 cmp r3, #0
|
|
8000cee: da03 bge.n 8000cf8 <LAN8742_Init+0x56>
|
|
{
|
|
status = LAN8742_STATUS_READ_ERROR;
|
|
8000cf0: f06f 0304 mvn.w r3, #4
|
|
8000cf4: 613b str r3, [r7, #16]
|
|
/* Can't read from this device address
|
|
continue with next address */
|
|
continue;
|
|
8000cf6: e00b b.n 8000d10 <LAN8742_Init+0x6e>
|
|
}
|
|
|
|
if((regvalue & LAN8742_SMR_PHY_ADDR) == addr)
|
|
8000cf8: 68bb ldr r3, [r7, #8]
|
|
8000cfa: f003 031f and.w r3, r3, #31
|
|
8000cfe: 697a ldr r2, [r7, #20]
|
|
8000d00: 429a cmp r2, r3
|
|
8000d02: d105 bne.n 8000d10 <LAN8742_Init+0x6e>
|
|
{
|
|
pObj->DevAddr = addr;
|
|
8000d04: 687b ldr r3, [r7, #4]
|
|
8000d06: 697a ldr r2, [r7, #20]
|
|
8000d08: 601a str r2, [r3, #0]
|
|
status = LAN8742_STATUS_OK;
|
|
8000d0a: 2300 movs r3, #0
|
|
8000d0c: 613b str r3, [r7, #16]
|
|
break;
|
|
8000d0e: e005 b.n 8000d1c <LAN8742_Init+0x7a>
|
|
for(addr = 0; addr <= LAN8742_MAX_DEV_ADDR; addr ++)
|
|
8000d10: 697b ldr r3, [r7, #20]
|
|
8000d12: 3301 adds r3, #1
|
|
8000d14: 617b str r3, [r7, #20]
|
|
8000d16: 697b ldr r3, [r7, #20]
|
|
8000d18: 2b1f cmp r3, #31
|
|
8000d1a: d9df bls.n 8000cdc <LAN8742_Init+0x3a>
|
|
}
|
|
}
|
|
|
|
if(pObj->DevAddr > LAN8742_MAX_DEV_ADDR)
|
|
8000d1c: 687b ldr r3, [r7, #4]
|
|
8000d1e: 681b ldr r3, [r3, #0]
|
|
8000d20: 2b1f cmp r3, #31
|
|
8000d22: d902 bls.n 8000d2a <LAN8742_Init+0x88>
|
|
{
|
|
status = LAN8742_STATUS_ADDRESS_ERROR;
|
|
8000d24: f06f 0302 mvn.w r3, #2
|
|
8000d28: 613b str r3, [r7, #16]
|
|
}
|
|
|
|
/* if device address is matched */
|
|
if(status == LAN8742_STATUS_OK)
|
|
8000d2a: 693b ldr r3, [r7, #16]
|
|
8000d2c: 2b00 cmp r3, #0
|
|
8000d2e: d145 bne.n 8000dbc <LAN8742_Init+0x11a>
|
|
{
|
|
/* set a software reset */
|
|
if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, LAN8742_BCR_SOFT_RESET) >= 0)
|
|
8000d30: 687b ldr r3, [r7, #4]
|
|
8000d32: 691b ldr r3, [r3, #16]
|
|
8000d34: 687a ldr r2, [r7, #4]
|
|
8000d36: 6810 ldr r0, [r2, #0]
|
|
8000d38: f44f 4200 mov.w r2, #32768 ; 0x8000
|
|
8000d3c: 2100 movs r1, #0
|
|
8000d3e: 4798 blx r3
|
|
8000d40: 4603 mov r3, r0
|
|
8000d42: 2b00 cmp r3, #0
|
|
8000d44: db37 blt.n 8000db6 <LAN8742_Init+0x114>
|
|
{
|
|
/* get software reset status */
|
|
if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, ®value) >= 0)
|
|
8000d46: 687b ldr r3, [r7, #4]
|
|
8000d48: 695b ldr r3, [r3, #20]
|
|
8000d4a: 687a ldr r2, [r7, #4]
|
|
8000d4c: 6810 ldr r0, [r2, #0]
|
|
8000d4e: f107 0208 add.w r2, r7, #8
|
|
8000d52: 2100 movs r1, #0
|
|
8000d54: 4798 blx r3
|
|
8000d56: 4603 mov r3, r0
|
|
8000d58: 2b00 cmp r3, #0
|
|
8000d5a: db28 blt.n 8000dae <LAN8742_Init+0x10c>
|
|
{
|
|
tickstart = pObj->IO.GetTick();
|
|
8000d5c: 687b ldr r3, [r7, #4]
|
|
8000d5e: 699b ldr r3, [r3, #24]
|
|
8000d60: 4798 blx r3
|
|
8000d62: 4603 mov r3, r0
|
|
8000d64: 60fb str r3, [r7, #12]
|
|
|
|
/* wait until software reset is done or timeout occured */
|
|
while(regvalue & LAN8742_BCR_SOFT_RESET)
|
|
8000d66: e01c b.n 8000da2 <LAN8742_Init+0x100>
|
|
{
|
|
if((pObj->IO.GetTick() - tickstart) <= LAN8742_SW_RESET_TO)
|
|
8000d68: 687b ldr r3, [r7, #4]
|
|
8000d6a: 699b ldr r3, [r3, #24]
|
|
8000d6c: 4798 blx r3
|
|
8000d6e: 4603 mov r3, r0
|
|
8000d70: 461a mov r2, r3
|
|
8000d72: 68fb ldr r3, [r7, #12]
|
|
8000d74: 1ad3 subs r3, r2, r3
|
|
8000d76: f5b3 7ffa cmp.w r3, #500 ; 0x1f4
|
|
8000d7a: d80e bhi.n 8000d9a <LAN8742_Init+0xf8>
|
|
{
|
|
if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, ®value) < 0)
|
|
8000d7c: 687b ldr r3, [r7, #4]
|
|
8000d7e: 695b ldr r3, [r3, #20]
|
|
8000d80: 687a ldr r2, [r7, #4]
|
|
8000d82: 6810 ldr r0, [r2, #0]
|
|
8000d84: f107 0208 add.w r2, r7, #8
|
|
8000d88: 2100 movs r1, #0
|
|
8000d8a: 4798 blx r3
|
|
8000d8c: 4603 mov r3, r0
|
|
8000d8e: 2b00 cmp r3, #0
|
|
8000d90: da07 bge.n 8000da2 <LAN8742_Init+0x100>
|
|
{
|
|
status = LAN8742_STATUS_READ_ERROR;
|
|
8000d92: f06f 0304 mvn.w r3, #4
|
|
8000d96: 613b str r3, [r7, #16]
|
|
break;
|
|
8000d98: e010 b.n 8000dbc <LAN8742_Init+0x11a>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
status = LAN8742_STATUS_RESET_TIMEOUT;
|
|
8000d9a: f06f 0301 mvn.w r3, #1
|
|
8000d9e: 613b str r3, [r7, #16]
|
|
break;
|
|
8000da0: e00c b.n 8000dbc <LAN8742_Init+0x11a>
|
|
while(regvalue & LAN8742_BCR_SOFT_RESET)
|
|
8000da2: 68bb ldr r3, [r7, #8]
|
|
8000da4: f403 4300 and.w r3, r3, #32768 ; 0x8000
|
|
8000da8: 2b00 cmp r3, #0
|
|
8000daa: d1dd bne.n 8000d68 <LAN8742_Init+0xc6>
|
|
8000dac: e006 b.n 8000dbc <LAN8742_Init+0x11a>
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
status = LAN8742_STATUS_READ_ERROR;
|
|
8000dae: f06f 0304 mvn.w r3, #4
|
|
8000db2: 613b str r3, [r7, #16]
|
|
8000db4: e002 b.n 8000dbc <LAN8742_Init+0x11a>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
status = LAN8742_STATUS_WRITE_ERROR;
|
|
8000db6: f06f 0303 mvn.w r3, #3
|
|
8000dba: 613b str r3, [r7, #16]
|
|
}
|
|
}
|
|
}
|
|
|
|
if(status == LAN8742_STATUS_OK)
|
|
8000dbc: 693b ldr r3, [r7, #16]
|
|
8000dbe: 2b00 cmp r3, #0
|
|
8000dc0: d112 bne.n 8000de8 <LAN8742_Init+0x146>
|
|
{
|
|
tickstart = pObj->IO.GetTick();
|
|
8000dc2: 687b ldr r3, [r7, #4]
|
|
8000dc4: 699b ldr r3, [r3, #24]
|
|
8000dc6: 4798 blx r3
|
|
8000dc8: 4603 mov r3, r0
|
|
8000dca: 60fb str r3, [r7, #12]
|
|
|
|
/* Wait for 2s to perform initialization */
|
|
while((pObj->IO.GetTick() - tickstart) <= LAN8742_INIT_TO)
|
|
8000dcc: bf00 nop
|
|
8000dce: 687b ldr r3, [r7, #4]
|
|
8000dd0: 699b ldr r3, [r3, #24]
|
|
8000dd2: 4798 blx r3
|
|
8000dd4: 4603 mov r3, r0
|
|
8000dd6: 461a mov r2, r3
|
|
8000dd8: 68fb ldr r3, [r7, #12]
|
|
8000dda: 1ad3 subs r3, r2, r3
|
|
8000ddc: f5b3 6ffa cmp.w r3, #2000 ; 0x7d0
|
|
8000de0: d9f5 bls.n 8000dce <LAN8742_Init+0x12c>
|
|
{
|
|
}
|
|
pObj->Is_Initialized = 1;
|
|
8000de2: 687b ldr r3, [r7, #4]
|
|
8000de4: 2201 movs r2, #1
|
|
8000de6: 605a str r2, [r3, #4]
|
|
}
|
|
|
|
return status;
|
|
8000de8: 693b ldr r3, [r7, #16]
|
|
}
|
|
8000dea: 4618 mov r0, r3
|
|
8000dec: 3718 adds r7, #24
|
|
8000dee: 46bd mov sp, r7
|
|
8000df0: bd80 pop {r7, pc}
|
|
|
|
08000df2 <LAN8742_GetLinkState>:
|
|
* LAN8742_STATUS_10MBITS_HALFDUPLEX if 10Mb/s HD
|
|
* LAN8742_STATUS_READ_ERROR if connot read register
|
|
* LAN8742_STATUS_WRITE_ERROR if connot write to register
|
|
*/
|
|
int32_t LAN8742_GetLinkState(lan8742_Object_t *pObj)
|
|
{
|
|
8000df2: b580 push {r7, lr}
|
|
8000df4: b084 sub sp, #16
|
|
8000df6: af00 add r7, sp, #0
|
|
8000df8: 6078 str r0, [r7, #4]
|
|
uint32_t readval = 0;
|
|
8000dfa: 2300 movs r3, #0
|
|
8000dfc: 60fb str r3, [r7, #12]
|
|
|
|
/* Read Status register */
|
|
if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BSR, &readval) < 0)
|
|
8000dfe: 687b ldr r3, [r7, #4]
|
|
8000e00: 695b ldr r3, [r3, #20]
|
|
8000e02: 687a ldr r2, [r7, #4]
|
|
8000e04: 6810 ldr r0, [r2, #0]
|
|
8000e06: f107 020c add.w r2, r7, #12
|
|
8000e0a: 2101 movs r1, #1
|
|
8000e0c: 4798 blx r3
|
|
8000e0e: 4603 mov r3, r0
|
|
8000e10: 2b00 cmp r3, #0
|
|
8000e12: da02 bge.n 8000e1a <LAN8742_GetLinkState+0x28>
|
|
{
|
|
return LAN8742_STATUS_READ_ERROR;
|
|
8000e14: f06f 0304 mvn.w r3, #4
|
|
8000e18: e06e b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
|
|
/* Read Status register again */
|
|
if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BSR, &readval) < 0)
|
|
8000e1a: 687b ldr r3, [r7, #4]
|
|
8000e1c: 695b ldr r3, [r3, #20]
|
|
8000e1e: 687a ldr r2, [r7, #4]
|
|
8000e20: 6810 ldr r0, [r2, #0]
|
|
8000e22: f107 020c add.w r2, r7, #12
|
|
8000e26: 2101 movs r1, #1
|
|
8000e28: 4798 blx r3
|
|
8000e2a: 4603 mov r3, r0
|
|
8000e2c: 2b00 cmp r3, #0
|
|
8000e2e: da02 bge.n 8000e36 <LAN8742_GetLinkState+0x44>
|
|
{
|
|
return LAN8742_STATUS_READ_ERROR;
|
|
8000e30: f06f 0304 mvn.w r3, #4
|
|
8000e34: e060 b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
|
|
if((readval & LAN8742_BSR_LINK_STATUS) == 0)
|
|
8000e36: 68fb ldr r3, [r7, #12]
|
|
8000e38: f003 0304 and.w r3, r3, #4
|
|
8000e3c: 2b00 cmp r3, #0
|
|
8000e3e: d101 bne.n 8000e44 <LAN8742_GetLinkState+0x52>
|
|
{
|
|
/* Return Link Down status */
|
|
return LAN8742_STATUS_LINK_DOWN;
|
|
8000e40: 2301 movs r3, #1
|
|
8000e42: e059 b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
|
|
/* Check Auto negotiaition */
|
|
if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &readval) < 0)
|
|
8000e44: 687b ldr r3, [r7, #4]
|
|
8000e46: 695b ldr r3, [r3, #20]
|
|
8000e48: 687a ldr r2, [r7, #4]
|
|
8000e4a: 6810 ldr r0, [r2, #0]
|
|
8000e4c: f107 020c add.w r2, r7, #12
|
|
8000e50: 2100 movs r1, #0
|
|
8000e52: 4798 blx r3
|
|
8000e54: 4603 mov r3, r0
|
|
8000e56: 2b00 cmp r3, #0
|
|
8000e58: da02 bge.n 8000e60 <LAN8742_GetLinkState+0x6e>
|
|
{
|
|
return LAN8742_STATUS_READ_ERROR;
|
|
8000e5a: f06f 0304 mvn.w r3, #4
|
|
8000e5e: e04b b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
|
|
if((readval & LAN8742_BCR_AUTONEGO_EN) != LAN8742_BCR_AUTONEGO_EN)
|
|
8000e60: 68fb ldr r3, [r7, #12]
|
|
8000e62: f403 5380 and.w r3, r3, #4096 ; 0x1000
|
|
8000e66: 2b00 cmp r3, #0
|
|
8000e68: d11b bne.n 8000ea2 <LAN8742_GetLinkState+0xb0>
|
|
{
|
|
if(((readval & LAN8742_BCR_SPEED_SELECT) == LAN8742_BCR_SPEED_SELECT) && ((readval & LAN8742_BCR_DUPLEX_MODE) == LAN8742_BCR_DUPLEX_MODE))
|
|
8000e6a: 68fb ldr r3, [r7, #12]
|
|
8000e6c: f403 5300 and.w r3, r3, #8192 ; 0x2000
|
|
8000e70: 2b00 cmp r3, #0
|
|
8000e72: d006 beq.n 8000e82 <LAN8742_GetLinkState+0x90>
|
|
8000e74: 68fb ldr r3, [r7, #12]
|
|
8000e76: f403 7380 and.w r3, r3, #256 ; 0x100
|
|
8000e7a: 2b00 cmp r3, #0
|
|
8000e7c: d001 beq.n 8000e82 <LAN8742_GetLinkState+0x90>
|
|
{
|
|
return LAN8742_STATUS_100MBITS_FULLDUPLEX;
|
|
8000e7e: 2302 movs r3, #2
|
|
8000e80: e03a b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
else if ((readval & LAN8742_BCR_SPEED_SELECT) == LAN8742_BCR_SPEED_SELECT)
|
|
8000e82: 68fb ldr r3, [r7, #12]
|
|
8000e84: f403 5300 and.w r3, r3, #8192 ; 0x2000
|
|
8000e88: 2b00 cmp r3, #0
|
|
8000e8a: d001 beq.n 8000e90 <LAN8742_GetLinkState+0x9e>
|
|
{
|
|
return LAN8742_STATUS_100MBITS_HALFDUPLEX;
|
|
8000e8c: 2303 movs r3, #3
|
|
8000e8e: e033 b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
else if ((readval & LAN8742_BCR_DUPLEX_MODE) == LAN8742_BCR_DUPLEX_MODE)
|
|
8000e90: 68fb ldr r3, [r7, #12]
|
|
8000e92: f403 7380 and.w r3, r3, #256 ; 0x100
|
|
8000e96: 2b00 cmp r3, #0
|
|
8000e98: d001 beq.n 8000e9e <LAN8742_GetLinkState+0xac>
|
|
{
|
|
return LAN8742_STATUS_10MBITS_FULLDUPLEX;
|
|
8000e9a: 2304 movs r3, #4
|
|
8000e9c: e02c b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
else
|
|
{
|
|
return LAN8742_STATUS_10MBITS_HALFDUPLEX;
|
|
8000e9e: 2305 movs r3, #5
|
|
8000ea0: e02a b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
}
|
|
else /* Auto Nego enabled */
|
|
{
|
|
if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_PHYSCSR, &readval) < 0)
|
|
8000ea2: 687b ldr r3, [r7, #4]
|
|
8000ea4: 695b ldr r3, [r3, #20]
|
|
8000ea6: 687a ldr r2, [r7, #4]
|
|
8000ea8: 6810 ldr r0, [r2, #0]
|
|
8000eaa: f107 020c add.w r2, r7, #12
|
|
8000eae: 211f movs r1, #31
|
|
8000eb0: 4798 blx r3
|
|
8000eb2: 4603 mov r3, r0
|
|
8000eb4: 2b00 cmp r3, #0
|
|
8000eb6: da02 bge.n 8000ebe <LAN8742_GetLinkState+0xcc>
|
|
{
|
|
return LAN8742_STATUS_READ_ERROR;
|
|
8000eb8: f06f 0304 mvn.w r3, #4
|
|
8000ebc: e01c b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
|
|
/* Check if auto nego not done */
|
|
if((readval & LAN8742_PHYSCSR_AUTONEGO_DONE) == 0)
|
|
8000ebe: 68fb ldr r3, [r7, #12]
|
|
8000ec0: f403 5380 and.w r3, r3, #4096 ; 0x1000
|
|
8000ec4: 2b00 cmp r3, #0
|
|
8000ec6: d101 bne.n 8000ecc <LAN8742_GetLinkState+0xda>
|
|
{
|
|
return LAN8742_STATUS_AUTONEGO_NOTDONE;
|
|
8000ec8: 2306 movs r3, #6
|
|
8000eca: e015 b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
|
|
if((readval & LAN8742_PHYSCSR_HCDSPEEDMASK) == LAN8742_PHYSCSR_100BTX_FD)
|
|
8000ecc: 68fb ldr r3, [r7, #12]
|
|
8000ece: f003 031c and.w r3, r3, #28
|
|
8000ed2: 2b18 cmp r3, #24
|
|
8000ed4: d101 bne.n 8000eda <LAN8742_GetLinkState+0xe8>
|
|
{
|
|
return LAN8742_STATUS_100MBITS_FULLDUPLEX;
|
|
8000ed6: 2302 movs r3, #2
|
|
8000ed8: e00e b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
else if ((readval & LAN8742_PHYSCSR_HCDSPEEDMASK) == LAN8742_PHYSCSR_100BTX_HD)
|
|
8000eda: 68fb ldr r3, [r7, #12]
|
|
8000edc: f003 031c and.w r3, r3, #28
|
|
8000ee0: 2b08 cmp r3, #8
|
|
8000ee2: d101 bne.n 8000ee8 <LAN8742_GetLinkState+0xf6>
|
|
{
|
|
return LAN8742_STATUS_100MBITS_HALFDUPLEX;
|
|
8000ee4: 2303 movs r3, #3
|
|
8000ee6: e007 b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
else if ((readval & LAN8742_PHYSCSR_HCDSPEEDMASK) == LAN8742_PHYSCSR_10BT_FD)
|
|
8000ee8: 68fb ldr r3, [r7, #12]
|
|
8000eea: f003 031c and.w r3, r3, #28
|
|
8000eee: 2b14 cmp r3, #20
|
|
8000ef0: d101 bne.n 8000ef6 <LAN8742_GetLinkState+0x104>
|
|
{
|
|
return LAN8742_STATUS_10MBITS_FULLDUPLEX;
|
|
8000ef2: 2304 movs r3, #4
|
|
8000ef4: e000 b.n 8000ef8 <LAN8742_GetLinkState+0x106>
|
|
}
|
|
else
|
|
{
|
|
return LAN8742_STATUS_10MBITS_HALFDUPLEX;
|
|
8000ef6: 2305 movs r3, #5
|
|
}
|
|
}
|
|
}
|
|
8000ef8: 4618 mov r0, r3
|
|
8000efa: 3710 adds r7, #16
|
|
8000efc: 46bd mov sp, r7
|
|
8000efe: bd80 pop {r7, pc}
|
|
|
|
08000f00 <HAL_Init>:
|
|
* need to ensure that the SysTick time base is always set to 1 millisecond
|
|
* to have correct HAL operation.
|
|
* @retval HAL status
|
|
*/
|
|
HAL_StatusTypeDef HAL_Init(void)
|
|
{
|
|
8000f00: b580 push {r7, lr}
|
|
8000f02: b082 sub sp, #8
|
|
8000f04: af00 add r7, sp, #0
|
|
__HAL_ART_CONFIG_BASE_ADDRESS(0x08100000UL); /* Configure the Cortex-M4 ART Base address to the Flash Bank 2 : */
|
|
__HAL_ART_ENABLE(); /* Enable the Cortex-M4 ART */
|
|
#endif /* DUAL_CORE && CORE_CM4 */
|
|
|
|
/* Set Interrupt Group Priority */
|
|
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
|
|
8000f06: 2003 movs r0, #3
|
|
8000f08: f000 f970 bl 80011ec <HAL_NVIC_SetPriorityGrouping>
|
|
|
|
/* Update the SystemCoreClock global variable */
|
|
#if defined(RCC_D1CFGR_D1CPRE)
|
|
common_system_clock = HAL_RCC_GetSysClockFreq() >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_D1CPRE)>> RCC_D1CFGR_D1CPRE_Pos]) & 0x1FU);
|
|
8000f0c: f002 fea8 bl 8003c60 <HAL_RCC_GetSysClockFreq>
|
|
8000f10: 4602 mov r2, r0
|
|
8000f12: 4b15 ldr r3, [pc, #84] ; (8000f68 <HAL_Init+0x68>)
|
|
8000f14: 699b ldr r3, [r3, #24]
|
|
8000f16: 0a1b lsrs r3, r3, #8
|
|
8000f18: f003 030f and.w r3, r3, #15
|
|
8000f1c: 4913 ldr r1, [pc, #76] ; (8000f6c <HAL_Init+0x6c>)
|
|
8000f1e: 5ccb ldrb r3, [r1, r3]
|
|
8000f20: f003 031f and.w r3, r3, #31
|
|
8000f24: fa22 f303 lsr.w r3, r2, r3
|
|
8000f28: 607b str r3, [r7, #4]
|
|
common_system_clock = HAL_RCC_GetSysClockFreq() >> ((D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_CDCPRE)>> RCC_CDCFGR1_CDCPRE_Pos]) & 0x1FU);
|
|
#endif
|
|
|
|
/* Update the SystemD2Clock global variable */
|
|
#if defined(RCC_D1CFGR_HPRE)
|
|
SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_HPRE)>> RCC_D1CFGR_HPRE_Pos]) & 0x1FU));
|
|
8000f2a: 4b0f ldr r3, [pc, #60] ; (8000f68 <HAL_Init+0x68>)
|
|
8000f2c: 699b ldr r3, [r3, #24]
|
|
8000f2e: f003 030f and.w r3, r3, #15
|
|
8000f32: 4a0e ldr r2, [pc, #56] ; (8000f6c <HAL_Init+0x6c>)
|
|
8000f34: 5cd3 ldrb r3, [r2, r3]
|
|
8000f36: f003 031f and.w r3, r3, #31
|
|
8000f3a: 687a ldr r2, [r7, #4]
|
|
8000f3c: fa22 f303 lsr.w r3, r2, r3
|
|
8000f40: 4a0b ldr r2, [pc, #44] ; (8000f70 <HAL_Init+0x70>)
|
|
8000f42: 6013 str r3, [r2, #0]
|
|
#endif
|
|
|
|
#if defined(DUAL_CORE) && defined(CORE_CM4)
|
|
SystemCoreClock = SystemD2Clock;
|
|
#else
|
|
SystemCoreClock = common_system_clock;
|
|
8000f44: 4a0b ldr r2, [pc, #44] ; (8000f74 <HAL_Init+0x74>)
|
|
8000f46: 687b ldr r3, [r7, #4]
|
|
8000f48: 6013 str r3, [r2, #0]
|
|
#endif /* DUAL_CORE && CORE_CM4 */
|
|
|
|
/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
|
|
if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK)
|
|
8000f4a: 200f movs r0, #15
|
|
8000f4c: f000 f814 bl 8000f78 <HAL_InitTick>
|
|
8000f50: 4603 mov r3, r0
|
|
8000f52: 2b00 cmp r3, #0
|
|
8000f54: d001 beq.n 8000f5a <HAL_Init+0x5a>
|
|
{
|
|
return HAL_ERROR;
|
|
8000f56: 2301 movs r3, #1
|
|
8000f58: e002 b.n 8000f60 <HAL_Init+0x60>
|
|
}
|
|
|
|
/* Init the low level hardware */
|
|
HAL_MspInit();
|
|
8000f5a: f7ff fcc3 bl 80008e4 <HAL_MspInit>
|
|
|
|
/* Return function status */
|
|
return HAL_OK;
|
|
8000f5e: 2300 movs r3, #0
|
|
}
|
|
8000f60: 4618 mov r0, r3
|
|
8000f62: 3708 adds r7, #8
|
|
8000f64: 46bd mov sp, r7
|
|
8000f66: bd80 pop {r7, pc}
|
|
8000f68: 58024400 .word 0x58024400
|
|
8000f6c: 08014c80 .word 0x08014c80
|
|
8000f70: 24000004 .word 0x24000004
|
|
8000f74: 24000000 .word 0x24000000
|
|
|
|
08000f78 <HAL_InitTick>:
|
|
* implementation in user file.
|
|
* @param TickPriority: Tick interrupt priority.
|
|
* @retval HAL status
|
|
*/
|
|
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
|
{
|
|
8000f78: b580 push {r7, lr}
|
|
8000f7a: b082 sub sp, #8
|
|
8000f7c: af00 add r7, sp, #0
|
|
8000f7e: 6078 str r0, [r7, #4]
|
|
/* Check uwTickFreq for MisraC 2012 (even if uwTickFreq is a enum type that don't take the value zero)*/
|
|
if((uint32_t)uwTickFreq == 0UL)
|
|
8000f80: 4b15 ldr r3, [pc, #84] ; (8000fd8 <HAL_InitTick+0x60>)
|
|
8000f82: 781b ldrb r3, [r3, #0]
|
|
8000f84: 2b00 cmp r3, #0
|
|
8000f86: d101 bne.n 8000f8c <HAL_InitTick+0x14>
|
|
{
|
|
return HAL_ERROR;
|
|
8000f88: 2301 movs r3, #1
|
|
8000f8a: e021 b.n 8000fd0 <HAL_InitTick+0x58>
|
|
}
|
|
|
|
/* Configure the SysTick to have interrupt in 1ms time basis*/
|
|
if (HAL_SYSTICK_Config(SystemCoreClock / (1000UL / (uint32_t)uwTickFreq)) > 0U)
|
|
8000f8c: 4b13 ldr r3, [pc, #76] ; (8000fdc <HAL_InitTick+0x64>)
|
|
8000f8e: 681a ldr r2, [r3, #0]
|
|
8000f90: 4b11 ldr r3, [pc, #68] ; (8000fd8 <HAL_InitTick+0x60>)
|
|
8000f92: 781b ldrb r3, [r3, #0]
|
|
8000f94: 4619 mov r1, r3
|
|
8000f96: f44f 737a mov.w r3, #1000 ; 0x3e8
|
|
8000f9a: fbb3 f3f1 udiv r3, r3, r1
|
|
8000f9e: fbb2 f3f3 udiv r3, r2, r3
|
|
8000fa2: 4618 mov r0, r3
|
|
8000fa4: f000 f955 bl 8001252 <HAL_SYSTICK_Config>
|
|
8000fa8: 4603 mov r3, r0
|
|
8000faa: 2b00 cmp r3, #0
|
|
8000fac: d001 beq.n 8000fb2 <HAL_InitTick+0x3a>
|
|
{
|
|
return HAL_ERROR;
|
|
8000fae: 2301 movs r3, #1
|
|
8000fb0: e00e b.n 8000fd0 <HAL_InitTick+0x58>
|
|
}
|
|
|
|
/* Configure the SysTick IRQ priority */
|
|
if (TickPriority < (1UL << __NVIC_PRIO_BITS))
|
|
8000fb2: 687b ldr r3, [r7, #4]
|
|
8000fb4: 2b0f cmp r3, #15
|
|
8000fb6: d80a bhi.n 8000fce <HAL_InitTick+0x56>
|
|
{
|
|
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
|
|
8000fb8: 2200 movs r2, #0
|
|
8000fba: 6879 ldr r1, [r7, #4]
|
|
8000fbc: f04f 30ff mov.w r0, #4294967295
|
|
8000fc0: f000 f91f bl 8001202 <HAL_NVIC_SetPriority>
|
|
uwTickPrio = TickPriority;
|
|
8000fc4: 4a06 ldr r2, [pc, #24] ; (8000fe0 <HAL_InitTick+0x68>)
|
|
8000fc6: 687b ldr r3, [r7, #4]
|
|
8000fc8: 6013 str r3, [r2, #0]
|
|
{
|
|
return HAL_ERROR;
|
|
}
|
|
|
|
/* Return function status */
|
|
return HAL_OK;
|
|
8000fca: 2300 movs r3, #0
|
|
8000fcc: e000 b.n 8000fd0 <HAL_InitTick+0x58>
|
|
return HAL_ERROR;
|
|
8000fce: 2301 movs r3, #1
|
|
}
|
|
8000fd0: 4618 mov r0, r3
|
|
8000fd2: 3708 adds r7, #8
|
|
8000fd4: 46bd mov sp, r7
|
|
8000fd6: bd80 pop {r7, pc}
|
|
8000fd8: 2400000c .word 0x2400000c
|
|
8000fdc: 24000000 .word 0x24000000
|
|
8000fe0: 24000008 .word 0x24000008
|
|
|
|
08000fe4 <HAL_IncTick>:
|
|
* @note This function is declared as __weak to be overwritten in case of other
|
|
* implementations in user file.
|
|
* @retval None
|
|
*/
|
|
__weak void HAL_IncTick(void)
|
|
{
|
|
8000fe4: b480 push {r7}
|
|
8000fe6: af00 add r7, sp, #0
|
|
uwTick += (uint32_t)uwTickFreq;
|
|
8000fe8: 4b06 ldr r3, [pc, #24] ; (8001004 <HAL_IncTick+0x20>)
|
|
8000fea: 781b ldrb r3, [r3, #0]
|
|
8000fec: 461a mov r2, r3
|
|
8000fee: 4b06 ldr r3, [pc, #24] ; (8001008 <HAL_IncTick+0x24>)
|
|
8000ff0: 681b ldr r3, [r3, #0]
|
|
8000ff2: 4413 add r3, r2
|
|
8000ff4: 4a04 ldr r2, [pc, #16] ; (8001008 <HAL_IncTick+0x24>)
|
|
8000ff6: 6013 str r3, [r2, #0]
|
|
}
|
|
8000ff8: bf00 nop
|
|
8000ffa: 46bd mov sp, r7
|
|
8000ffc: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001000: 4770 bx lr
|
|
8001002: bf00 nop
|
|
8001004: 2400000c .word 0x2400000c
|
|
8001008: 24000128 .word 0x24000128
|
|
|
|
0800100c <HAL_GetTick>:
|
|
* @note This function is declared as __weak to be overwritten in case of other
|
|
* implementations in user file.
|
|
* @retval tick value
|
|
*/
|
|
__weak uint32_t HAL_GetTick(void)
|
|
{
|
|
800100c: b480 push {r7}
|
|
800100e: af00 add r7, sp, #0
|
|
return uwTick;
|
|
8001010: 4b03 ldr r3, [pc, #12] ; (8001020 <HAL_GetTick+0x14>)
|
|
8001012: 681b ldr r3, [r3, #0]
|
|
}
|
|
8001014: 4618 mov r0, r3
|
|
8001016: 46bd mov sp, r7
|
|
8001018: f85d 7b04 ldr.w r7, [sp], #4
|
|
800101c: 4770 bx lr
|
|
800101e: bf00 nop
|
|
8001020: 24000128 .word 0x24000128
|
|
|
|
08001024 <HAL_SYSCFG_ETHInterfaceSelect>:
|
|
* @arg SYSCFG_ETH_MII : Select the Media Independent Interface
|
|
* @arg SYSCFG_ETH_RMII: Select the Reduced Media Independent Interface
|
|
* @retval None
|
|
*/
|
|
void HAL_SYSCFG_ETHInterfaceSelect(uint32_t SYSCFG_ETHInterface)
|
|
{
|
|
8001024: b480 push {r7}
|
|
8001026: b083 sub sp, #12
|
|
8001028: af00 add r7, sp, #0
|
|
800102a: 6078 str r0, [r7, #4]
|
|
/* Check the parameter */
|
|
assert_param(IS_SYSCFG_ETHERNET_CONFIG(SYSCFG_ETHInterface));
|
|
|
|
MODIFY_REG(SYSCFG->PMCR, SYSCFG_PMCR_EPIS_SEL, (uint32_t)(SYSCFG_ETHInterface));
|
|
800102c: 4b06 ldr r3, [pc, #24] ; (8001048 <HAL_SYSCFG_ETHInterfaceSelect+0x24>)
|
|
800102e: 685b ldr r3, [r3, #4]
|
|
8001030: f423 0260 bic.w r2, r3, #14680064 ; 0xe00000
|
|
8001034: 4904 ldr r1, [pc, #16] ; (8001048 <HAL_SYSCFG_ETHInterfaceSelect+0x24>)
|
|
8001036: 687b ldr r3, [r7, #4]
|
|
8001038: 4313 orrs r3, r2
|
|
800103a: 604b str r3, [r1, #4]
|
|
}
|
|
800103c: bf00 nop
|
|
800103e: 370c adds r7, #12
|
|
8001040: 46bd mov sp, r7
|
|
8001042: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001046: 4770 bx lr
|
|
8001048: 58000400 .word 0x58000400
|
|
|
|
0800104c <__NVIC_SetPriorityGrouping>:
|
|
{
|
|
800104c: b480 push {r7}
|
|
800104e: b085 sub sp, #20
|
|
8001050: af00 add r7, sp, #0
|
|
8001052: 6078 str r0, [r7, #4]
|
|
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
|
|
8001054: 687b ldr r3, [r7, #4]
|
|
8001056: f003 0307 and.w r3, r3, #7
|
|
800105a: 60fb str r3, [r7, #12]
|
|
reg_value = SCB->AIRCR; /* read old register configuration */
|
|
800105c: 4b0b ldr r3, [pc, #44] ; (800108c <__NVIC_SetPriorityGrouping+0x40>)
|
|
800105e: 68db ldr r3, [r3, #12]
|
|
8001060: 60bb str r3, [r7, #8]
|
|
reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */
|
|
8001062: 68ba ldr r2, [r7, #8]
|
|
8001064: f64f 03ff movw r3, #63743 ; 0xf8ff
|
|
8001068: 4013 ands r3, r2
|
|
800106a: 60bb str r3, [r7, #8]
|
|
(PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */
|
|
800106c: 68fb ldr r3, [r7, #12]
|
|
800106e: 021a lsls r2, r3, #8
|
|
((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
|
|
8001070: 68bb ldr r3, [r7, #8]
|
|
8001072: 431a orrs r2, r3
|
|
reg_value = (reg_value |
|
|
8001074: 4b06 ldr r3, [pc, #24] ; (8001090 <__NVIC_SetPriorityGrouping+0x44>)
|
|
8001076: 4313 orrs r3, r2
|
|
8001078: 60bb str r3, [r7, #8]
|
|
SCB->AIRCR = reg_value;
|
|
800107a: 4a04 ldr r2, [pc, #16] ; (800108c <__NVIC_SetPriorityGrouping+0x40>)
|
|
800107c: 68bb ldr r3, [r7, #8]
|
|
800107e: 60d3 str r3, [r2, #12]
|
|
}
|
|
8001080: bf00 nop
|
|
8001082: 3714 adds r7, #20
|
|
8001084: 46bd mov sp, r7
|
|
8001086: f85d 7b04 ldr.w r7, [sp], #4
|
|
800108a: 4770 bx lr
|
|
800108c: e000ed00 .word 0xe000ed00
|
|
8001090: 05fa0000 .word 0x05fa0000
|
|
|
|
08001094 <__NVIC_GetPriorityGrouping>:
|
|
{
|
|
8001094: b480 push {r7}
|
|
8001096: af00 add r7, sp, #0
|
|
return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));
|
|
8001098: 4b04 ldr r3, [pc, #16] ; (80010ac <__NVIC_GetPriorityGrouping+0x18>)
|
|
800109a: 68db ldr r3, [r3, #12]
|
|
800109c: 0a1b lsrs r3, r3, #8
|
|
800109e: f003 0307 and.w r3, r3, #7
|
|
}
|
|
80010a2: 4618 mov r0, r3
|
|
80010a4: 46bd mov sp, r7
|
|
80010a6: f85d 7b04 ldr.w r7, [sp], #4
|
|
80010aa: 4770 bx lr
|
|
80010ac: e000ed00 .word 0xe000ed00
|
|
|
|
080010b0 <__NVIC_EnableIRQ>:
|
|
{
|
|
80010b0: b480 push {r7}
|
|
80010b2: b083 sub sp, #12
|
|
80010b4: af00 add r7, sp, #0
|
|
80010b6: 4603 mov r3, r0
|
|
80010b8: 80fb strh r3, [r7, #6]
|
|
if ((int32_t)(IRQn) >= 0)
|
|
80010ba: f9b7 3006 ldrsh.w r3, [r7, #6]
|
|
80010be: 2b00 cmp r3, #0
|
|
80010c0: db0b blt.n 80010da <__NVIC_EnableIRQ+0x2a>
|
|
NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
|
80010c2: 88fb ldrh r3, [r7, #6]
|
|
80010c4: f003 021f and.w r2, r3, #31
|
|
80010c8: 4907 ldr r1, [pc, #28] ; (80010e8 <__NVIC_EnableIRQ+0x38>)
|
|
80010ca: f9b7 3006 ldrsh.w r3, [r7, #6]
|
|
80010ce: 095b lsrs r3, r3, #5
|
|
80010d0: 2001 movs r0, #1
|
|
80010d2: fa00 f202 lsl.w r2, r0, r2
|
|
80010d6: f841 2023 str.w r2, [r1, r3, lsl #2]
|
|
}
|
|
80010da: bf00 nop
|
|
80010dc: 370c adds r7, #12
|
|
80010de: 46bd mov sp, r7
|
|
80010e0: f85d 7b04 ldr.w r7, [sp], #4
|
|
80010e4: 4770 bx lr
|
|
80010e6: bf00 nop
|
|
80010e8: e000e100 .word 0xe000e100
|
|
|
|
080010ec <__NVIC_SetPriority>:
|
|
{
|
|
80010ec: b480 push {r7}
|
|
80010ee: b083 sub sp, #12
|
|
80010f0: af00 add r7, sp, #0
|
|
80010f2: 4603 mov r3, r0
|
|
80010f4: 6039 str r1, [r7, #0]
|
|
80010f6: 80fb strh r3, [r7, #6]
|
|
if ((int32_t)(IRQn) >= 0)
|
|
80010f8: f9b7 3006 ldrsh.w r3, [r7, #6]
|
|
80010fc: 2b00 cmp r3, #0
|
|
80010fe: db0a blt.n 8001116 <__NVIC_SetPriority+0x2a>
|
|
NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
|
|
8001100: 683b ldr r3, [r7, #0]
|
|
8001102: b2da uxtb r2, r3
|
|
8001104: 490c ldr r1, [pc, #48] ; (8001138 <__NVIC_SetPriority+0x4c>)
|
|
8001106: f9b7 3006 ldrsh.w r3, [r7, #6]
|
|
800110a: 0112 lsls r2, r2, #4
|
|
800110c: b2d2 uxtb r2, r2
|
|
800110e: 440b add r3, r1
|
|
8001110: f883 2300 strb.w r2, [r3, #768] ; 0x300
|
|
}
|
|
8001114: e00a b.n 800112c <__NVIC_SetPriority+0x40>
|
|
SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
|
|
8001116: 683b ldr r3, [r7, #0]
|
|
8001118: b2da uxtb r2, r3
|
|
800111a: 4908 ldr r1, [pc, #32] ; (800113c <__NVIC_SetPriority+0x50>)
|
|
800111c: 88fb ldrh r3, [r7, #6]
|
|
800111e: f003 030f and.w r3, r3, #15
|
|
8001122: 3b04 subs r3, #4
|
|
8001124: 0112 lsls r2, r2, #4
|
|
8001126: b2d2 uxtb r2, r2
|
|
8001128: 440b add r3, r1
|
|
800112a: 761a strb r2, [r3, #24]
|
|
}
|
|
800112c: bf00 nop
|
|
800112e: 370c adds r7, #12
|
|
8001130: 46bd mov sp, r7
|
|
8001132: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001136: 4770 bx lr
|
|
8001138: e000e100 .word 0xe000e100
|
|
800113c: e000ed00 .word 0xe000ed00
|
|
|
|
08001140 <NVIC_EncodePriority>:
|
|
{
|
|
8001140: b480 push {r7}
|
|
8001142: b089 sub sp, #36 ; 0x24
|
|
8001144: af00 add r7, sp, #0
|
|
8001146: 60f8 str r0, [r7, #12]
|
|
8001148: 60b9 str r1, [r7, #8]
|
|
800114a: 607a str r2, [r7, #4]
|
|
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
|
|
800114c: 68fb ldr r3, [r7, #12]
|
|
800114e: f003 0307 and.w r3, r3, #7
|
|
8001152: 61fb str r3, [r7, #28]
|
|
PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
|
|
8001154: 69fb ldr r3, [r7, #28]
|
|
8001156: f1c3 0307 rsb r3, r3, #7
|
|
800115a: 2b04 cmp r3, #4
|
|
800115c: bf28 it cs
|
|
800115e: 2304 movcs r3, #4
|
|
8001160: 61bb str r3, [r7, #24]
|
|
SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
|
|
8001162: 69fb ldr r3, [r7, #28]
|
|
8001164: 3304 adds r3, #4
|
|
8001166: 2b06 cmp r3, #6
|
|
8001168: d902 bls.n 8001170 <NVIC_EncodePriority+0x30>
|
|
800116a: 69fb ldr r3, [r7, #28]
|
|
800116c: 3b03 subs r3, #3
|
|
800116e: e000 b.n 8001172 <NVIC_EncodePriority+0x32>
|
|
8001170: 2300 movs r3, #0
|
|
8001172: 617b str r3, [r7, #20]
|
|
((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
|
|
8001174: f04f 32ff mov.w r2, #4294967295
|
|
8001178: 69bb ldr r3, [r7, #24]
|
|
800117a: fa02 f303 lsl.w r3, r2, r3
|
|
800117e: 43da mvns r2, r3
|
|
8001180: 68bb ldr r3, [r7, #8]
|
|
8001182: 401a ands r2, r3
|
|
8001184: 697b ldr r3, [r7, #20]
|
|
8001186: 409a lsls r2, r3
|
|
((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
|
|
8001188: f04f 31ff mov.w r1, #4294967295
|
|
800118c: 697b ldr r3, [r7, #20]
|
|
800118e: fa01 f303 lsl.w r3, r1, r3
|
|
8001192: 43d9 mvns r1, r3
|
|
8001194: 687b ldr r3, [r7, #4]
|
|
8001196: 400b ands r3, r1
|
|
((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
|
|
8001198: 4313 orrs r3, r2
|
|
}
|
|
800119a: 4618 mov r0, r3
|
|
800119c: 3724 adds r7, #36 ; 0x24
|
|
800119e: 46bd mov sp, r7
|
|
80011a0: f85d 7b04 ldr.w r7, [sp], #4
|
|
80011a4: 4770 bx lr
|
|
...
|
|
|
|
080011a8 <SysTick_Config>:
|
|
{
|
|
80011a8: b580 push {r7, lr}
|
|
80011aa: b082 sub sp, #8
|
|
80011ac: af00 add r7, sp, #0
|
|
80011ae: 6078 str r0, [r7, #4]
|
|
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
|
|
80011b0: 687b ldr r3, [r7, #4]
|
|
80011b2: 3b01 subs r3, #1
|
|
80011b4: f1b3 7f80 cmp.w r3, #16777216 ; 0x1000000
|
|
80011b8: d301 bcc.n 80011be <SysTick_Config+0x16>
|
|
return (1UL); /* Reload value impossible */
|
|
80011ba: 2301 movs r3, #1
|
|
80011bc: e00f b.n 80011de <SysTick_Config+0x36>
|
|
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
|
|
80011be: 4a0a ldr r2, [pc, #40] ; (80011e8 <SysTick_Config+0x40>)
|
|
80011c0: 687b ldr r3, [r7, #4]
|
|
80011c2: 3b01 subs r3, #1
|
|
80011c4: 6053 str r3, [r2, #4]
|
|
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
|
|
80011c6: 210f movs r1, #15
|
|
80011c8: f04f 30ff mov.w r0, #4294967295
|
|
80011cc: f7ff ff8e bl 80010ec <__NVIC_SetPriority>
|
|
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
|
80011d0: 4b05 ldr r3, [pc, #20] ; (80011e8 <SysTick_Config+0x40>)
|
|
80011d2: 2200 movs r2, #0
|
|
80011d4: 609a str r2, [r3, #8]
|
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
|
|
80011d6: 4b04 ldr r3, [pc, #16] ; (80011e8 <SysTick_Config+0x40>)
|
|
80011d8: 2207 movs r2, #7
|
|
80011da: 601a str r2, [r3, #0]
|
|
return (0UL); /* Function successful */
|
|
80011dc: 2300 movs r3, #0
|
|
}
|
|
80011de: 4618 mov r0, r3
|
|
80011e0: 3708 adds r7, #8
|
|
80011e2: 46bd mov sp, r7
|
|
80011e4: bd80 pop {r7, pc}
|
|
80011e6: bf00 nop
|
|
80011e8: e000e010 .word 0xe000e010
|
|
|
|
080011ec <HAL_NVIC_SetPriorityGrouping>:
|
|
* @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible.
|
|
* The pending IRQ priority will be managed only by the subpriority.
|
|
* @retval None
|
|
*/
|
|
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
|
|
{
|
|
80011ec: b580 push {r7, lr}
|
|
80011ee: b082 sub sp, #8
|
|
80011f0: af00 add r7, sp, #0
|
|
80011f2: 6078 str r0, [r7, #4]
|
|
/* Check the parameters */
|
|
assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
|
|
|
|
/* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */
|
|
NVIC_SetPriorityGrouping(PriorityGroup);
|
|
80011f4: 6878 ldr r0, [r7, #4]
|
|
80011f6: f7ff ff29 bl 800104c <__NVIC_SetPriorityGrouping>
|
|
}
|
|
80011fa: bf00 nop
|
|
80011fc: 3708 adds r7, #8
|
|
80011fe: 46bd mov sp, r7
|
|
8001200: bd80 pop {r7, pc}
|
|
|
|
08001202 <HAL_NVIC_SetPriority>:
|
|
* This parameter can be a value between 0 and 15
|
|
* A lower priority value indicates a higher priority.
|
|
* @retval None
|
|
*/
|
|
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
|
|
{
|
|
8001202: b580 push {r7, lr}
|
|
8001204: b086 sub sp, #24
|
|
8001206: af00 add r7, sp, #0
|
|
8001208: 4603 mov r3, r0
|
|
800120a: 60b9 str r1, [r7, #8]
|
|
800120c: 607a str r2, [r7, #4]
|
|
800120e: 81fb strh r3, [r7, #14]
|
|
|
|
/* Check the parameters */
|
|
assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
|
|
assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
|
|
|
|
prioritygroup = NVIC_GetPriorityGrouping();
|
|
8001210: f7ff ff40 bl 8001094 <__NVIC_GetPriorityGrouping>
|
|
8001214: 6178 str r0, [r7, #20]
|
|
|
|
NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
|
|
8001216: 687a ldr r2, [r7, #4]
|
|
8001218: 68b9 ldr r1, [r7, #8]
|
|
800121a: 6978 ldr r0, [r7, #20]
|
|
800121c: f7ff ff90 bl 8001140 <NVIC_EncodePriority>
|
|
8001220: 4602 mov r2, r0
|
|
8001222: f9b7 300e ldrsh.w r3, [r7, #14]
|
|
8001226: 4611 mov r1, r2
|
|
8001228: 4618 mov r0, r3
|
|
800122a: f7ff ff5f bl 80010ec <__NVIC_SetPriority>
|
|
}
|
|
800122e: bf00 nop
|
|
8001230: 3718 adds r7, #24
|
|
8001232: 46bd mov sp, r7
|
|
8001234: bd80 pop {r7, pc}
|
|
|
|
08001236 <HAL_NVIC_EnableIRQ>:
|
|
* This parameter can be an enumerator of IRQn_Type enumeration
|
|
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32h7xxxx.h))
|
|
* @retval None
|
|
*/
|
|
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
|
|
{
|
|
8001236: b580 push {r7, lr}
|
|
8001238: b082 sub sp, #8
|
|
800123a: af00 add r7, sp, #0
|
|
800123c: 4603 mov r3, r0
|
|
800123e: 80fb strh r3, [r7, #6]
|
|
/* Check the parameters */
|
|
assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
|
|
|
|
/* Enable interrupt */
|
|
NVIC_EnableIRQ(IRQn);
|
|
8001240: f9b7 3006 ldrsh.w r3, [r7, #6]
|
|
8001244: 4618 mov r0, r3
|
|
8001246: f7ff ff33 bl 80010b0 <__NVIC_EnableIRQ>
|
|
}
|
|
800124a: bf00 nop
|
|
800124c: 3708 adds r7, #8
|
|
800124e: 46bd mov sp, r7
|
|
8001250: bd80 pop {r7, pc}
|
|
|
|
08001252 <HAL_SYSTICK_Config>:
|
|
* @param TicksNumb Specifies the ticks Number of ticks between two interrupts.
|
|
* @retval status - 0 Function succeeded.
|
|
* - 1 Function failed.
|
|
*/
|
|
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
|
|
{
|
|
8001252: b580 push {r7, lr}
|
|
8001254: b082 sub sp, #8
|
|
8001256: af00 add r7, sp, #0
|
|
8001258: 6078 str r0, [r7, #4]
|
|
return SysTick_Config(TicksNumb);
|
|
800125a: 6878 ldr r0, [r7, #4]
|
|
800125c: f7ff ffa4 bl 80011a8 <SysTick_Config>
|
|
8001260: 4603 mov r3, r0
|
|
}
|
|
8001262: 4618 mov r0, r3
|
|
8001264: 3708 adds r7, #8
|
|
8001266: 46bd mov sp, r7
|
|
8001268: bd80 pop {r7, pc}
|
|
...
|
|
|
|
0800126c <HAL_MPU_Disable>:
|
|
/**
|
|
* @brief Disables the MPU
|
|
* @retval None
|
|
*/
|
|
void HAL_MPU_Disable(void)
|
|
{
|
|
800126c: b480 push {r7}
|
|
800126e: af00 add r7, sp, #0
|
|
\details Ensures the apparent order of the explicit memory operations before
|
|
and after the instruction, without ensuring their completion.
|
|
*/
|
|
__STATIC_FORCEINLINE void __DMB(void)
|
|
{
|
|
__ASM volatile ("dmb 0xF":::"memory");
|
|
8001270: f3bf 8f5f dmb sy
|
|
}
|
|
8001274: bf00 nop
|
|
/* Make sure outstanding transfers are done */
|
|
__DMB();
|
|
|
|
/* Disable fault exceptions */
|
|
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
|
|
8001276: 4b07 ldr r3, [pc, #28] ; (8001294 <HAL_MPU_Disable+0x28>)
|
|
8001278: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800127a: 4a06 ldr r2, [pc, #24] ; (8001294 <HAL_MPU_Disable+0x28>)
|
|
800127c: f423 3380 bic.w r3, r3, #65536 ; 0x10000
|
|
8001280: 6253 str r3, [r2, #36] ; 0x24
|
|
|
|
/* Disable the MPU and clear the control register*/
|
|
MPU->CTRL = 0;
|
|
8001282: 4b05 ldr r3, [pc, #20] ; (8001298 <HAL_MPU_Disable+0x2c>)
|
|
8001284: 2200 movs r2, #0
|
|
8001286: 605a str r2, [r3, #4]
|
|
}
|
|
8001288: bf00 nop
|
|
800128a: 46bd mov sp, r7
|
|
800128c: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001290: 4770 bx lr
|
|
8001292: bf00 nop
|
|
8001294: e000ed00 .word 0xe000ed00
|
|
8001298: e000ed90 .word 0xe000ed90
|
|
|
|
0800129c <HAL_MPU_Enable>:
|
|
* @arg MPU_PRIVILEGED_DEFAULT
|
|
* @arg MPU_HFNMI_PRIVDEF
|
|
* @retval None
|
|
*/
|
|
void HAL_MPU_Enable(uint32_t MPU_Control)
|
|
{
|
|
800129c: b480 push {r7}
|
|
800129e: b083 sub sp, #12
|
|
80012a0: af00 add r7, sp, #0
|
|
80012a2: 6078 str r0, [r7, #4]
|
|
/* Enable the MPU */
|
|
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
|
|
80012a4: 4a0b ldr r2, [pc, #44] ; (80012d4 <HAL_MPU_Enable+0x38>)
|
|
80012a6: 687b ldr r3, [r7, #4]
|
|
80012a8: f043 0301 orr.w r3, r3, #1
|
|
80012ac: 6053 str r3, [r2, #4]
|
|
|
|
/* Enable fault exceptions */
|
|
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
|
|
80012ae: 4b0a ldr r3, [pc, #40] ; (80012d8 <HAL_MPU_Enable+0x3c>)
|
|
80012b0: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
80012b2: 4a09 ldr r2, [pc, #36] ; (80012d8 <HAL_MPU_Enable+0x3c>)
|
|
80012b4: f443 3380 orr.w r3, r3, #65536 ; 0x10000
|
|
80012b8: 6253 str r3, [r2, #36] ; 0x24
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
80012ba: f3bf 8f4f dsb sy
|
|
}
|
|
80012be: bf00 nop
|
|
__ASM volatile ("isb 0xF":::"memory");
|
|
80012c0: f3bf 8f6f isb sy
|
|
}
|
|
80012c4: bf00 nop
|
|
|
|
/* Ensure MPU setting take effects */
|
|
__DSB();
|
|
__ISB();
|
|
}
|
|
80012c6: bf00 nop
|
|
80012c8: 370c adds r7, #12
|
|
80012ca: 46bd mov sp, r7
|
|
80012cc: f85d 7b04 ldr.w r7, [sp], #4
|
|
80012d0: 4770 bx lr
|
|
80012d2: bf00 nop
|
|
80012d4: e000ed90 .word 0xe000ed90
|
|
80012d8: e000ed00 .word 0xe000ed00
|
|
|
|
080012dc <HAL_MPU_ConfigRegion>:
|
|
* @param MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains
|
|
* the initialization and configuration information.
|
|
* @retval None
|
|
*/
|
|
void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init)
|
|
{
|
|
80012dc: b480 push {r7}
|
|
80012de: b083 sub sp, #12
|
|
80012e0: af00 add r7, sp, #0
|
|
80012e2: 6078 str r0, [r7, #4]
|
|
/* Check the parameters */
|
|
assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number));
|
|
assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable));
|
|
|
|
/* Set the Region number */
|
|
MPU->RNR = MPU_Init->Number;
|
|
80012e4: 687b ldr r3, [r7, #4]
|
|
80012e6: 785a ldrb r2, [r3, #1]
|
|
80012e8: 4b1d ldr r3, [pc, #116] ; (8001360 <HAL_MPU_ConfigRegion+0x84>)
|
|
80012ea: 609a str r2, [r3, #8]
|
|
|
|
if ((MPU_Init->Enable) != 0UL)
|
|
80012ec: 687b ldr r3, [r7, #4]
|
|
80012ee: 781b ldrb r3, [r3, #0]
|
|
80012f0: 2b00 cmp r3, #0
|
|
80012f2: d029 beq.n 8001348 <HAL_MPU_ConfigRegion+0x6c>
|
|
assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable));
|
|
assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable));
|
|
assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable));
|
|
assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size));
|
|
|
|
MPU->RBAR = MPU_Init->BaseAddress;
|
|
80012f4: 4a1a ldr r2, [pc, #104] ; (8001360 <HAL_MPU_ConfigRegion+0x84>)
|
|
80012f6: 687b ldr r3, [r7, #4]
|
|
80012f8: 685b ldr r3, [r3, #4]
|
|
80012fa: 60d3 str r3, [r2, #12]
|
|
MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) |
|
|
80012fc: 687b ldr r3, [r7, #4]
|
|
80012fe: 7b1b ldrb r3, [r3, #12]
|
|
8001300: 071a lsls r2, r3, #28
|
|
((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) |
|
|
8001302: 687b ldr r3, [r7, #4]
|
|
8001304: 7adb ldrb r3, [r3, #11]
|
|
8001306: 061b lsls r3, r3, #24
|
|
MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) |
|
|
8001308: 431a orrs r2, r3
|
|
((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) |
|
|
800130a: 687b ldr r3, [r7, #4]
|
|
800130c: 7a9b ldrb r3, [r3, #10]
|
|
800130e: 04db lsls r3, r3, #19
|
|
((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) |
|
|
8001310: 431a orrs r2, r3
|
|
((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) |
|
|
8001312: 687b ldr r3, [r7, #4]
|
|
8001314: 7b5b ldrb r3, [r3, #13]
|
|
8001316: 049b lsls r3, r3, #18
|
|
((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) |
|
|
8001318: 431a orrs r2, r3
|
|
((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) |
|
|
800131a: 687b ldr r3, [r7, #4]
|
|
800131c: 7b9b ldrb r3, [r3, #14]
|
|
800131e: 045b lsls r3, r3, #17
|
|
((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) |
|
|
8001320: 431a orrs r2, r3
|
|
((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) |
|
|
8001322: 687b ldr r3, [r7, #4]
|
|
8001324: 7bdb ldrb r3, [r3, #15]
|
|
8001326: 041b lsls r3, r3, #16
|
|
((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) |
|
|
8001328: 431a orrs r2, r3
|
|
((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) |
|
|
800132a: 687b ldr r3, [r7, #4]
|
|
800132c: 7a5b ldrb r3, [r3, #9]
|
|
800132e: 021b lsls r3, r3, #8
|
|
((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) |
|
|
8001330: 431a orrs r2, r3
|
|
((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) |
|
|
8001332: 687b ldr r3, [r7, #4]
|
|
8001334: 7a1b ldrb r3, [r3, #8]
|
|
8001336: 005b lsls r3, r3, #1
|
|
((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) |
|
|
8001338: 4313 orrs r3, r2
|
|
((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos);
|
|
800133a: 687a ldr r2, [r7, #4]
|
|
800133c: 7812 ldrb r2, [r2, #0]
|
|
800133e: 4611 mov r1, r2
|
|
MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) |
|
|
8001340: 4a07 ldr r2, [pc, #28] ; (8001360 <HAL_MPU_ConfigRegion+0x84>)
|
|
((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) |
|
|
8001342: 430b orrs r3, r1
|
|
MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) |
|
|
8001344: 6113 str r3, [r2, #16]
|
|
else
|
|
{
|
|
MPU->RBAR = 0x00;
|
|
MPU->RASR = 0x00;
|
|
}
|
|
}
|
|
8001346: e005 b.n 8001354 <HAL_MPU_ConfigRegion+0x78>
|
|
MPU->RBAR = 0x00;
|
|
8001348: 4b05 ldr r3, [pc, #20] ; (8001360 <HAL_MPU_ConfigRegion+0x84>)
|
|
800134a: 2200 movs r2, #0
|
|
800134c: 60da str r2, [r3, #12]
|
|
MPU->RASR = 0x00;
|
|
800134e: 4b04 ldr r3, [pc, #16] ; (8001360 <HAL_MPU_ConfigRegion+0x84>)
|
|
8001350: 2200 movs r2, #0
|
|
8001352: 611a str r2, [r3, #16]
|
|
}
|
|
8001354: bf00 nop
|
|
8001356: 370c adds r7, #12
|
|
8001358: 46bd mov sp, r7
|
|
800135a: f85d 7b04 ldr.w r7, [sp], #4
|
|
800135e: 4770 bx lr
|
|
8001360: e000ed90 .word 0xe000ed90
|
|
|
|
08001364 <HAL_ETH_Init>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval HAL status
|
|
*/
|
|
HAL_StatusTypeDef HAL_ETH_Init(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001364: b580 push {r7, lr}
|
|
8001366: b084 sub sp, #16
|
|
8001368: af00 add r7, sp, #0
|
|
800136a: 6078 str r0, [r7, #4]
|
|
uint32_t tickstart;
|
|
|
|
if (heth == NULL)
|
|
800136c: 687b ldr r3, [r7, #4]
|
|
800136e: 2b00 cmp r3, #0
|
|
8001370: d101 bne.n 8001376 <HAL_ETH_Init+0x12>
|
|
{
|
|
return HAL_ERROR;
|
|
8001372: 2301 movs r3, #1
|
|
8001374: e0cf b.n 8001516 <HAL_ETH_Init+0x1b2>
|
|
}
|
|
if (heth->gState == HAL_ETH_STATE_RESET)
|
|
8001376: 687b ldr r3, [r7, #4]
|
|
8001378: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
800137c: 2b00 cmp r3, #0
|
|
800137e: d106 bne.n 800138e <HAL_ETH_Init+0x2a>
|
|
{
|
|
heth->gState = HAL_ETH_STATE_BUSY;
|
|
8001380: 687b ldr r3, [r7, #4]
|
|
8001382: 2223 movs r2, #35 ; 0x23
|
|
8001384: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
|
|
/* Init the low level hardware */
|
|
heth->MspInitCallback(heth);
|
|
#else
|
|
/* Init the low level hardware : GPIO, CLOCK, NVIC. */
|
|
HAL_ETH_MspInit(heth);
|
|
8001388: 6878 ldr r0, [r7, #4]
|
|
800138a: f003 fe99 bl 80050c0 <HAL_ETH_MspInit>
|
|
|
|
#endif /* (USE_HAL_ETH_REGISTER_CALLBACKS) */
|
|
}
|
|
|
|
__HAL_RCC_SYSCFG_CLK_ENABLE();
|
|
800138e: 4b64 ldr r3, [pc, #400] ; (8001520 <HAL_ETH_Init+0x1bc>)
|
|
8001390: f8d3 30f4 ldr.w r3, [r3, #244] ; 0xf4
|
|
8001394: 4a62 ldr r2, [pc, #392] ; (8001520 <HAL_ETH_Init+0x1bc>)
|
|
8001396: f043 0302 orr.w r3, r3, #2
|
|
800139a: f8c2 30f4 str.w r3, [r2, #244] ; 0xf4
|
|
800139e: 4b60 ldr r3, [pc, #384] ; (8001520 <HAL_ETH_Init+0x1bc>)
|
|
80013a0: f8d3 30f4 ldr.w r3, [r3, #244] ; 0xf4
|
|
80013a4: f003 0302 and.w r3, r3, #2
|
|
80013a8: 60bb str r3, [r7, #8]
|
|
80013aa: 68bb ldr r3, [r7, #8]
|
|
|
|
if (heth->Init.MediaInterface == HAL_ETH_MII_MODE)
|
|
80013ac: 687b ldr r3, [r7, #4]
|
|
80013ae: 7a1b ldrb r3, [r3, #8]
|
|
80013b0: 2b00 cmp r3, #0
|
|
80013b2: d103 bne.n 80013bc <HAL_ETH_Init+0x58>
|
|
{
|
|
HAL_SYSCFG_ETHInterfaceSelect(SYSCFG_ETH_MII);
|
|
80013b4: 2000 movs r0, #0
|
|
80013b6: f7ff fe35 bl 8001024 <HAL_SYSCFG_ETHInterfaceSelect>
|
|
80013ba: e003 b.n 80013c4 <HAL_ETH_Init+0x60>
|
|
}
|
|
else
|
|
{
|
|
HAL_SYSCFG_ETHInterfaceSelect(SYSCFG_ETH_RMII);
|
|
80013bc: f44f 0000 mov.w r0, #8388608 ; 0x800000
|
|
80013c0: f7ff fe30 bl 8001024 <HAL_SYSCFG_ETHInterfaceSelect>
|
|
}
|
|
|
|
/* Dummy read to sync with ETH */
|
|
(void)SYSCFG->PMCR;
|
|
80013c4: 4b57 ldr r3, [pc, #348] ; (8001524 <HAL_ETH_Init+0x1c0>)
|
|
80013c6: 685b ldr r3, [r3, #4]
|
|
|
|
/* Ethernet Software reset */
|
|
/* Set the SWR bit: resets all MAC subsystem internal registers and logic */
|
|
/* After reset all the registers holds their respective reset values */
|
|
SET_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR);
|
|
80013c8: 687b ldr r3, [r7, #4]
|
|
80013ca: 681b ldr r3, [r3, #0]
|
|
80013cc: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
80013d0: 681b ldr r3, [r3, #0]
|
|
80013d2: 687a ldr r2, [r7, #4]
|
|
80013d4: 6812 ldr r2, [r2, #0]
|
|
80013d6: f043 0301 orr.w r3, r3, #1
|
|
80013da: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
80013de: 6013 str r3, [r2, #0]
|
|
|
|
/* Get tick */
|
|
tickstart = HAL_GetTick();
|
|
80013e0: f7ff fe14 bl 800100c <HAL_GetTick>
|
|
80013e4: 60f8 str r0, [r7, #12]
|
|
|
|
/* Wait for software reset */
|
|
while (READ_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR) > 0U)
|
|
80013e6: e011 b.n 800140c <HAL_ETH_Init+0xa8>
|
|
{
|
|
if (((HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
|
|
80013e8: f7ff fe10 bl 800100c <HAL_GetTick>
|
|
80013ec: 4602 mov r2, r0
|
|
80013ee: 68fb ldr r3, [r7, #12]
|
|
80013f0: 1ad3 subs r3, r2, r3
|
|
80013f2: f5b3 7ffa cmp.w r3, #500 ; 0x1f4
|
|
80013f6: d909 bls.n 800140c <HAL_ETH_Init+0xa8>
|
|
{
|
|
/* Set Error Code */
|
|
heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
|
|
80013f8: 687b ldr r3, [r7, #4]
|
|
80013fa: 2204 movs r2, #4
|
|
80013fc: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
/* Set State as Error */
|
|
heth->gState = HAL_ETH_STATE_ERROR;
|
|
8001400: 687b ldr r3, [r7, #4]
|
|
8001402: 22e0 movs r2, #224 ; 0xe0
|
|
8001404: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
/* Return Error */
|
|
return HAL_ERROR;
|
|
8001408: 2301 movs r3, #1
|
|
800140a: e084 b.n 8001516 <HAL_ETH_Init+0x1b2>
|
|
while (READ_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR) > 0U)
|
|
800140c: 687b ldr r3, [r7, #4]
|
|
800140e: 681b ldr r3, [r3, #0]
|
|
8001410: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001414: 681b ldr r3, [r3, #0]
|
|
8001416: f003 0301 and.w r3, r3, #1
|
|
800141a: 2b00 cmp r3, #0
|
|
800141c: d1e4 bne.n 80013e8 <HAL_ETH_Init+0x84>
|
|
}
|
|
}
|
|
|
|
/*------------------ MDIO CSR Clock Range Configuration --------------------*/
|
|
HAL_ETH_SetMDIOClockRange(heth);
|
|
800141e: 6878 ldr r0, [r7, #4]
|
|
8001420: f000 fee0 bl 80021e4 <HAL_ETH_SetMDIOClockRange>
|
|
|
|
/*------------------ MAC LPI 1US Tic Counter Configuration --------------------*/
|
|
WRITE_REG(heth->Instance->MAC1USTCR, (((uint32_t)HAL_RCC_GetHCLKFreq() / ETH_MAC_US_TICK) - 1U));
|
|
8001424: f002 fd96 bl 8003f54 <HAL_RCC_GetHCLKFreq>
|
|
8001428: 4603 mov r3, r0
|
|
800142a: 4a3f ldr r2, [pc, #252] ; (8001528 <HAL_ETH_Init+0x1c4>)
|
|
800142c: fba2 2303 umull r2, r3, r2, r3
|
|
8001430: 0c9a lsrs r2, r3, #18
|
|
8001432: 687b ldr r3, [r7, #4]
|
|
8001434: 681b ldr r3, [r3, #0]
|
|
8001436: 3a01 subs r2, #1
|
|
8001438: f8c3 20dc str.w r2, [r3, #220] ; 0xdc
|
|
|
|
/*------------------ MAC, MTL and DMA default Configuration ----------------*/
|
|
ETH_MACDMAConfig(heth);
|
|
800143c: 6878 ldr r0, [r7, #4]
|
|
800143e: f001 f8cb bl 80025d8 <ETH_MACDMAConfig>
|
|
|
|
/* SET DSL to 64 bit */
|
|
MODIFY_REG(heth->Instance->DMACCR, ETH_DMACCR_DSL, ETH_DMACCR_DSL_64BIT);
|
|
8001442: 687b ldr r3, [r7, #4]
|
|
8001444: 681b ldr r3, [r3, #0]
|
|
8001446: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
800144a: f8d3 3100 ldr.w r3, [r3, #256] ; 0x100
|
|
800144e: f423 13e0 bic.w r3, r3, #1835008 ; 0x1c0000
|
|
8001452: 687a ldr r2, [r7, #4]
|
|
8001454: 6812 ldr r2, [r2, #0]
|
|
8001456: f443 2300 orr.w r3, r3, #524288 ; 0x80000
|
|
800145a: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
800145e: f8c2 3100 str.w r3, [r2, #256] ; 0x100
|
|
|
|
/* Set Receive Buffers Length (must be a multiple of 4) */
|
|
if ((heth->Init.RxBuffLen % 0x4U) != 0x0U)
|
|
8001462: 687b ldr r3, [r7, #4]
|
|
8001464: 695b ldr r3, [r3, #20]
|
|
8001466: f003 0303 and.w r3, r3, #3
|
|
800146a: 2b00 cmp r3, #0
|
|
800146c: d009 beq.n 8001482 <HAL_ETH_Init+0x11e>
|
|
{
|
|
/* Set Error Code */
|
|
heth->ErrorCode = HAL_ETH_ERROR_PARAM;
|
|
800146e: 687b ldr r3, [r7, #4]
|
|
8001470: 2201 movs r2, #1
|
|
8001472: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
/* Set State as Error */
|
|
heth->gState = HAL_ETH_STATE_ERROR;
|
|
8001476: 687b ldr r3, [r7, #4]
|
|
8001478: 22e0 movs r2, #224 ; 0xe0
|
|
800147a: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
/* Return Error */
|
|
return HAL_ERROR;
|
|
800147e: 2301 movs r3, #1
|
|
8001480: e049 b.n 8001516 <HAL_ETH_Init+0x1b2>
|
|
}
|
|
else
|
|
{
|
|
MODIFY_REG(heth->Instance->DMACRCR, ETH_DMACRCR_RBSZ, ((heth->Init.RxBuffLen) << 1));
|
|
8001482: 687b ldr r3, [r7, #4]
|
|
8001484: 681b ldr r3, [r3, #0]
|
|
8001486: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
800148a: f8d3 2108 ldr.w r2, [r3, #264] ; 0x108
|
|
800148e: 4b27 ldr r3, [pc, #156] ; (800152c <HAL_ETH_Init+0x1c8>)
|
|
8001490: 4013 ands r3, r2
|
|
8001492: 687a ldr r2, [r7, #4]
|
|
8001494: 6952 ldr r2, [r2, #20]
|
|
8001496: 0051 lsls r1, r2, #1
|
|
8001498: 687a ldr r2, [r7, #4]
|
|
800149a: 6812 ldr r2, [r2, #0]
|
|
800149c: 430b orrs r3, r1
|
|
800149e: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
80014a2: f8c2 3108 str.w r3, [r2, #264] ; 0x108
|
|
}
|
|
|
|
/*------------------ DMA Tx Descriptors Configuration ----------------------*/
|
|
ETH_DMATxDescListInit(heth);
|
|
80014a6: 6878 ldr r0, [r7, #4]
|
|
80014a8: f001 f933 bl 8002712 <ETH_DMATxDescListInit>
|
|
|
|
/*------------------ DMA Rx Descriptors Configuration ----------------------*/
|
|
ETH_DMARxDescListInit(heth);
|
|
80014ac: 6878 ldr r0, [r7, #4]
|
|
80014ae: f001 f979 bl 80027a4 <ETH_DMARxDescListInit>
|
|
|
|
/*--------------------- ETHERNET MAC Address Configuration ------------------*/
|
|
/* Set MAC addr bits 32 to 47 */
|
|
heth->Instance->MACA0HR = (((uint32_t)(heth->Init.MACAddr[5]) << 8) | (uint32_t)heth->Init.MACAddr[4]);
|
|
80014b2: 687b ldr r3, [r7, #4]
|
|
80014b4: 685b ldr r3, [r3, #4]
|
|
80014b6: 3305 adds r3, #5
|
|
80014b8: 781b ldrb r3, [r3, #0]
|
|
80014ba: 021a lsls r2, r3, #8
|
|
80014bc: 687b ldr r3, [r7, #4]
|
|
80014be: 685b ldr r3, [r3, #4]
|
|
80014c0: 3304 adds r3, #4
|
|
80014c2: 781b ldrb r3, [r3, #0]
|
|
80014c4: 4619 mov r1, r3
|
|
80014c6: 687b ldr r3, [r7, #4]
|
|
80014c8: 681b ldr r3, [r3, #0]
|
|
80014ca: 430a orrs r2, r1
|
|
80014cc: f8c3 2300 str.w r2, [r3, #768] ; 0x300
|
|
/* Set MAC addr bits 0 to 31 */
|
|
heth->Instance->MACA0LR = (((uint32_t)(heth->Init.MACAddr[3]) << 24) | ((uint32_t)(heth->Init.MACAddr[2]) << 16) |
|
|
80014d0: 687b ldr r3, [r7, #4]
|
|
80014d2: 685b ldr r3, [r3, #4]
|
|
80014d4: 3303 adds r3, #3
|
|
80014d6: 781b ldrb r3, [r3, #0]
|
|
80014d8: 061a lsls r2, r3, #24
|
|
80014da: 687b ldr r3, [r7, #4]
|
|
80014dc: 685b ldr r3, [r3, #4]
|
|
80014de: 3302 adds r3, #2
|
|
80014e0: 781b ldrb r3, [r3, #0]
|
|
80014e2: 041b lsls r3, r3, #16
|
|
80014e4: 431a orrs r2, r3
|
|
((uint32_t)(heth->Init.MACAddr[1]) << 8) | (uint32_t)heth->Init.MACAddr[0]);
|
|
80014e6: 687b ldr r3, [r7, #4]
|
|
80014e8: 685b ldr r3, [r3, #4]
|
|
80014ea: 3301 adds r3, #1
|
|
80014ec: 781b ldrb r3, [r3, #0]
|
|
80014ee: 021b lsls r3, r3, #8
|
|
heth->Instance->MACA0LR = (((uint32_t)(heth->Init.MACAddr[3]) << 24) | ((uint32_t)(heth->Init.MACAddr[2]) << 16) |
|
|
80014f0: 431a orrs r2, r3
|
|
((uint32_t)(heth->Init.MACAddr[1]) << 8) | (uint32_t)heth->Init.MACAddr[0]);
|
|
80014f2: 687b ldr r3, [r7, #4]
|
|
80014f4: 685b ldr r3, [r3, #4]
|
|
80014f6: 781b ldrb r3, [r3, #0]
|
|
80014f8: 4619 mov r1, r3
|
|
heth->Instance->MACA0LR = (((uint32_t)(heth->Init.MACAddr[3]) << 24) | ((uint32_t)(heth->Init.MACAddr[2]) << 16) |
|
|
80014fa: 687b ldr r3, [r7, #4]
|
|
80014fc: 681b ldr r3, [r3, #0]
|
|
((uint32_t)(heth->Init.MACAddr[1]) << 8) | (uint32_t)heth->Init.MACAddr[0]);
|
|
80014fe: 430a orrs r2, r1
|
|
heth->Instance->MACA0LR = (((uint32_t)(heth->Init.MACAddr[3]) << 24) | ((uint32_t)(heth->Init.MACAddr[2]) << 16) |
|
|
8001500: f8c3 2304 str.w r2, [r3, #772] ; 0x304
|
|
|
|
heth->ErrorCode = HAL_ETH_ERROR_NONE;
|
|
8001504: 687b ldr r3, [r7, #4]
|
|
8001506: 2200 movs r2, #0
|
|
8001508: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
heth->gState = HAL_ETH_STATE_READY;
|
|
800150c: 687b ldr r3, [r7, #4]
|
|
800150e: 2210 movs r2, #16
|
|
8001510: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
|
|
return HAL_OK;
|
|
8001514: 2300 movs r3, #0
|
|
}
|
|
8001516: 4618 mov r0, r3
|
|
8001518: 3710 adds r7, #16
|
|
800151a: 46bd mov sp, r7
|
|
800151c: bd80 pop {r7, pc}
|
|
800151e: bf00 nop
|
|
8001520: 58024400 .word 0x58024400
|
|
8001524: 58000400 .word 0x58000400
|
|
8001528: 431bde83 .word 0x431bde83
|
|
800152c: ffff8001 .word 0xffff8001
|
|
|
|
08001530 <HAL_ETH_Start>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval HAL status
|
|
*/
|
|
HAL_StatusTypeDef HAL_ETH_Start(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001530: b580 push {r7, lr}
|
|
8001532: b082 sub sp, #8
|
|
8001534: af00 add r7, sp, #0
|
|
8001536: 6078 str r0, [r7, #4]
|
|
if (heth->gState == HAL_ETH_STATE_READY)
|
|
8001538: 687b ldr r3, [r7, #4]
|
|
800153a: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
800153e: 2b10 cmp r3, #16
|
|
8001540: d153 bne.n 80015ea <HAL_ETH_Start+0xba>
|
|
{
|
|
heth->gState = HAL_ETH_STATE_BUSY;
|
|
8001542: 687b ldr r3, [r7, #4]
|
|
8001544: 2223 movs r2, #35 ; 0x23
|
|
8001546: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
|
|
/* Set nombre of descriptors to build */
|
|
heth->RxDescList.RxBuildDescCnt = ETH_RX_DESC_CNT;
|
|
800154a: 687b ldr r3, [r7, #4]
|
|
800154c: 2204 movs r2, #4
|
|
800154e: 66da str r2, [r3, #108] ; 0x6c
|
|
|
|
/* Build all descriptors */
|
|
ETH_UpdateDescriptor(heth);
|
|
8001550: 6878 ldr r0, [r7, #4]
|
|
8001552: f000 f9f6 bl 8001942 <ETH_UpdateDescriptor>
|
|
|
|
/* Enable the MAC transmission */
|
|
SET_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
|
|
8001556: 687b ldr r3, [r7, #4]
|
|
8001558: 681b ldr r3, [r3, #0]
|
|
800155a: 681a ldr r2, [r3, #0]
|
|
800155c: 687b ldr r3, [r7, #4]
|
|
800155e: 681b ldr r3, [r3, #0]
|
|
8001560: f042 0202 orr.w r2, r2, #2
|
|
8001564: 601a str r2, [r3, #0]
|
|
|
|
/* Enable the MAC reception */
|
|
SET_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
|
|
8001566: 687b ldr r3, [r7, #4]
|
|
8001568: 681b ldr r3, [r3, #0]
|
|
800156a: 681a ldr r2, [r3, #0]
|
|
800156c: 687b ldr r3, [r7, #4]
|
|
800156e: 681b ldr r3, [r3, #0]
|
|
8001570: f042 0201 orr.w r2, r2, #1
|
|
8001574: 601a str r2, [r3, #0]
|
|
|
|
/* Set the Flush Transmit FIFO bit */
|
|
SET_BIT(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_FTQ);
|
|
8001576: 687b ldr r3, [r7, #4]
|
|
8001578: 681b ldr r3, [r3, #0]
|
|
800157a: f8d3 2d00 ldr.w r2, [r3, #3328] ; 0xd00
|
|
800157e: 687b ldr r3, [r7, #4]
|
|
8001580: 681b ldr r3, [r3, #0]
|
|
8001582: f042 0201 orr.w r2, r2, #1
|
|
8001586: f8c3 2d00 str.w r2, [r3, #3328] ; 0xd00
|
|
|
|
/* Enable the DMA transmission */
|
|
SET_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_ST);
|
|
800158a: 687b ldr r3, [r7, #4]
|
|
800158c: 681b ldr r3, [r3, #0]
|
|
800158e: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001592: f8d3 3104 ldr.w r3, [r3, #260] ; 0x104
|
|
8001596: 687a ldr r2, [r7, #4]
|
|
8001598: 6812 ldr r2, [r2, #0]
|
|
800159a: f043 0301 orr.w r3, r3, #1
|
|
800159e: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
80015a2: f8c2 3104 str.w r3, [r2, #260] ; 0x104
|
|
|
|
/* Enable the DMA reception */
|
|
SET_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_SR);
|
|
80015a6: 687b ldr r3, [r7, #4]
|
|
80015a8: 681b ldr r3, [r3, #0]
|
|
80015aa: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
80015ae: f8d3 3108 ldr.w r3, [r3, #264] ; 0x108
|
|
80015b2: 687a ldr r2, [r7, #4]
|
|
80015b4: 6812 ldr r2, [r2, #0]
|
|
80015b6: f043 0301 orr.w r3, r3, #1
|
|
80015ba: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
80015be: f8c2 3108 str.w r3, [r2, #264] ; 0x108
|
|
|
|
/* Clear Tx and Rx process stopped flags */
|
|
heth->Instance->DMACSR |= (ETH_DMACSR_TPS | ETH_DMACSR_RPS);
|
|
80015c2: 687b ldr r3, [r7, #4]
|
|
80015c4: 681b ldr r3, [r3, #0]
|
|
80015c6: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
80015ca: f8d3 3160 ldr.w r3, [r3, #352] ; 0x160
|
|
80015ce: 687a ldr r2, [r7, #4]
|
|
80015d0: 6812 ldr r2, [r2, #0]
|
|
80015d2: f443 7381 orr.w r3, r3, #258 ; 0x102
|
|
80015d6: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
80015da: f8c2 3160 str.w r3, [r2, #352] ; 0x160
|
|
|
|
heth->gState = HAL_ETH_STATE_STARTED;
|
|
80015de: 687b ldr r3, [r7, #4]
|
|
80015e0: 2223 movs r2, #35 ; 0x23
|
|
80015e2: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
|
|
return HAL_OK;
|
|
80015e6: 2300 movs r3, #0
|
|
80015e8: e000 b.n 80015ec <HAL_ETH_Start+0xbc>
|
|
}
|
|
else
|
|
{
|
|
return HAL_ERROR;
|
|
80015ea: 2301 movs r3, #1
|
|
}
|
|
}
|
|
80015ec: 4618 mov r0, r3
|
|
80015ee: 3708 adds r7, #8
|
|
80015f0: 46bd mov sp, r7
|
|
80015f2: bd80 pop {r7, pc}
|
|
|
|
080015f4 <HAL_ETH_Stop>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval HAL status
|
|
*/
|
|
HAL_StatusTypeDef HAL_ETH_Stop(ETH_HandleTypeDef *heth)
|
|
{
|
|
80015f4: b480 push {r7}
|
|
80015f6: b083 sub sp, #12
|
|
80015f8: af00 add r7, sp, #0
|
|
80015fa: 6078 str r0, [r7, #4]
|
|
if (heth->gState == HAL_ETH_STATE_STARTED)
|
|
80015fc: 687b ldr r3, [r7, #4]
|
|
80015fe: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
8001602: 2b23 cmp r3, #35 ; 0x23
|
|
8001604: d13f bne.n 8001686 <HAL_ETH_Stop+0x92>
|
|
{
|
|
/* Set the ETH peripheral state to BUSY */
|
|
heth->gState = HAL_ETH_STATE_BUSY;
|
|
8001606: 687b ldr r3, [r7, #4]
|
|
8001608: 2223 movs r2, #35 ; 0x23
|
|
800160a: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
/* Disable the DMA transmission */
|
|
CLEAR_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_ST);
|
|
800160e: 687b ldr r3, [r7, #4]
|
|
8001610: 681b ldr r3, [r3, #0]
|
|
8001612: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001616: f8d3 3104 ldr.w r3, [r3, #260] ; 0x104
|
|
800161a: 687a ldr r2, [r7, #4]
|
|
800161c: 6812 ldr r2, [r2, #0]
|
|
800161e: f023 0301 bic.w r3, r3, #1
|
|
8001622: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
8001626: f8c2 3104 str.w r3, [r2, #260] ; 0x104
|
|
|
|
/* Disable the DMA reception */
|
|
CLEAR_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_SR);
|
|
800162a: 687b ldr r3, [r7, #4]
|
|
800162c: 681b ldr r3, [r3, #0]
|
|
800162e: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001632: f8d3 3108 ldr.w r3, [r3, #264] ; 0x108
|
|
8001636: 687a ldr r2, [r7, #4]
|
|
8001638: 6812 ldr r2, [r2, #0]
|
|
800163a: f023 0301 bic.w r3, r3, #1
|
|
800163e: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
8001642: f8c2 3108 str.w r3, [r2, #264] ; 0x108
|
|
|
|
/* Disable the MAC reception */
|
|
CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
|
|
8001646: 687b ldr r3, [r7, #4]
|
|
8001648: 681b ldr r3, [r3, #0]
|
|
800164a: 681a ldr r2, [r3, #0]
|
|
800164c: 687b ldr r3, [r7, #4]
|
|
800164e: 681b ldr r3, [r3, #0]
|
|
8001650: f022 0201 bic.w r2, r2, #1
|
|
8001654: 601a str r2, [r3, #0]
|
|
|
|
/* Set the Flush Transmit FIFO bit */
|
|
SET_BIT(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_FTQ);
|
|
8001656: 687b ldr r3, [r7, #4]
|
|
8001658: 681b ldr r3, [r3, #0]
|
|
800165a: f8d3 2d00 ldr.w r2, [r3, #3328] ; 0xd00
|
|
800165e: 687b ldr r3, [r7, #4]
|
|
8001660: 681b ldr r3, [r3, #0]
|
|
8001662: f042 0201 orr.w r2, r2, #1
|
|
8001666: f8c3 2d00 str.w r2, [r3, #3328] ; 0xd00
|
|
|
|
/* Disable the MAC transmission */
|
|
CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
|
|
800166a: 687b ldr r3, [r7, #4]
|
|
800166c: 681b ldr r3, [r3, #0]
|
|
800166e: 681a ldr r2, [r3, #0]
|
|
8001670: 687b ldr r3, [r7, #4]
|
|
8001672: 681b ldr r3, [r3, #0]
|
|
8001674: f022 0202 bic.w r2, r2, #2
|
|
8001678: 601a str r2, [r3, #0]
|
|
|
|
heth->gState = HAL_ETH_STATE_READY;
|
|
800167a: 687b ldr r3, [r7, #4]
|
|
800167c: 2210 movs r2, #16
|
|
800167e: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
|
|
/* Return function status */
|
|
return HAL_OK;
|
|
8001682: 2300 movs r3, #0
|
|
8001684: e000 b.n 8001688 <HAL_ETH_Stop+0x94>
|
|
}
|
|
else
|
|
{
|
|
return HAL_ERROR;
|
|
8001686: 2301 movs r3, #1
|
|
}
|
|
}
|
|
8001688: 4618 mov r0, r3
|
|
800168a: 370c adds r7, #12
|
|
800168c: 46bd mov sp, r7
|
|
800168e: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001692: 4770 bx lr
|
|
|
|
08001694 <HAL_ETH_Transmit>:
|
|
* @param pTxConfig: Hold the configuration of packet to be transmitted
|
|
* @param Timeout: timeout value
|
|
* @retval HAL status
|
|
*/
|
|
HAL_StatusTypeDef HAL_ETH_Transmit(ETH_HandleTypeDef *heth, ETH_TxPacketConfig *pTxConfig, uint32_t Timeout)
|
|
{
|
|
8001694: b580 push {r7, lr}
|
|
8001696: b086 sub sp, #24
|
|
8001698: af00 add r7, sp, #0
|
|
800169a: 60f8 str r0, [r7, #12]
|
|
800169c: 60b9 str r1, [r7, #8]
|
|
800169e: 607a str r2, [r7, #4]
|
|
uint32_t tickstart;
|
|
ETH_DMADescTypeDef *dmatxdesc;
|
|
|
|
if (pTxConfig == NULL)
|
|
80016a0: 68bb ldr r3, [r7, #8]
|
|
80016a2: 2b00 cmp r3, #0
|
|
80016a4: d109 bne.n 80016ba <HAL_ETH_Transmit+0x26>
|
|
{
|
|
heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
|
|
80016a6: 68fb ldr r3, [r7, #12]
|
|
80016a8: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
80016ac: f043 0201 orr.w r2, r3, #1
|
|
80016b0: 68fb ldr r3, [r7, #12]
|
|
80016b2: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
return HAL_ERROR;
|
|
80016b6: 2301 movs r3, #1
|
|
80016b8: e07f b.n 80017ba <HAL_ETH_Transmit+0x126>
|
|
}
|
|
|
|
if (heth->gState == HAL_ETH_STATE_STARTED)
|
|
80016ba: 68fb ldr r3, [r7, #12]
|
|
80016bc: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
80016c0: 2b23 cmp r3, #35 ; 0x23
|
|
80016c2: d179 bne.n 80017b8 <HAL_ETH_Transmit+0x124>
|
|
{
|
|
/* Config DMA Tx descriptor by Tx Packet info */
|
|
if (ETH_Prepare_Tx_Descriptors(heth, pTxConfig, 0) != HAL_ETH_ERROR_NONE)
|
|
80016c4: 2200 movs r2, #0
|
|
80016c6: 68b9 ldr r1, [r7, #8]
|
|
80016c8: 68f8 ldr r0, [r7, #12]
|
|
80016ca: f001 f8c9 bl 8002860 <ETH_Prepare_Tx_Descriptors>
|
|
80016ce: 4603 mov r3, r0
|
|
80016d0: 2b00 cmp r3, #0
|
|
80016d2: d009 beq.n 80016e8 <HAL_ETH_Transmit+0x54>
|
|
{
|
|
/* Set the ETH error code */
|
|
heth->ErrorCode |= HAL_ETH_ERROR_BUSY;
|
|
80016d4: 68fb ldr r3, [r7, #12]
|
|
80016d6: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
80016da: f043 0202 orr.w r2, r3, #2
|
|
80016de: 68fb ldr r3, [r7, #12]
|
|
80016e0: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
return HAL_ERROR;
|
|
80016e4: 2301 movs r3, #1
|
|
80016e6: e068 b.n 80017ba <HAL_ETH_Transmit+0x126>
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
80016e8: f3bf 8f4f dsb sy
|
|
}
|
|
80016ec: bf00 nop
|
|
}
|
|
|
|
/* Ensure completion of descriptor preparation before transmission start */
|
|
__DSB();
|
|
|
|
dmatxdesc = (ETH_DMADescTypeDef *)(&heth->TxDescList)->TxDesc[heth->TxDescList.CurTxDesc];
|
|
80016ee: 68fb ldr r3, [r7, #12]
|
|
80016f0: 6a9a ldr r2, [r3, #40] ; 0x28
|
|
80016f2: 68fb ldr r3, [r7, #12]
|
|
80016f4: 3206 adds r2, #6
|
|
80016f6: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
80016fa: 617b str r3, [r7, #20]
|
|
|
|
/* Incr current tx desc index */
|
|
INCR_TX_DESC_INDEX(heth->TxDescList.CurTxDesc, 1U);
|
|
80016fc: 68fb ldr r3, [r7, #12]
|
|
80016fe: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
8001700: 1c5a adds r2, r3, #1
|
|
8001702: 68fb ldr r3, [r7, #12]
|
|
8001704: 629a str r2, [r3, #40] ; 0x28
|
|
8001706: 68fb ldr r3, [r7, #12]
|
|
8001708: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
800170a: 2b03 cmp r3, #3
|
|
800170c: d904 bls.n 8001718 <HAL_ETH_Transmit+0x84>
|
|
800170e: 68fb ldr r3, [r7, #12]
|
|
8001710: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
8001712: 1f1a subs r2, r3, #4
|
|
8001714: 68fb ldr r3, [r7, #12]
|
|
8001716: 629a str r2, [r3, #40] ; 0x28
|
|
|
|
/* Start transmission */
|
|
/* issue a poll command to Tx DMA by writing address of next immediate free descriptor */
|
|
WRITE_REG(heth->Instance->DMACTDTPR, (uint32_t)(heth->TxDescList.TxDesc[heth->TxDescList.CurTxDesc]));
|
|
8001718: 68fb ldr r3, [r7, #12]
|
|
800171a: 6a99 ldr r1, [r3, #40] ; 0x28
|
|
800171c: 68fb ldr r3, [r7, #12]
|
|
800171e: 681a ldr r2, [r3, #0]
|
|
8001720: 68fb ldr r3, [r7, #12]
|
|
8001722: 3106 adds r1, #6
|
|
8001724: f853 3021 ldr.w r3, [r3, r1, lsl #2]
|
|
8001728: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
800172c: f8c2 3120 str.w r3, [r2, #288] ; 0x120
|
|
|
|
tickstart = HAL_GetTick();
|
|
8001730: f7ff fc6c bl 800100c <HAL_GetTick>
|
|
8001734: 6138 str r0, [r7, #16]
|
|
|
|
/* Wait for data to be transmitted or timeout occurred */
|
|
while ((dmatxdesc->DESC3 & ETH_DMATXNDESCWBF_OWN) != (uint32_t)RESET)
|
|
8001736: e039 b.n 80017ac <HAL_ETH_Transmit+0x118>
|
|
{
|
|
if ((heth->Instance->DMACSR & ETH_DMACSR_FBE) != (uint32_t)RESET)
|
|
8001738: 68fb ldr r3, [r7, #12]
|
|
800173a: 681b ldr r3, [r3, #0]
|
|
800173c: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001740: f8d3 3160 ldr.w r3, [r3, #352] ; 0x160
|
|
8001744: f403 5380 and.w r3, r3, #4096 ; 0x1000
|
|
8001748: 2b00 cmp r3, #0
|
|
800174a: d012 beq.n 8001772 <HAL_ETH_Transmit+0xde>
|
|
{
|
|
heth->ErrorCode |= HAL_ETH_ERROR_DMA;
|
|
800174c: 68fb ldr r3, [r7, #12]
|
|
800174e: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
8001752: f043 0208 orr.w r2, r3, #8
|
|
8001756: 68fb ldr r3, [r7, #12]
|
|
8001758: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
heth->DMAErrorCode = heth->Instance->DMACSR;
|
|
800175c: 68fb ldr r3, [r7, #12]
|
|
800175e: 681b ldr r3, [r3, #0]
|
|
8001760: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001764: f8d3 2160 ldr.w r2, [r3, #352] ; 0x160
|
|
8001768: 68fb ldr r3, [r7, #12]
|
|
800176a: f8c3 208c str.w r2, [r3, #140] ; 0x8c
|
|
/* Return function status */
|
|
return HAL_ERROR;
|
|
800176e: 2301 movs r3, #1
|
|
8001770: e023 b.n 80017ba <HAL_ETH_Transmit+0x126>
|
|
}
|
|
|
|
/* Check for the Timeout */
|
|
if (Timeout != HAL_MAX_DELAY)
|
|
8001772: 687b ldr r3, [r7, #4]
|
|
8001774: f1b3 3fff cmp.w r3, #4294967295
|
|
8001778: d018 beq.n 80017ac <HAL_ETH_Transmit+0x118>
|
|
{
|
|
if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
|
|
800177a: f7ff fc47 bl 800100c <HAL_GetTick>
|
|
800177e: 4602 mov r2, r0
|
|
8001780: 693b ldr r3, [r7, #16]
|
|
8001782: 1ad3 subs r3, r2, r3
|
|
8001784: 687a ldr r2, [r7, #4]
|
|
8001786: 429a cmp r2, r3
|
|
8001788: d302 bcc.n 8001790 <HAL_ETH_Transmit+0xfc>
|
|
800178a: 687b ldr r3, [r7, #4]
|
|
800178c: 2b00 cmp r3, #0
|
|
800178e: d10d bne.n 80017ac <HAL_ETH_Transmit+0x118>
|
|
{
|
|
heth->ErrorCode |= HAL_ETH_ERROR_TIMEOUT;
|
|
8001790: 68fb ldr r3, [r7, #12]
|
|
8001792: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
8001796: f043 0204 orr.w r2, r3, #4
|
|
800179a: 68fb ldr r3, [r7, #12]
|
|
800179c: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
/* Clear TX descriptor so that we can proceed */
|
|
dmatxdesc->DESC3 = (ETH_DMATXNDESCWBF_FD | ETH_DMATXNDESCWBF_LD);
|
|
80017a0: 697b ldr r3, [r7, #20]
|
|
80017a2: f04f 5240 mov.w r2, #805306368 ; 0x30000000
|
|
80017a6: 60da str r2, [r3, #12]
|
|
return HAL_ERROR;
|
|
80017a8: 2301 movs r3, #1
|
|
80017aa: e006 b.n 80017ba <HAL_ETH_Transmit+0x126>
|
|
while ((dmatxdesc->DESC3 & ETH_DMATXNDESCWBF_OWN) != (uint32_t)RESET)
|
|
80017ac: 697b ldr r3, [r7, #20]
|
|
80017ae: 68db ldr r3, [r3, #12]
|
|
80017b0: 2b00 cmp r3, #0
|
|
80017b2: dbc1 blt.n 8001738 <HAL_ETH_Transmit+0xa4>
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Return function status */
|
|
return HAL_OK;
|
|
80017b4: 2300 movs r3, #0
|
|
80017b6: e000 b.n 80017ba <HAL_ETH_Transmit+0x126>
|
|
}
|
|
else
|
|
{
|
|
return HAL_ERROR;
|
|
80017b8: 2301 movs r3, #1
|
|
}
|
|
}
|
|
80017ba: 4618 mov r0, r3
|
|
80017bc: 3718 adds r7, #24
|
|
80017be: 46bd mov sp, r7
|
|
80017c0: bd80 pop {r7, pc}
|
|
|
|
080017c2 <HAL_ETH_ReadData>:
|
|
* the configuration information for ETHERNET module
|
|
* @param pAppBuff: Pointer to an application buffer to receive the packet.
|
|
* @retval HAL status
|
|
*/
|
|
HAL_StatusTypeDef HAL_ETH_ReadData(ETH_HandleTypeDef *heth, void **pAppBuff)
|
|
{
|
|
80017c2: b580 push {r7, lr}
|
|
80017c4: b088 sub sp, #32
|
|
80017c6: af00 add r7, sp, #0
|
|
80017c8: 6078 str r0, [r7, #4]
|
|
80017ca: 6039 str r1, [r7, #0]
|
|
uint32_t descidx;
|
|
ETH_DMADescTypeDef *dmarxdesc;
|
|
uint32_t desccnt = 0U;
|
|
80017cc: 2300 movs r3, #0
|
|
80017ce: 617b str r3, [r7, #20]
|
|
uint32_t desccntmax;
|
|
uint32_t bufflength;
|
|
uint8_t rxdataready = 0U;
|
|
80017d0: 2300 movs r3, #0
|
|
80017d2: 73fb strb r3, [r7, #15]
|
|
|
|
|
|
if (pAppBuff == NULL)
|
|
80017d4: 683b ldr r3, [r7, #0]
|
|
80017d6: 2b00 cmp r3, #0
|
|
80017d8: d109 bne.n 80017ee <HAL_ETH_ReadData+0x2c>
|
|
{
|
|
heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
|
|
80017da: 687b ldr r3, [r7, #4]
|
|
80017dc: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
80017e0: f043 0201 orr.w r2, r3, #1
|
|
80017e4: 687b ldr r3, [r7, #4]
|
|
80017e6: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
return HAL_ERROR;
|
|
80017ea: 2301 movs r3, #1
|
|
80017ec: e0a5 b.n 800193a <HAL_ETH_ReadData+0x178>
|
|
}
|
|
|
|
if (heth->gState != HAL_ETH_STATE_STARTED)
|
|
80017ee: 687b ldr r3, [r7, #4]
|
|
80017f0: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
80017f4: 2b23 cmp r3, #35 ; 0x23
|
|
80017f6: d001 beq.n 80017fc <HAL_ETH_ReadData+0x3a>
|
|
{
|
|
return HAL_ERROR;
|
|
80017f8: 2301 movs r3, #1
|
|
80017fa: e09e b.n 800193a <HAL_ETH_ReadData+0x178>
|
|
}
|
|
|
|
descidx = heth->RxDescList.RxDescIdx;
|
|
80017fc: 687b ldr r3, [r7, #4]
|
|
80017fe: 6ddb ldr r3, [r3, #92] ; 0x5c
|
|
8001800: 61fb str r3, [r7, #28]
|
|
dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
|
|
8001802: 687b ldr r3, [r7, #4]
|
|
8001804: 69fa ldr r2, [r7, #28]
|
|
8001806: 3212 adds r2, #18
|
|
8001808: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
800180c: 61bb str r3, [r7, #24]
|
|
desccntmax = ETH_RX_DESC_CNT - heth->RxDescList.RxBuildDescCnt;
|
|
800180e: 687b ldr r3, [r7, #4]
|
|
8001810: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8001812: f1c3 0304 rsb r3, r3, #4
|
|
8001816: 60bb str r3, [r7, #8]
|
|
|
|
/* Check if descriptor is not owned by DMA */
|
|
while ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
|
|
8001818: e067 b.n 80018ea <HAL_ETH_ReadData+0x128>
|
|
&& (rxdataready == 0U))
|
|
{
|
|
if (READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_CTXT) != (uint32_t)RESET)
|
|
800181a: 69bb ldr r3, [r7, #24]
|
|
800181c: 68db ldr r3, [r3, #12]
|
|
800181e: f003 4380 and.w r3, r3, #1073741824 ; 0x40000000
|
|
8001822: 2b00 cmp r3, #0
|
|
8001824: d007 beq.n 8001836 <HAL_ETH_ReadData+0x74>
|
|
{
|
|
/* Get timestamp high */
|
|
heth->RxDescList.TimeStamp.TimeStampHigh = dmarxdesc->DESC1;
|
|
8001826: 69bb ldr r3, [r7, #24]
|
|
8001828: 685a ldr r2, [r3, #4]
|
|
800182a: 687b ldr r3, [r7, #4]
|
|
800182c: 679a str r2, [r3, #120] ; 0x78
|
|
/* Get timestamp low */
|
|
heth->RxDescList.TimeStamp.TimeStampLow = dmarxdesc->DESC0;
|
|
800182e: 69bb ldr r3, [r7, #24]
|
|
8001830: 681a ldr r2, [r3, #0]
|
|
8001832: 687b ldr r3, [r7, #4]
|
|
8001834: 675a str r2, [r3, #116] ; 0x74
|
|
}
|
|
if ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_FD) != (uint32_t)RESET) || (heth->RxDescList.pRxStart != NULL))
|
|
8001836: 69bb ldr r3, [r7, #24]
|
|
8001838: 68db ldr r3, [r3, #12]
|
|
800183a: f003 5300 and.w r3, r3, #536870912 ; 0x20000000
|
|
800183e: 2b00 cmp r3, #0
|
|
8001840: d103 bne.n 800184a <HAL_ETH_ReadData+0x88>
|
|
8001842: 687b ldr r3, [r7, #4]
|
|
8001844: 6fdb ldr r3, [r3, #124] ; 0x7c
|
|
8001846: 2b00 cmp r3, #0
|
|
8001848: d03d beq.n 80018c6 <HAL_ETH_ReadData+0x104>
|
|
{
|
|
/* Check if first descriptor */
|
|
if (READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_FD) != (uint32_t)RESET)
|
|
800184a: 69bb ldr r3, [r7, #24]
|
|
800184c: 68db ldr r3, [r3, #12]
|
|
800184e: f003 5300 and.w r3, r3, #536870912 ; 0x20000000
|
|
8001852: 2b00 cmp r3, #0
|
|
8001854: d005 beq.n 8001862 <HAL_ETH_ReadData+0xa0>
|
|
{
|
|
heth->RxDescList.RxDescCnt = 0;
|
|
8001856: 687b ldr r3, [r7, #4]
|
|
8001858: 2200 movs r2, #0
|
|
800185a: 661a str r2, [r3, #96] ; 0x60
|
|
heth->RxDescList.RxDataLength = 0;
|
|
800185c: 687b ldr r3, [r7, #4]
|
|
800185e: 2200 movs r2, #0
|
|
8001860: 665a str r2, [r3, #100] ; 0x64
|
|
}
|
|
|
|
/* Check if last descriptor */
|
|
bufflength = heth->Init.RxBuffLen;
|
|
8001862: 687b ldr r3, [r7, #4]
|
|
8001864: 695b ldr r3, [r3, #20]
|
|
8001866: 613b str r3, [r7, #16]
|
|
if (READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_LD) != (uint32_t)RESET)
|
|
8001868: 69bb ldr r3, [r7, #24]
|
|
800186a: 68db ldr r3, [r3, #12]
|
|
800186c: f003 5380 and.w r3, r3, #268435456 ; 0x10000000
|
|
8001870: 2b00 cmp r3, #0
|
|
8001872: d00d beq.n 8001890 <HAL_ETH_ReadData+0xce>
|
|
{
|
|
bufflength = READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_PL) - heth->RxDescList.RxDataLength;
|
|
8001874: 69bb ldr r3, [r7, #24]
|
|
8001876: 68db ldr r3, [r3, #12]
|
|
8001878: f3c3 020e ubfx r2, r3, #0, #15
|
|
800187c: 687b ldr r3, [r7, #4]
|
|
800187e: 6e5b ldr r3, [r3, #100] ; 0x64
|
|
8001880: 1ad3 subs r3, r2, r3
|
|
8001882: 613b str r3, [r7, #16]
|
|
|
|
/* Save Last descriptor index */
|
|
heth->RxDescList.pRxLastRxDesc = dmarxdesc->DESC3;
|
|
8001884: 69bb ldr r3, [r7, #24]
|
|
8001886: 68da ldr r2, [r3, #12]
|
|
8001888: 687b ldr r3, [r7, #4]
|
|
800188a: 671a str r2, [r3, #112] ; 0x70
|
|
|
|
/* Packet ready */
|
|
rxdataready = 1;
|
|
800188c: 2301 movs r3, #1
|
|
800188e: 73fb strb r3, [r7, #15]
|
|
/*Call registered Link callback*/
|
|
heth->rxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
|
|
(uint8_t *)dmarxdesc->BackupAddr0, bufflength);
|
|
#else
|
|
/* Link callback */
|
|
HAL_ETH_RxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
|
|
8001890: 687b ldr r3, [r7, #4]
|
|
8001892: f103 007c add.w r0, r3, #124 ; 0x7c
|
|
8001896: 687b ldr r3, [r7, #4]
|
|
8001898: f103 0180 add.w r1, r3, #128 ; 0x80
|
|
(uint8_t *)dmarxdesc->BackupAddr0, (uint16_t) bufflength);
|
|
800189c: 69bb ldr r3, [r7, #24]
|
|
800189e: 691b ldr r3, [r3, #16]
|
|
HAL_ETH_RxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
|
|
80018a0: 461a mov r2, r3
|
|
80018a2: 693b ldr r3, [r7, #16]
|
|
80018a4: b29b uxth r3, r3
|
|
80018a6: f003 fdc9 bl 800543c <HAL_ETH_RxLinkCallback>
|
|
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
heth->RxDescList.RxDescCnt++;
|
|
80018aa: 687b ldr r3, [r7, #4]
|
|
80018ac: 6e1b ldr r3, [r3, #96] ; 0x60
|
|
80018ae: 1c5a adds r2, r3, #1
|
|
80018b0: 687b ldr r3, [r7, #4]
|
|
80018b2: 661a str r2, [r3, #96] ; 0x60
|
|
heth->RxDescList.RxDataLength += bufflength;
|
|
80018b4: 687b ldr r3, [r7, #4]
|
|
80018b6: 6e5a ldr r2, [r3, #100] ; 0x64
|
|
80018b8: 693b ldr r3, [r7, #16]
|
|
80018ba: 441a add r2, r3
|
|
80018bc: 687b ldr r3, [r7, #4]
|
|
80018be: 665a str r2, [r3, #100] ; 0x64
|
|
|
|
/* Clear buffer pointer */
|
|
dmarxdesc->BackupAddr0 = 0;
|
|
80018c0: 69bb ldr r3, [r7, #24]
|
|
80018c2: 2200 movs r2, #0
|
|
80018c4: 611a str r2, [r3, #16]
|
|
}
|
|
|
|
/* Increment current rx descriptor index */
|
|
INCR_RX_DESC_INDEX(descidx, 1U);
|
|
80018c6: 69fb ldr r3, [r7, #28]
|
|
80018c8: 3301 adds r3, #1
|
|
80018ca: 61fb str r3, [r7, #28]
|
|
80018cc: 69fb ldr r3, [r7, #28]
|
|
80018ce: 2b03 cmp r3, #3
|
|
80018d0: d902 bls.n 80018d8 <HAL_ETH_ReadData+0x116>
|
|
80018d2: 69fb ldr r3, [r7, #28]
|
|
80018d4: 3b04 subs r3, #4
|
|
80018d6: 61fb str r3, [r7, #28]
|
|
/* Get current descriptor address */
|
|
dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
|
|
80018d8: 687b ldr r3, [r7, #4]
|
|
80018da: 69fa ldr r2, [r7, #28]
|
|
80018dc: 3212 adds r2, #18
|
|
80018de: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
80018e2: 61bb str r3, [r7, #24]
|
|
desccnt++;
|
|
80018e4: 697b ldr r3, [r7, #20]
|
|
80018e6: 3301 adds r3, #1
|
|
80018e8: 617b str r3, [r7, #20]
|
|
while ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
|
|
80018ea: 69bb ldr r3, [r7, #24]
|
|
80018ec: 68db ldr r3, [r3, #12]
|
|
&& (rxdataready == 0U))
|
|
80018ee: 2b00 cmp r3, #0
|
|
80018f0: db06 blt.n 8001900 <HAL_ETH_ReadData+0x13e>
|
|
while ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
|
|
80018f2: 697a ldr r2, [r7, #20]
|
|
80018f4: 68bb ldr r3, [r7, #8]
|
|
80018f6: 429a cmp r2, r3
|
|
80018f8: d202 bcs.n 8001900 <HAL_ETH_ReadData+0x13e>
|
|
&& (rxdataready == 0U))
|
|
80018fa: 7bfb ldrb r3, [r7, #15]
|
|
80018fc: 2b00 cmp r3, #0
|
|
80018fe: d08c beq.n 800181a <HAL_ETH_ReadData+0x58>
|
|
}
|
|
|
|
heth->RxDescList.RxBuildDescCnt += desccnt;
|
|
8001900: 687b ldr r3, [r7, #4]
|
|
8001902: 6eda ldr r2, [r3, #108] ; 0x6c
|
|
8001904: 697b ldr r3, [r7, #20]
|
|
8001906: 441a add r2, r3
|
|
8001908: 687b ldr r3, [r7, #4]
|
|
800190a: 66da str r2, [r3, #108] ; 0x6c
|
|
if ((heth->RxDescList.RxBuildDescCnt) != 0U)
|
|
800190c: 687b ldr r3, [r7, #4]
|
|
800190e: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8001910: 2b00 cmp r3, #0
|
|
8001912: d002 beq.n 800191a <HAL_ETH_ReadData+0x158>
|
|
{
|
|
/* Update Descriptors */
|
|
ETH_UpdateDescriptor(heth);
|
|
8001914: 6878 ldr r0, [r7, #4]
|
|
8001916: f000 f814 bl 8001942 <ETH_UpdateDescriptor>
|
|
}
|
|
|
|
heth->RxDescList.RxDescIdx = descidx;
|
|
800191a: 687b ldr r3, [r7, #4]
|
|
800191c: 69fa ldr r2, [r7, #28]
|
|
800191e: 65da str r2, [r3, #92] ; 0x5c
|
|
|
|
if (rxdataready == 1U)
|
|
8001920: 7bfb ldrb r3, [r7, #15]
|
|
8001922: 2b01 cmp r3, #1
|
|
8001924: d108 bne.n 8001938 <HAL_ETH_ReadData+0x176>
|
|
{
|
|
/* Return received packet */
|
|
*pAppBuff = heth->RxDescList.pRxStart;
|
|
8001926: 687b ldr r3, [r7, #4]
|
|
8001928: 6fda ldr r2, [r3, #124] ; 0x7c
|
|
800192a: 683b ldr r3, [r7, #0]
|
|
800192c: 601a str r2, [r3, #0]
|
|
/* Reset first element */
|
|
heth->RxDescList.pRxStart = NULL;
|
|
800192e: 687b ldr r3, [r7, #4]
|
|
8001930: 2200 movs r2, #0
|
|
8001932: 67da str r2, [r3, #124] ; 0x7c
|
|
|
|
return HAL_OK;
|
|
8001934: 2300 movs r3, #0
|
|
8001936: e000 b.n 800193a <HAL_ETH_ReadData+0x178>
|
|
}
|
|
|
|
/* Packet not ready */
|
|
return HAL_ERROR;
|
|
8001938: 2301 movs r3, #1
|
|
}
|
|
800193a: 4618 mov r0, r3
|
|
800193c: 3720 adds r7, #32
|
|
800193e: 46bd mov sp, r7
|
|
8001940: bd80 pop {r7, pc}
|
|
|
|
08001942 <ETH_UpdateDescriptor>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval HAL status
|
|
*/
|
|
static void ETH_UpdateDescriptor(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001942: b580 push {r7, lr}
|
|
8001944: b088 sub sp, #32
|
|
8001946: af00 add r7, sp, #0
|
|
8001948: 6078 str r0, [r7, #4]
|
|
uint32_t descidx;
|
|
uint32_t desccount;
|
|
ETH_DMADescTypeDef *dmarxdesc;
|
|
uint8_t *buff = NULL;
|
|
800194a: 2300 movs r3, #0
|
|
800194c: 60fb str r3, [r7, #12]
|
|
uint8_t allocStatus = 1U;
|
|
800194e: 2301 movs r3, #1
|
|
8001950: 74fb strb r3, [r7, #19]
|
|
|
|
descidx = heth->RxDescList.RxBuildDescIdx;
|
|
8001952: 687b ldr r3, [r7, #4]
|
|
8001954: 6e9b ldr r3, [r3, #104] ; 0x68
|
|
8001956: 61fb str r3, [r7, #28]
|
|
dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
|
|
8001958: 687b ldr r3, [r7, #4]
|
|
800195a: 69fa ldr r2, [r7, #28]
|
|
800195c: 3212 adds r2, #18
|
|
800195e: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
8001962: 617b str r3, [r7, #20]
|
|
desccount = heth->RxDescList.RxBuildDescCnt;
|
|
8001964: 687b ldr r3, [r7, #4]
|
|
8001966: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8001968: 61bb str r3, [r7, #24]
|
|
|
|
while ((desccount > 0U) && (allocStatus != 0U))
|
|
800196a: e03b b.n 80019e4 <ETH_UpdateDescriptor+0xa2>
|
|
{
|
|
/* Check if a buffer's attached the descriptor */
|
|
if (READ_REG(dmarxdesc->BackupAddr0) == 0U)
|
|
800196c: 697b ldr r3, [r7, #20]
|
|
800196e: 691b ldr r3, [r3, #16]
|
|
8001970: 2b00 cmp r3, #0
|
|
8001972: d112 bne.n 800199a <ETH_UpdateDescriptor+0x58>
|
|
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
|
|
/*Call registered Allocate callback*/
|
|
heth->rxAllocateCallback(&buff);
|
|
#else
|
|
/* Allocate callback */
|
|
HAL_ETH_RxAllocateCallback(&buff);
|
|
8001974: f107 030c add.w r3, r7, #12
|
|
8001978: 4618 mov r0, r3
|
|
800197a: f003 fd2f bl 80053dc <HAL_ETH_RxAllocateCallback>
|
|
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
if (buff == NULL)
|
|
800197e: 68fb ldr r3, [r7, #12]
|
|
8001980: 2b00 cmp r3, #0
|
|
8001982: d102 bne.n 800198a <ETH_UpdateDescriptor+0x48>
|
|
{
|
|
allocStatus = 0U;
|
|
8001984: 2300 movs r3, #0
|
|
8001986: 74fb strb r3, [r7, #19]
|
|
8001988: e007 b.n 800199a <ETH_UpdateDescriptor+0x58>
|
|
}
|
|
else
|
|
{
|
|
WRITE_REG(dmarxdesc->BackupAddr0, (uint32_t)buff);
|
|
800198a: 68fb ldr r3, [r7, #12]
|
|
800198c: 461a mov r2, r3
|
|
800198e: 697b ldr r3, [r7, #20]
|
|
8001990: 611a str r2, [r3, #16]
|
|
WRITE_REG(dmarxdesc->DESC0, (uint32_t)buff);
|
|
8001992: 68fb ldr r3, [r7, #12]
|
|
8001994: 461a mov r2, r3
|
|
8001996: 697b ldr r3, [r7, #20]
|
|
8001998: 601a str r2, [r3, #0]
|
|
}
|
|
}
|
|
|
|
if (allocStatus != 0U)
|
|
800199a: 7cfb ldrb r3, [r7, #19]
|
|
800199c: 2b00 cmp r3, #0
|
|
800199e: d021 beq.n 80019e4 <ETH_UpdateDescriptor+0xa2>
|
|
__ASM volatile ("dmb 0xF":::"memory");
|
|
80019a0: f3bf 8f5f dmb sy
|
|
}
|
|
80019a4: bf00 nop
|
|
{
|
|
/* Ensure rest of descriptor is written to RAM before the OWN bit */
|
|
__DMB();
|
|
|
|
if (heth->RxDescList.ItMode != 0U)
|
|
80019a6: 687b ldr r3, [r7, #4]
|
|
80019a8: 6d9b ldr r3, [r3, #88] ; 0x58
|
|
80019aa: 2b00 cmp r3, #0
|
|
80019ac: d004 beq.n 80019b8 <ETH_UpdateDescriptor+0x76>
|
|
{
|
|
WRITE_REG(dmarxdesc->DESC3, ETH_DMARXNDESCRF_OWN | ETH_DMARXNDESCRF_BUF1V | ETH_DMARXNDESCRF_IOC);
|
|
80019ae: 697b ldr r3, [r7, #20]
|
|
80019b0: f04f 4241 mov.w r2, #3238002688 ; 0xc1000000
|
|
80019b4: 60da str r2, [r3, #12]
|
|
80019b6: e003 b.n 80019c0 <ETH_UpdateDescriptor+0x7e>
|
|
}
|
|
else
|
|
{
|
|
WRITE_REG(dmarxdesc->DESC3, ETH_DMARXNDESCRF_OWN | ETH_DMARXNDESCRF_BUF1V);
|
|
80019b8: 697b ldr r3, [r7, #20]
|
|
80019ba: f04f 4201 mov.w r2, #2164260864 ; 0x81000000
|
|
80019be: 60da str r2, [r3, #12]
|
|
}
|
|
|
|
/* Increment current rx descriptor index */
|
|
INCR_RX_DESC_INDEX(descidx, 1U);
|
|
80019c0: 69fb ldr r3, [r7, #28]
|
|
80019c2: 3301 adds r3, #1
|
|
80019c4: 61fb str r3, [r7, #28]
|
|
80019c6: 69fb ldr r3, [r7, #28]
|
|
80019c8: 2b03 cmp r3, #3
|
|
80019ca: d902 bls.n 80019d2 <ETH_UpdateDescriptor+0x90>
|
|
80019cc: 69fb ldr r3, [r7, #28]
|
|
80019ce: 3b04 subs r3, #4
|
|
80019d0: 61fb str r3, [r7, #28]
|
|
/* Get current descriptor address */
|
|
dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
|
|
80019d2: 687b ldr r3, [r7, #4]
|
|
80019d4: 69fa ldr r2, [r7, #28]
|
|
80019d6: 3212 adds r2, #18
|
|
80019d8: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
80019dc: 617b str r3, [r7, #20]
|
|
desccount--;
|
|
80019de: 69bb ldr r3, [r7, #24]
|
|
80019e0: 3b01 subs r3, #1
|
|
80019e2: 61bb str r3, [r7, #24]
|
|
while ((desccount > 0U) && (allocStatus != 0U))
|
|
80019e4: 69bb ldr r3, [r7, #24]
|
|
80019e6: 2b00 cmp r3, #0
|
|
80019e8: d002 beq.n 80019f0 <ETH_UpdateDescriptor+0xae>
|
|
80019ea: 7cfb ldrb r3, [r7, #19]
|
|
80019ec: 2b00 cmp r3, #0
|
|
80019ee: d1bd bne.n 800196c <ETH_UpdateDescriptor+0x2a>
|
|
}
|
|
}
|
|
|
|
if (heth->RxDescList.RxBuildDescCnt != desccount)
|
|
80019f0: 687b ldr r3, [r7, #4]
|
|
80019f2: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
80019f4: 69ba ldr r2, [r7, #24]
|
|
80019f6: 429a cmp r2, r3
|
|
80019f8: d00d beq.n 8001a16 <ETH_UpdateDescriptor+0xd4>
|
|
{
|
|
/* Set the Tail pointer address */
|
|
WRITE_REG(heth->Instance->DMACRDTPR, 0);
|
|
80019fa: 687b ldr r3, [r7, #4]
|
|
80019fc: 681b ldr r3, [r3, #0]
|
|
80019fe: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001a02: 461a mov r2, r3
|
|
8001a04: 2300 movs r3, #0
|
|
8001a06: f8c2 3128 str.w r3, [r2, #296] ; 0x128
|
|
|
|
heth->RxDescList.RxBuildDescIdx = descidx;
|
|
8001a0a: 687b ldr r3, [r7, #4]
|
|
8001a0c: 69fa ldr r2, [r7, #28]
|
|
8001a0e: 669a str r2, [r3, #104] ; 0x68
|
|
heth->RxDescList.RxBuildDescCnt = desccount;
|
|
8001a10: 687b ldr r3, [r7, #4]
|
|
8001a12: 69ba ldr r2, [r7, #24]
|
|
8001a14: 66da str r2, [r3, #108] ; 0x6c
|
|
}
|
|
}
|
|
8001a16: bf00 nop
|
|
8001a18: 3720 adds r7, #32
|
|
8001a1a: 46bd mov sp, r7
|
|
8001a1c: bd80 pop {r7, pc}
|
|
...
|
|
|
|
08001a20 <HAL_ETH_IRQHandler>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval HAL status
|
|
*/
|
|
void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001a20: b580 push {r7, lr}
|
|
8001a22: b084 sub sp, #16
|
|
8001a24: af00 add r7, sp, #0
|
|
8001a26: 6078 str r0, [r7, #4]
|
|
uint32_t macirqenable;
|
|
/* Packet received */
|
|
if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMACSR_RI))
|
|
8001a28: 687b ldr r3, [r7, #4]
|
|
8001a2a: 681b ldr r3, [r3, #0]
|
|
8001a2c: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001a30: f8d3 3160 ldr.w r3, [r3, #352] ; 0x160
|
|
8001a34: f003 0340 and.w r3, r3, #64 ; 0x40
|
|
8001a38: 2b40 cmp r3, #64 ; 0x40
|
|
8001a3a: d115 bne.n 8001a68 <HAL_ETH_IRQHandler+0x48>
|
|
{
|
|
if (__HAL_ETH_DMA_GET_IT_SOURCE(heth, ETH_DMACIER_RIE))
|
|
8001a3c: 687b ldr r3, [r7, #4]
|
|
8001a3e: 681b ldr r3, [r3, #0]
|
|
8001a40: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001a44: f8d3 3134 ldr.w r3, [r3, #308] ; 0x134
|
|
8001a48: f003 0340 and.w r3, r3, #64 ; 0x40
|
|
8001a4c: 2b40 cmp r3, #64 ; 0x40
|
|
8001a4e: d10b bne.n 8001a68 <HAL_ETH_IRQHandler+0x48>
|
|
{
|
|
/* Clear the Eth DMA Rx IT pending bits */
|
|
__HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMACSR_RI | ETH_DMACSR_NIS);
|
|
8001a50: 687b ldr r3, [r7, #4]
|
|
8001a52: 681b ldr r3, [r3, #0]
|
|
8001a54: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001a58: 461a mov r2, r3
|
|
8001a5a: f248 0340 movw r3, #32832 ; 0x8040
|
|
8001a5e: f8c2 3160 str.w r3, [r2, #352] ; 0x160
|
|
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
|
|
/*Call registered Receive complete callback*/
|
|
heth->RxCpltCallback(heth);
|
|
#else
|
|
/* Receive complete callback */
|
|
HAL_ETH_RxCpltCallback(heth);
|
|
8001a62: 6878 ldr r0, [r7, #4]
|
|
8001a64: f000 f8f6 bl 8001c54 <HAL_ETH_RxCpltCallback>
|
|
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
}
|
|
}
|
|
|
|
/* Packet transmitted */
|
|
if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMACSR_TI))
|
|
8001a68: 687b ldr r3, [r7, #4]
|
|
8001a6a: 681b ldr r3, [r3, #0]
|
|
8001a6c: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001a70: f8d3 3160 ldr.w r3, [r3, #352] ; 0x160
|
|
8001a74: f003 0301 and.w r3, r3, #1
|
|
8001a78: 2b01 cmp r3, #1
|
|
8001a7a: d115 bne.n 8001aa8 <HAL_ETH_IRQHandler+0x88>
|
|
{
|
|
if (__HAL_ETH_DMA_GET_IT_SOURCE(heth, ETH_DMACIER_TIE))
|
|
8001a7c: 687b ldr r3, [r7, #4]
|
|
8001a7e: 681b ldr r3, [r3, #0]
|
|
8001a80: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001a84: f8d3 3134 ldr.w r3, [r3, #308] ; 0x134
|
|
8001a88: f003 0301 and.w r3, r3, #1
|
|
8001a8c: 2b01 cmp r3, #1
|
|
8001a8e: d10b bne.n 8001aa8 <HAL_ETH_IRQHandler+0x88>
|
|
{
|
|
/* Clear the Eth DMA Tx IT pending bits */
|
|
__HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMACSR_TI | ETH_DMACSR_NIS);
|
|
8001a90: 687b ldr r3, [r7, #4]
|
|
8001a92: 681b ldr r3, [r3, #0]
|
|
8001a94: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001a98: 461a mov r2, r3
|
|
8001a9a: f248 0301 movw r3, #32769 ; 0x8001
|
|
8001a9e: f8c2 3160 str.w r3, [r2, #352] ; 0x160
|
|
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
|
|
/*Call registered Transmit complete callback*/
|
|
heth->TxCpltCallback(heth);
|
|
#else
|
|
/* Transfer complete callback */
|
|
HAL_ETH_TxCpltCallback(heth);
|
|
8001aa2: 6878 ldr r0, [r7, #4]
|
|
8001aa4: f000 f8cc bl 8001c40 <HAL_ETH_TxCpltCallback>
|
|
}
|
|
}
|
|
|
|
|
|
/* ETH DMA Error */
|
|
if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMACSR_AIS))
|
|
8001aa8: 687b ldr r3, [r7, #4]
|
|
8001aaa: 681b ldr r3, [r3, #0]
|
|
8001aac: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001ab0: f8d3 3160 ldr.w r3, [r3, #352] ; 0x160
|
|
8001ab4: f403 4380 and.w r3, r3, #16384 ; 0x4000
|
|
8001ab8: f5b3 4f80 cmp.w r3, #16384 ; 0x4000
|
|
8001abc: d153 bne.n 8001b66 <HAL_ETH_IRQHandler+0x146>
|
|
{
|
|
if (__HAL_ETH_DMA_GET_IT_SOURCE(heth, ETH_DMACIER_AIE))
|
|
8001abe: 687b ldr r3, [r7, #4]
|
|
8001ac0: 681b ldr r3, [r3, #0]
|
|
8001ac2: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001ac6: f8d3 3134 ldr.w r3, [r3, #308] ; 0x134
|
|
8001aca: f403 4380 and.w r3, r3, #16384 ; 0x4000
|
|
8001ace: f5b3 4f80 cmp.w r3, #16384 ; 0x4000
|
|
8001ad2: d148 bne.n 8001b66 <HAL_ETH_IRQHandler+0x146>
|
|
{
|
|
heth->ErrorCode |= HAL_ETH_ERROR_DMA;
|
|
8001ad4: 687b ldr r3, [r7, #4]
|
|
8001ad6: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
8001ada: f043 0208 orr.w r2, r3, #8
|
|
8001ade: 687b ldr r3, [r7, #4]
|
|
8001ae0: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
|
|
/* if fatal bus error occurred */
|
|
if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMACSR_FBE))
|
|
8001ae4: 687b ldr r3, [r7, #4]
|
|
8001ae6: 681b ldr r3, [r3, #0]
|
|
8001ae8: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001aec: f8d3 3160 ldr.w r3, [r3, #352] ; 0x160
|
|
8001af0: f403 5380 and.w r3, r3, #4096 ; 0x1000
|
|
8001af4: f5b3 5f80 cmp.w r3, #4096 ; 0x1000
|
|
8001af8: d11e bne.n 8001b38 <HAL_ETH_IRQHandler+0x118>
|
|
{
|
|
/* Get DMA error code */
|
|
heth->DMAErrorCode = READ_BIT(heth->Instance->DMACSR, (ETH_DMACSR_FBE | ETH_DMACSR_TPS | ETH_DMACSR_RPS));
|
|
8001afa: 687b ldr r3, [r7, #4]
|
|
8001afc: 681b ldr r3, [r3, #0]
|
|
8001afe: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001b02: f8d3 2160 ldr.w r2, [r3, #352] ; 0x160
|
|
8001b06: f241 1302 movw r3, #4354 ; 0x1102
|
|
8001b0a: 4013 ands r3, r2
|
|
8001b0c: 687a ldr r2, [r7, #4]
|
|
8001b0e: f8c2 308c str.w r3, [r2, #140] ; 0x8c
|
|
|
|
/* Disable all interrupts */
|
|
__HAL_ETH_DMA_DISABLE_IT(heth, ETH_DMACIER_NIE | ETH_DMACIER_AIE);
|
|
8001b12: 687b ldr r3, [r7, #4]
|
|
8001b14: 681b ldr r3, [r3, #0]
|
|
8001b16: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001b1a: f8d3 3134 ldr.w r3, [r3, #308] ; 0x134
|
|
8001b1e: 687a ldr r2, [r7, #4]
|
|
8001b20: 6812 ldr r2, [r2, #0]
|
|
8001b22: f423 4340 bic.w r3, r3, #49152 ; 0xc000
|
|
8001b26: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
8001b2a: f8c2 3134 str.w r3, [r2, #308] ; 0x134
|
|
|
|
/* Set HAL state to ERROR */
|
|
heth->gState = HAL_ETH_STATE_ERROR;
|
|
8001b2e: 687b ldr r3, [r7, #4]
|
|
8001b30: 22e0 movs r2, #224 ; 0xe0
|
|
8001b32: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
8001b36: e013 b.n 8001b60 <HAL_ETH_IRQHandler+0x140>
|
|
}
|
|
else
|
|
{
|
|
/* Get DMA error status */
|
|
heth->DMAErrorCode = READ_BIT(heth->Instance->DMACSR, (ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT |
|
|
8001b38: 687b ldr r3, [r7, #4]
|
|
8001b3a: 681b ldr r3, [r3, #0]
|
|
8001b3c: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001b40: f8d3 3160 ldr.w r3, [r3, #352] ; 0x160
|
|
8001b44: f403 42cd and.w r2, r3, #26240 ; 0x6680
|
|
8001b48: 687b ldr r3, [r7, #4]
|
|
8001b4a: f8c3 208c str.w r2, [r3, #140] ; 0x8c
|
|
ETH_DMACSR_RBU | ETH_DMACSR_AIS));
|
|
|
|
/* Clear the interrupt summary flag */
|
|
__HAL_ETH_DMA_CLEAR_IT(heth, (ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT |
|
|
8001b4e: 687b ldr r3, [r7, #4]
|
|
8001b50: 681b ldr r3, [r3, #0]
|
|
8001b52: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8001b56: 461a mov r2, r3
|
|
8001b58: f44f 43cd mov.w r3, #26240 ; 0x6680
|
|
8001b5c: f8c2 3160 str.w r3, [r2, #352] ; 0x160
|
|
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
|
|
/* Call registered Error callback*/
|
|
heth->ErrorCallback(heth);
|
|
#else
|
|
/* Ethernet DMA Error callback */
|
|
HAL_ETH_ErrorCallback(heth);
|
|
8001b60: 6878 ldr r0, [r7, #4]
|
|
8001b62: f000 f881 bl 8001c68 <HAL_ETH_ErrorCallback>
|
|
|
|
}
|
|
}
|
|
|
|
/* ETH MAC Error IT */
|
|
macirqenable = heth->Instance->MACIER;
|
|
8001b66: 687b ldr r3, [r7, #4]
|
|
8001b68: 681b ldr r3, [r3, #0]
|
|
8001b6a: f8d3 30b4 ldr.w r3, [r3, #180] ; 0xb4
|
|
8001b6e: 60fb str r3, [r7, #12]
|
|
if (((macirqenable & ETH_MACIER_RXSTSIE) == ETH_MACIER_RXSTSIE) || \
|
|
8001b70: 68fb ldr r3, [r7, #12]
|
|
8001b72: f403 4380 and.w r3, r3, #16384 ; 0x4000
|
|
8001b76: 2b00 cmp r3, #0
|
|
8001b78: d104 bne.n 8001b84 <HAL_ETH_IRQHandler+0x164>
|
|
((macirqenable & ETH_MACIER_TXSTSIE) == ETH_MACIER_TXSTSIE))
|
|
8001b7a: 68fb ldr r3, [r7, #12]
|
|
8001b7c: f403 5300 and.w r3, r3, #8192 ; 0x2000
|
|
if (((macirqenable & ETH_MACIER_RXSTSIE) == ETH_MACIER_RXSTSIE) || \
|
|
8001b80: 2b00 cmp r3, #0
|
|
8001b82: d019 beq.n 8001bb8 <HAL_ETH_IRQHandler+0x198>
|
|
{
|
|
heth->ErrorCode |= HAL_ETH_ERROR_MAC;
|
|
8001b84: 687b ldr r3, [r7, #4]
|
|
8001b86: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
8001b8a: f043 0210 orr.w r2, r3, #16
|
|
8001b8e: 687b ldr r3, [r7, #4]
|
|
8001b90: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
|
|
/* Get MAC Rx Tx status and clear Status register pending bit */
|
|
heth->MACErrorCode = READ_REG(heth->Instance->MACRXTXSR);
|
|
8001b94: 687b ldr r3, [r7, #4]
|
|
8001b96: 681b ldr r3, [r3, #0]
|
|
8001b98: f8d3 20b8 ldr.w r2, [r3, #184] ; 0xb8
|
|
8001b9c: 687b ldr r3, [r7, #4]
|
|
8001b9e: f8c3 2090 str.w r2, [r3, #144] ; 0x90
|
|
|
|
heth->gState = HAL_ETH_STATE_ERROR;
|
|
8001ba2: 687b ldr r3, [r7, #4]
|
|
8001ba4: 22e0 movs r2, #224 ; 0xe0
|
|
8001ba6: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
|
|
/* Call registered Error callback*/
|
|
heth->ErrorCallback(heth);
|
|
#else
|
|
/* Ethernet Error callback */
|
|
HAL_ETH_ErrorCallback(heth);
|
|
8001baa: 6878 ldr r0, [r7, #4]
|
|
8001bac: f000 f85c bl 8001c68 <HAL_ETH_ErrorCallback>
|
|
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
|
|
heth->MACErrorCode = (uint32_t)(0x0U);
|
|
8001bb0: 687b ldr r3, [r7, #4]
|
|
8001bb2: 2200 movs r2, #0
|
|
8001bb4: f8c3 2090 str.w r2, [r3, #144] ; 0x90
|
|
}
|
|
|
|
/* ETH PMT IT */
|
|
if (__HAL_ETH_MAC_GET_IT(heth, ETH_MAC_PMT_IT))
|
|
8001bb8: 687b ldr r3, [r7, #4]
|
|
8001bba: 681b ldr r3, [r3, #0]
|
|
8001bbc: f8d3 30b0 ldr.w r3, [r3, #176] ; 0xb0
|
|
8001bc0: f003 0310 and.w r3, r3, #16
|
|
8001bc4: 2b10 cmp r3, #16
|
|
8001bc6: d10f bne.n 8001be8 <HAL_ETH_IRQHandler+0x1c8>
|
|
{
|
|
/* Get MAC Wake-up source and clear the status register pending bit */
|
|
heth->MACWakeUpEvent = READ_BIT(heth->Instance->MACPCSR, (ETH_MACPCSR_RWKPRCVD | ETH_MACPCSR_MGKPRCVD));
|
|
8001bc8: 687b ldr r3, [r7, #4]
|
|
8001bca: 681b ldr r3, [r3, #0]
|
|
8001bcc: f8d3 30c0 ldr.w r3, [r3, #192] ; 0xc0
|
|
8001bd0: f003 0260 and.w r2, r3, #96 ; 0x60
|
|
8001bd4: 687b ldr r3, [r7, #4]
|
|
8001bd6: f8c3 2094 str.w r2, [r3, #148] ; 0x94
|
|
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
|
|
/* Call registered PMT callback*/
|
|
heth->PMTCallback(heth);
|
|
#else
|
|
/* Ethernet PMT callback */
|
|
HAL_ETH_PMTCallback(heth);
|
|
8001bda: 6878 ldr r0, [r7, #4]
|
|
8001bdc: f000 f84e bl 8001c7c <HAL_ETH_PMTCallback>
|
|
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
|
|
heth->MACWakeUpEvent = (uint32_t)(0x0U);
|
|
8001be0: 687b ldr r3, [r7, #4]
|
|
8001be2: 2200 movs r2, #0
|
|
8001be4: f8c3 2094 str.w r2, [r3, #148] ; 0x94
|
|
}
|
|
|
|
/* ETH EEE IT */
|
|
if (__HAL_ETH_MAC_GET_IT(heth, ETH_MAC_LPI_IT))
|
|
8001be8: 687b ldr r3, [r7, #4]
|
|
8001bea: 681b ldr r3, [r3, #0]
|
|
8001bec: f8d3 30b0 ldr.w r3, [r3, #176] ; 0xb0
|
|
8001bf0: f003 0320 and.w r3, r3, #32
|
|
8001bf4: 2b20 cmp r3, #32
|
|
8001bf6: d10f bne.n 8001c18 <HAL_ETH_IRQHandler+0x1f8>
|
|
{
|
|
/* Get MAC LPI interrupt source and clear the status register pending bit */
|
|
heth->MACLPIEvent = READ_BIT(heth->Instance->MACPCSR, 0x0000000FU);
|
|
8001bf8: 687b ldr r3, [r7, #4]
|
|
8001bfa: 681b ldr r3, [r3, #0]
|
|
8001bfc: f8d3 30c0 ldr.w r3, [r3, #192] ; 0xc0
|
|
8001c00: f003 020f and.w r2, r3, #15
|
|
8001c04: 687b ldr r3, [r7, #4]
|
|
8001c06: f8c3 2098 str.w r2, [r3, #152] ; 0x98
|
|
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
|
|
/* Call registered EEE callback*/
|
|
heth->EEECallback(heth);
|
|
#else
|
|
/* Ethernet EEE callback */
|
|
HAL_ETH_EEECallback(heth);
|
|
8001c0a: 6878 ldr r0, [r7, #4]
|
|
8001c0c: f000 f840 bl 8001c90 <HAL_ETH_EEECallback>
|
|
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
|
|
heth->MACLPIEvent = (uint32_t)(0x0U);
|
|
8001c10: 687b ldr r3, [r7, #4]
|
|
8001c12: 2200 movs r2, #0
|
|
8001c14: f8c3 2098 str.w r2, [r3, #152] ; 0x98
|
|
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
}
|
|
}
|
|
#else /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
/* check ETH WAKEUP exti flag */
|
|
if (__HAL_ETH_WAKEUP_EXTI_GET_FLAG(ETH_WAKEUP_EXTI_LINE) != (uint32_t)RESET)
|
|
8001c18: 4b08 ldr r3, [pc, #32] ; (8001c3c <HAL_ETH_IRQHandler+0x21c>)
|
|
8001c1a: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
8001c1c: f403 0380 and.w r3, r3, #4194304 ; 0x400000
|
|
8001c20: 2b00 cmp r3, #0
|
|
8001c22: d006 beq.n 8001c32 <HAL_ETH_IRQHandler+0x212>
|
|
{
|
|
/* Clear ETH WAKEUP Exti pending bit */
|
|
__HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG(ETH_WAKEUP_EXTI_LINE);
|
|
8001c24: 4b05 ldr r3, [pc, #20] ; (8001c3c <HAL_ETH_IRQHandler+0x21c>)
|
|
8001c26: f44f 0280 mov.w r2, #4194304 ; 0x400000
|
|
8001c2a: 629a str r2, [r3, #40] ; 0x28
|
|
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
|
|
/* Call registered WakeUp callback*/
|
|
heth->WakeUpCallback(heth);
|
|
#else
|
|
/* ETH WAKEUP callback */
|
|
HAL_ETH_WakeUpCallback(heth);
|
|
8001c2c: 6878 ldr r0, [r7, #4]
|
|
8001c2e: f000 f839 bl 8001ca4 <HAL_ETH_WakeUpCallback>
|
|
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
}
|
|
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
|
|
}
|
|
8001c32: bf00 nop
|
|
8001c34: 3710 adds r7, #16
|
|
8001c36: 46bd mov sp, r7
|
|
8001c38: bd80 pop {r7, pc}
|
|
8001c3a: bf00 nop
|
|
8001c3c: 58000080 .word 0x58000080
|
|
|
|
08001c40 <HAL_ETH_TxCpltCallback>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval None
|
|
*/
|
|
__weak void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001c40: b480 push {r7}
|
|
8001c42: b083 sub sp, #12
|
|
8001c44: af00 add r7, sp, #0
|
|
8001c46: 6078 str r0, [r7, #4]
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(heth);
|
|
/* NOTE : This function Should not be modified, when the callback is needed,
|
|
the HAL_ETH_TxCpltCallback could be implemented in the user file
|
|
*/
|
|
}
|
|
8001c48: bf00 nop
|
|
8001c4a: 370c adds r7, #12
|
|
8001c4c: 46bd mov sp, r7
|
|
8001c4e: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001c52: 4770 bx lr
|
|
|
|
08001c54 <HAL_ETH_RxCpltCallback>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval None
|
|
*/
|
|
__weak void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001c54: b480 push {r7}
|
|
8001c56: b083 sub sp, #12
|
|
8001c58: af00 add r7, sp, #0
|
|
8001c5a: 6078 str r0, [r7, #4]
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(heth);
|
|
/* NOTE : This function Should not be modified, when the callback is needed,
|
|
the HAL_ETH_RxCpltCallback could be implemented in the user file
|
|
*/
|
|
}
|
|
8001c5c: bf00 nop
|
|
8001c5e: 370c adds r7, #12
|
|
8001c60: 46bd mov sp, r7
|
|
8001c62: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001c66: 4770 bx lr
|
|
|
|
08001c68 <HAL_ETH_ErrorCallback>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval None
|
|
*/
|
|
__weak void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001c68: b480 push {r7}
|
|
8001c6a: b083 sub sp, #12
|
|
8001c6c: af00 add r7, sp, #0
|
|
8001c6e: 6078 str r0, [r7, #4]
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(heth);
|
|
/* NOTE : This function Should not be modified, when the callback is needed,
|
|
the HAL_ETH_ErrorCallback could be implemented in the user file
|
|
*/
|
|
}
|
|
8001c70: bf00 nop
|
|
8001c72: 370c adds r7, #12
|
|
8001c74: 46bd mov sp, r7
|
|
8001c76: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001c7a: 4770 bx lr
|
|
|
|
08001c7c <HAL_ETH_PMTCallback>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval None
|
|
*/
|
|
__weak void HAL_ETH_PMTCallback(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001c7c: b480 push {r7}
|
|
8001c7e: b083 sub sp, #12
|
|
8001c80: af00 add r7, sp, #0
|
|
8001c82: 6078 str r0, [r7, #4]
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(heth);
|
|
/* NOTE : This function Should not be modified, when the callback is needed,
|
|
the HAL_ETH_PMTCallback could be implemented in the user file
|
|
*/
|
|
}
|
|
8001c84: bf00 nop
|
|
8001c86: 370c adds r7, #12
|
|
8001c88: 46bd mov sp, r7
|
|
8001c8a: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001c8e: 4770 bx lr
|
|
|
|
08001c90 <HAL_ETH_EEECallback>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval None
|
|
*/
|
|
__weak void HAL_ETH_EEECallback(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001c90: b480 push {r7}
|
|
8001c92: b083 sub sp, #12
|
|
8001c94: af00 add r7, sp, #0
|
|
8001c96: 6078 str r0, [r7, #4]
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(heth);
|
|
/* NOTE : This function Should not be modified, when the callback is needed,
|
|
the HAL_ETH_EEECallback could be implemented in the user file
|
|
*/
|
|
}
|
|
8001c98: bf00 nop
|
|
8001c9a: 370c adds r7, #12
|
|
8001c9c: 46bd mov sp, r7
|
|
8001c9e: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001ca2: 4770 bx lr
|
|
|
|
08001ca4 <HAL_ETH_WakeUpCallback>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval None
|
|
*/
|
|
__weak void HAL_ETH_WakeUpCallback(ETH_HandleTypeDef *heth)
|
|
{
|
|
8001ca4: b480 push {r7}
|
|
8001ca6: b083 sub sp, #12
|
|
8001ca8: af00 add r7, sp, #0
|
|
8001caa: 6078 str r0, [r7, #4]
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(heth);
|
|
/* NOTE : This function Should not be modified, when the callback is needed,
|
|
the HAL_ETH_WakeUpCallback could be implemented in the user file
|
|
*/
|
|
}
|
|
8001cac: bf00 nop
|
|
8001cae: 370c adds r7, #12
|
|
8001cb0: 46bd mov sp, r7
|
|
8001cb2: f85d 7b04 ldr.w r7, [sp], #4
|
|
8001cb6: 4770 bx lr
|
|
|
|
08001cb8 <HAL_ETH_ReadPHYRegister>:
|
|
* @param pRegValue: parameter to hold read value
|
|
* @retval HAL status
|
|
*/
|
|
HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg,
|
|
uint32_t *pRegValue)
|
|
{
|
|
8001cb8: b580 push {r7, lr}
|
|
8001cba: b086 sub sp, #24
|
|
8001cbc: af00 add r7, sp, #0
|
|
8001cbe: 60f8 str r0, [r7, #12]
|
|
8001cc0: 60b9 str r1, [r7, #8]
|
|
8001cc2: 607a str r2, [r7, #4]
|
|
8001cc4: 603b str r3, [r7, #0]
|
|
uint32_t tickstart;
|
|
uint32_t tmpreg;
|
|
|
|
/* Check for the Busy flag */
|
|
if (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) != (uint32_t)RESET)
|
|
8001cc6: 68fb ldr r3, [r7, #12]
|
|
8001cc8: 681b ldr r3, [r3, #0]
|
|
8001cca: f8d3 3200 ldr.w r3, [r3, #512] ; 0x200
|
|
8001cce: f003 0301 and.w r3, r3, #1
|
|
8001cd2: 2b00 cmp r3, #0
|
|
8001cd4: d001 beq.n 8001cda <HAL_ETH_ReadPHYRegister+0x22>
|
|
{
|
|
return HAL_ERROR;
|
|
8001cd6: 2301 movs r3, #1
|
|
8001cd8: e03e b.n 8001d58 <HAL_ETH_ReadPHYRegister+0xa0>
|
|
}
|
|
|
|
/* Get the MACMDIOAR value */
|
|
WRITE_REG(tmpreg, heth->Instance->MACMDIOAR);
|
|
8001cda: 68fb ldr r3, [r7, #12]
|
|
8001cdc: 681b ldr r3, [r3, #0]
|
|
8001cde: f8d3 3200 ldr.w r3, [r3, #512] ; 0x200
|
|
8001ce2: 617b str r3, [r7, #20]
|
|
- Set the PHY device address
|
|
- Set the PHY register address
|
|
- Set the read mode
|
|
- Set the MII Busy bit */
|
|
|
|
MODIFY_REG(tmpreg, ETH_MACMDIOAR_PA, (PHYAddr << 21));
|
|
8001ce4: 697b ldr r3, [r7, #20]
|
|
8001ce6: f023 7278 bic.w r2, r3, #65011712 ; 0x3e00000
|
|
8001cea: 68bb ldr r3, [r7, #8]
|
|
8001cec: 055b lsls r3, r3, #21
|
|
8001cee: 4313 orrs r3, r2
|
|
8001cf0: 617b str r3, [r7, #20]
|
|
MODIFY_REG(tmpreg, ETH_MACMDIOAR_RDA, (PHYReg << 16));
|
|
8001cf2: 697b ldr r3, [r7, #20]
|
|
8001cf4: f423 12f8 bic.w r2, r3, #2031616 ; 0x1f0000
|
|
8001cf8: 687b ldr r3, [r7, #4]
|
|
8001cfa: 041b lsls r3, r3, #16
|
|
8001cfc: 4313 orrs r3, r2
|
|
8001cfe: 617b str r3, [r7, #20]
|
|
MODIFY_REG(tmpreg, ETH_MACMDIOAR_MOC, ETH_MACMDIOAR_MOC_RD);
|
|
8001d00: 697b ldr r3, [r7, #20]
|
|
8001d02: f043 030c orr.w r3, r3, #12
|
|
8001d06: 617b str r3, [r7, #20]
|
|
SET_BIT(tmpreg, ETH_MACMDIOAR_MB);
|
|
8001d08: 697b ldr r3, [r7, #20]
|
|
8001d0a: f043 0301 orr.w r3, r3, #1
|
|
8001d0e: 617b str r3, [r7, #20]
|
|
|
|
/* Write the result value into the MDII Address register */
|
|
WRITE_REG(heth->Instance->MACMDIOAR, tmpreg);
|
|
8001d10: 68fb ldr r3, [r7, #12]
|
|
8001d12: 681b ldr r3, [r3, #0]
|
|
8001d14: 697a ldr r2, [r7, #20]
|
|
8001d16: f8c3 2200 str.w r2, [r3, #512] ; 0x200
|
|
|
|
tickstart = HAL_GetTick();
|
|
8001d1a: f7ff f977 bl 800100c <HAL_GetTick>
|
|
8001d1e: 6138 str r0, [r7, #16]
|
|
|
|
/* Wait for the Busy flag */
|
|
while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
|
|
8001d20: e009 b.n 8001d36 <HAL_ETH_ReadPHYRegister+0x7e>
|
|
{
|
|
if (((HAL_GetTick() - tickstart) > ETH_MDIO_BUS_TIMEOUT))
|
|
8001d22: f7ff f973 bl 800100c <HAL_GetTick>
|
|
8001d26: 4602 mov r2, r0
|
|
8001d28: 693b ldr r3, [r7, #16]
|
|
8001d2a: 1ad3 subs r3, r2, r3
|
|
8001d2c: f5b3 7f7a cmp.w r3, #1000 ; 0x3e8
|
|
8001d30: d901 bls.n 8001d36 <HAL_ETH_ReadPHYRegister+0x7e>
|
|
{
|
|
return HAL_ERROR;
|
|
8001d32: 2301 movs r3, #1
|
|
8001d34: e010 b.n 8001d58 <HAL_ETH_ReadPHYRegister+0xa0>
|
|
while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
|
|
8001d36: 68fb ldr r3, [r7, #12]
|
|
8001d38: 681b ldr r3, [r3, #0]
|
|
8001d3a: f8d3 3200 ldr.w r3, [r3, #512] ; 0x200
|
|
8001d3e: f003 0301 and.w r3, r3, #1
|
|
8001d42: 2b00 cmp r3, #0
|
|
8001d44: d1ed bne.n 8001d22 <HAL_ETH_ReadPHYRegister+0x6a>
|
|
}
|
|
}
|
|
|
|
/* Get MACMIIDR value */
|
|
WRITE_REG(*pRegValue, (uint16_t)heth->Instance->MACMDIODR);
|
|
8001d46: 68fb ldr r3, [r7, #12]
|
|
8001d48: 681b ldr r3, [r3, #0]
|
|
8001d4a: f8d3 3204 ldr.w r3, [r3, #516] ; 0x204
|
|
8001d4e: b29b uxth r3, r3
|
|
8001d50: 461a mov r2, r3
|
|
8001d52: 683b ldr r3, [r7, #0]
|
|
8001d54: 601a str r2, [r3, #0]
|
|
|
|
return HAL_OK;
|
|
8001d56: 2300 movs r3, #0
|
|
}
|
|
8001d58: 4618 mov r0, r3
|
|
8001d5a: 3718 adds r7, #24
|
|
8001d5c: 46bd mov sp, r7
|
|
8001d5e: bd80 pop {r7, pc}
|
|
|
|
08001d60 <HAL_ETH_WritePHYRegister>:
|
|
* @param RegValue: the value to write
|
|
* @retval HAL status
|
|
*/
|
|
HAL_StatusTypeDef HAL_ETH_WritePHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg,
|
|
uint32_t RegValue)
|
|
{
|
|
8001d60: b580 push {r7, lr}
|
|
8001d62: b086 sub sp, #24
|
|
8001d64: af00 add r7, sp, #0
|
|
8001d66: 60f8 str r0, [r7, #12]
|
|
8001d68: 60b9 str r1, [r7, #8]
|
|
8001d6a: 607a str r2, [r7, #4]
|
|
8001d6c: 603b str r3, [r7, #0]
|
|
uint32_t tickstart;
|
|
uint32_t tmpreg;
|
|
|
|
/* Check for the Busy flag */
|
|
if (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) != (uint32_t)RESET)
|
|
8001d6e: 68fb ldr r3, [r7, #12]
|
|
8001d70: 681b ldr r3, [r3, #0]
|
|
8001d72: f8d3 3200 ldr.w r3, [r3, #512] ; 0x200
|
|
8001d76: f003 0301 and.w r3, r3, #1
|
|
8001d7a: 2b00 cmp r3, #0
|
|
8001d7c: d001 beq.n 8001d82 <HAL_ETH_WritePHYRegister+0x22>
|
|
{
|
|
return HAL_ERROR;
|
|
8001d7e: 2301 movs r3, #1
|
|
8001d80: e03c b.n 8001dfc <HAL_ETH_WritePHYRegister+0x9c>
|
|
}
|
|
|
|
/* Get the MACMDIOAR value */
|
|
WRITE_REG(tmpreg, heth->Instance->MACMDIOAR);
|
|
8001d82: 68fb ldr r3, [r7, #12]
|
|
8001d84: 681b ldr r3, [r3, #0]
|
|
8001d86: f8d3 3200 ldr.w r3, [r3, #512] ; 0x200
|
|
8001d8a: 617b str r3, [r7, #20]
|
|
- Set the PHY device address
|
|
- Set the PHY register address
|
|
- Set the write mode
|
|
- Set the MII Busy bit */
|
|
|
|
MODIFY_REG(tmpreg, ETH_MACMDIOAR_PA, (PHYAddr << 21));
|
|
8001d8c: 697b ldr r3, [r7, #20]
|
|
8001d8e: f023 7278 bic.w r2, r3, #65011712 ; 0x3e00000
|
|
8001d92: 68bb ldr r3, [r7, #8]
|
|
8001d94: 055b lsls r3, r3, #21
|
|
8001d96: 4313 orrs r3, r2
|
|
8001d98: 617b str r3, [r7, #20]
|
|
MODIFY_REG(tmpreg, ETH_MACMDIOAR_RDA, (PHYReg << 16));
|
|
8001d9a: 697b ldr r3, [r7, #20]
|
|
8001d9c: f423 12f8 bic.w r2, r3, #2031616 ; 0x1f0000
|
|
8001da0: 687b ldr r3, [r7, #4]
|
|
8001da2: 041b lsls r3, r3, #16
|
|
8001da4: 4313 orrs r3, r2
|
|
8001da6: 617b str r3, [r7, #20]
|
|
MODIFY_REG(tmpreg, ETH_MACMDIOAR_MOC, ETH_MACMDIOAR_MOC_WR);
|
|
8001da8: 697b ldr r3, [r7, #20]
|
|
8001daa: f023 030c bic.w r3, r3, #12
|
|
8001dae: f043 0304 orr.w r3, r3, #4
|
|
8001db2: 617b str r3, [r7, #20]
|
|
SET_BIT(tmpreg, ETH_MACMDIOAR_MB);
|
|
8001db4: 697b ldr r3, [r7, #20]
|
|
8001db6: f043 0301 orr.w r3, r3, #1
|
|
8001dba: 617b str r3, [r7, #20]
|
|
|
|
|
|
/* Give the value to the MII data register */
|
|
WRITE_REG(ETH->MACMDIODR, (uint16_t)RegValue);
|
|
8001dbc: 683b ldr r3, [r7, #0]
|
|
8001dbe: b29a uxth r2, r3
|
|
8001dc0: 4b10 ldr r3, [pc, #64] ; (8001e04 <HAL_ETH_WritePHYRegister+0xa4>)
|
|
8001dc2: f8c3 2204 str.w r2, [r3, #516] ; 0x204
|
|
|
|
/* Write the result value into the MII Address register */
|
|
WRITE_REG(ETH->MACMDIOAR, tmpreg);
|
|
8001dc6: 4a0f ldr r2, [pc, #60] ; (8001e04 <HAL_ETH_WritePHYRegister+0xa4>)
|
|
8001dc8: 697b ldr r3, [r7, #20]
|
|
8001dca: f8c2 3200 str.w r3, [r2, #512] ; 0x200
|
|
|
|
tickstart = HAL_GetTick();
|
|
8001dce: f7ff f91d bl 800100c <HAL_GetTick>
|
|
8001dd2: 6138 str r0, [r7, #16]
|
|
|
|
/* Wait for the Busy flag */
|
|
while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
|
|
8001dd4: e009 b.n 8001dea <HAL_ETH_WritePHYRegister+0x8a>
|
|
{
|
|
if (((HAL_GetTick() - tickstart) > ETH_MDIO_BUS_TIMEOUT))
|
|
8001dd6: f7ff f919 bl 800100c <HAL_GetTick>
|
|
8001dda: 4602 mov r2, r0
|
|
8001ddc: 693b ldr r3, [r7, #16]
|
|
8001dde: 1ad3 subs r3, r2, r3
|
|
8001de0: f5b3 7f7a cmp.w r3, #1000 ; 0x3e8
|
|
8001de4: d901 bls.n 8001dea <HAL_ETH_WritePHYRegister+0x8a>
|
|
{
|
|
return HAL_ERROR;
|
|
8001de6: 2301 movs r3, #1
|
|
8001de8: e008 b.n 8001dfc <HAL_ETH_WritePHYRegister+0x9c>
|
|
while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
|
|
8001dea: 68fb ldr r3, [r7, #12]
|
|
8001dec: 681b ldr r3, [r3, #0]
|
|
8001dee: f8d3 3200 ldr.w r3, [r3, #512] ; 0x200
|
|
8001df2: f003 0301 and.w r3, r3, #1
|
|
8001df6: 2b00 cmp r3, #0
|
|
8001df8: d1ed bne.n 8001dd6 <HAL_ETH_WritePHYRegister+0x76>
|
|
}
|
|
}
|
|
|
|
return HAL_OK;
|
|
8001dfa: 2300 movs r3, #0
|
|
}
|
|
8001dfc: 4618 mov r0, r3
|
|
8001dfe: 3718 adds r7, #24
|
|
8001e00: 46bd mov sp, r7
|
|
8001e02: bd80 pop {r7, pc}
|
|
8001e04: 40028000 .word 0x40028000
|
|
|
|
08001e08 <HAL_ETH_GetMACConfig>:
|
|
* @param macconf: pointer to a ETH_MACConfigTypeDef structure that will hold
|
|
* the configuration of the MAC.
|
|
* @retval HAL Status
|
|
*/
|
|
HAL_StatusTypeDef HAL_ETH_GetMACConfig(ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
|
|
{
|
|
8001e08: b480 push {r7}
|
|
8001e0a: b083 sub sp, #12
|
|
8001e0c: af00 add r7, sp, #0
|
|
8001e0e: 6078 str r0, [r7, #4]
|
|
8001e10: 6039 str r1, [r7, #0]
|
|
if (macconf == NULL)
|
|
8001e12: 683b ldr r3, [r7, #0]
|
|
8001e14: 2b00 cmp r3, #0
|
|
8001e16: d101 bne.n 8001e1c <HAL_ETH_GetMACConfig+0x14>
|
|
{
|
|
return HAL_ERROR;
|
|
8001e18: 2301 movs r3, #1
|
|
8001e1a: e1c3 b.n 80021a4 <HAL_ETH_GetMACConfig+0x39c>
|
|
}
|
|
|
|
/* Get MAC parameters */
|
|
macconf->PreambleLength = READ_BIT(heth->Instance->MACCR, ETH_MACCR_PRELEN);
|
|
8001e1c: 687b ldr r3, [r7, #4]
|
|
8001e1e: 681b ldr r3, [r3, #0]
|
|
8001e20: 681b ldr r3, [r3, #0]
|
|
8001e22: f003 020c and.w r2, r3, #12
|
|
8001e26: 683b ldr r3, [r7, #0]
|
|
8001e28: 62da str r2, [r3, #44] ; 0x2c
|
|
macconf->DeferralCheck = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DC) >> 4) > 0U) ? ENABLE : DISABLE;
|
|
8001e2a: 687b ldr r3, [r7, #4]
|
|
8001e2c: 681b ldr r3, [r3, #0]
|
|
8001e2e: 681b ldr r3, [r3, #0]
|
|
8001e30: f003 0310 and.w r3, r3, #16
|
|
8001e34: 2b00 cmp r3, #0
|
|
8001e36: bf14 ite ne
|
|
8001e38: 2301 movne r3, #1
|
|
8001e3a: 2300 moveq r3, #0
|
|
8001e3c: b2db uxtb r3, r3
|
|
8001e3e: 461a mov r2, r3
|
|
8001e40: 683b ldr r3, [r7, #0]
|
|
8001e42: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
macconf->BackOffLimit = READ_BIT(heth->Instance->MACCR, ETH_MACCR_BL);
|
|
8001e46: 687b ldr r3, [r7, #4]
|
|
8001e48: 681b ldr r3, [r3, #0]
|
|
8001e4a: 681b ldr r3, [r3, #0]
|
|
8001e4c: f003 0260 and.w r2, r3, #96 ; 0x60
|
|
8001e50: 683b ldr r3, [r7, #0]
|
|
8001e52: 625a str r2, [r3, #36] ; 0x24
|
|
macconf->RetryTransmission = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DR) >> 8) == 0U) ? ENABLE : DISABLE;
|
|
8001e54: 687b ldr r3, [r7, #4]
|
|
8001e56: 681b ldr r3, [r3, #0]
|
|
8001e58: 681b ldr r3, [r3, #0]
|
|
8001e5a: f403 7380 and.w r3, r3, #256 ; 0x100
|
|
8001e5e: 2b00 cmp r3, #0
|
|
8001e60: bf0c ite eq
|
|
8001e62: 2301 moveq r3, #1
|
|
8001e64: 2300 movne r3, #0
|
|
8001e66: b2db uxtb r3, r3
|
|
8001e68: 461a mov r2, r3
|
|
8001e6a: 683b ldr r3, [r7, #0]
|
|
8001e6c: f883 2020 strb.w r2, [r3, #32]
|
|
macconf->CarrierSenseDuringTransmit = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DCRS) >> 9) > 0U)
|
|
8001e70: 687b ldr r3, [r7, #4]
|
|
8001e72: 681b ldr r3, [r3, #0]
|
|
8001e74: 681b ldr r3, [r3, #0]
|
|
8001e76: f403 7300 and.w r3, r3, #512 ; 0x200
|
|
? ENABLE : DISABLE;
|
|
8001e7a: 2b00 cmp r3, #0
|
|
8001e7c: bf14 ite ne
|
|
8001e7e: 2301 movne r3, #1
|
|
8001e80: 2300 moveq r3, #0
|
|
8001e82: b2db uxtb r3, r3
|
|
8001e84: 461a mov r2, r3
|
|
macconf->CarrierSenseDuringTransmit = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DCRS) >> 9) > 0U)
|
|
8001e86: 683b ldr r3, [r7, #0]
|
|
8001e88: 77da strb r2, [r3, #31]
|
|
macconf->ReceiveOwn = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DO) >> 10) == 0U) ? ENABLE : DISABLE;
|
|
8001e8a: 687b ldr r3, [r7, #4]
|
|
8001e8c: 681b ldr r3, [r3, #0]
|
|
8001e8e: 681b ldr r3, [r3, #0]
|
|
8001e90: f403 6380 and.w r3, r3, #1024 ; 0x400
|
|
8001e94: 2b00 cmp r3, #0
|
|
8001e96: bf0c ite eq
|
|
8001e98: 2301 moveq r3, #1
|
|
8001e9a: 2300 movne r3, #0
|
|
8001e9c: b2db uxtb r3, r3
|
|
8001e9e: 461a mov r2, r3
|
|
8001ea0: 683b ldr r3, [r7, #0]
|
|
8001ea2: 779a strb r2, [r3, #30]
|
|
macconf->CarrierSenseBeforeTransmit = ((READ_BIT(heth->Instance->MACCR,
|
|
8001ea4: 687b ldr r3, [r7, #4]
|
|
8001ea6: 681b ldr r3, [r3, #0]
|
|
8001ea8: 681b ldr r3, [r3, #0]
|
|
ETH_MACCR_ECRSFD) >> 11) > 0U) ? ENABLE : DISABLE;
|
|
8001eaa: f403 6300 and.w r3, r3, #2048 ; 0x800
|
|
8001eae: 2b00 cmp r3, #0
|
|
8001eb0: bf14 ite ne
|
|
8001eb2: 2301 movne r3, #1
|
|
8001eb4: 2300 moveq r3, #0
|
|
8001eb6: b2db uxtb r3, r3
|
|
8001eb8: 461a mov r2, r3
|
|
macconf->CarrierSenseBeforeTransmit = ((READ_BIT(heth->Instance->MACCR,
|
|
8001eba: 683b ldr r3, [r7, #0]
|
|
8001ebc: 775a strb r2, [r3, #29]
|
|
macconf->LoopbackMode = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_LM) >> 12) > 0U) ? ENABLE : DISABLE;
|
|
8001ebe: 687b ldr r3, [r7, #4]
|
|
8001ec0: 681b ldr r3, [r3, #0]
|
|
8001ec2: 681b ldr r3, [r3, #0]
|
|
8001ec4: f403 5380 and.w r3, r3, #4096 ; 0x1000
|
|
8001ec8: 2b00 cmp r3, #0
|
|
8001eca: bf14 ite ne
|
|
8001ecc: 2301 movne r3, #1
|
|
8001ece: 2300 moveq r3, #0
|
|
8001ed0: b2db uxtb r3, r3
|
|
8001ed2: 461a mov r2, r3
|
|
8001ed4: 683b ldr r3, [r7, #0]
|
|
8001ed6: 771a strb r2, [r3, #28]
|
|
macconf->DuplexMode = READ_BIT(heth->Instance->MACCR, ETH_MACCR_DM);
|
|
8001ed8: 687b ldr r3, [r7, #4]
|
|
8001eda: 681b ldr r3, [r3, #0]
|
|
8001edc: 681b ldr r3, [r3, #0]
|
|
8001ede: f403 5200 and.w r2, r3, #8192 ; 0x2000
|
|
8001ee2: 683b ldr r3, [r7, #0]
|
|
8001ee4: 619a str r2, [r3, #24]
|
|
macconf->Speed = READ_BIT(heth->Instance->MACCR, ETH_MACCR_FES);
|
|
8001ee6: 687b ldr r3, [r7, #4]
|
|
8001ee8: 681b ldr r3, [r3, #0]
|
|
8001eea: 681b ldr r3, [r3, #0]
|
|
8001eec: f403 4280 and.w r2, r3, #16384 ; 0x4000
|
|
8001ef0: 683b ldr r3, [r7, #0]
|
|
8001ef2: 615a str r2, [r3, #20]
|
|
macconf->JumboPacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_JE) >> 16) > 0U) ? ENABLE : DISABLE;
|
|
8001ef4: 687b ldr r3, [r7, #4]
|
|
8001ef6: 681b ldr r3, [r3, #0]
|
|
8001ef8: 681b ldr r3, [r3, #0]
|
|
8001efa: f403 3380 and.w r3, r3, #65536 ; 0x10000
|
|
8001efe: 2b00 cmp r3, #0
|
|
8001f00: bf14 ite ne
|
|
8001f02: 2301 movne r3, #1
|
|
8001f04: 2300 moveq r3, #0
|
|
8001f06: b2db uxtb r3, r3
|
|
8001f08: 461a mov r2, r3
|
|
8001f0a: 683b ldr r3, [r7, #0]
|
|
8001f0c: 749a strb r2, [r3, #18]
|
|
macconf->Jabber = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_JD) >> 17) == 0U) ? ENABLE : DISABLE;
|
|
8001f0e: 687b ldr r3, [r7, #4]
|
|
8001f10: 681b ldr r3, [r3, #0]
|
|
8001f12: 681b ldr r3, [r3, #0]
|
|
8001f14: f403 3300 and.w r3, r3, #131072 ; 0x20000
|
|
8001f18: 2b00 cmp r3, #0
|
|
8001f1a: bf0c ite eq
|
|
8001f1c: 2301 moveq r3, #1
|
|
8001f1e: 2300 movne r3, #0
|
|
8001f20: b2db uxtb r3, r3
|
|
8001f22: 461a mov r2, r3
|
|
8001f24: 683b ldr r3, [r7, #0]
|
|
8001f26: 745a strb r2, [r3, #17]
|
|
macconf->Watchdog = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_WD) >> 19) == 0U) ? ENABLE : DISABLE;
|
|
8001f28: 687b ldr r3, [r7, #4]
|
|
8001f2a: 681b ldr r3, [r3, #0]
|
|
8001f2c: 681b ldr r3, [r3, #0]
|
|
8001f2e: f403 2300 and.w r3, r3, #524288 ; 0x80000
|
|
8001f32: 2b00 cmp r3, #0
|
|
8001f34: bf0c ite eq
|
|
8001f36: 2301 moveq r3, #1
|
|
8001f38: 2300 movne r3, #0
|
|
8001f3a: b2db uxtb r3, r3
|
|
8001f3c: 461a mov r2, r3
|
|
8001f3e: 683b ldr r3, [r7, #0]
|
|
8001f40: 741a strb r2, [r3, #16]
|
|
macconf->AutomaticPadCRCStrip = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_ACS) >> 20) > 0U) ? ENABLE : DISABLE;
|
|
8001f42: 687b ldr r3, [r7, #4]
|
|
8001f44: 681b ldr r3, [r3, #0]
|
|
8001f46: 681b ldr r3, [r3, #0]
|
|
8001f48: f403 1380 and.w r3, r3, #1048576 ; 0x100000
|
|
8001f4c: 2b00 cmp r3, #0
|
|
8001f4e: bf14 ite ne
|
|
8001f50: 2301 movne r3, #1
|
|
8001f52: 2300 moveq r3, #0
|
|
8001f54: b2db uxtb r3, r3
|
|
8001f56: 461a mov r2, r3
|
|
8001f58: 683b ldr r3, [r7, #0]
|
|
8001f5a: 73da strb r2, [r3, #15]
|
|
macconf->CRCStripTypePacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_CST) >> 21) > 0U) ? ENABLE : DISABLE;
|
|
8001f5c: 687b ldr r3, [r7, #4]
|
|
8001f5e: 681b ldr r3, [r3, #0]
|
|
8001f60: 681b ldr r3, [r3, #0]
|
|
8001f62: f403 1300 and.w r3, r3, #2097152 ; 0x200000
|
|
8001f66: 2b00 cmp r3, #0
|
|
8001f68: bf14 ite ne
|
|
8001f6a: 2301 movne r3, #1
|
|
8001f6c: 2300 moveq r3, #0
|
|
8001f6e: b2db uxtb r3, r3
|
|
8001f70: 461a mov r2, r3
|
|
8001f72: 683b ldr r3, [r7, #0]
|
|
8001f74: 739a strb r2, [r3, #14]
|
|
macconf->Support2KPacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_S2KP) >> 22) > 0U) ? ENABLE : DISABLE;
|
|
8001f76: 687b ldr r3, [r7, #4]
|
|
8001f78: 681b ldr r3, [r3, #0]
|
|
8001f7a: 681b ldr r3, [r3, #0]
|
|
8001f7c: f403 0380 and.w r3, r3, #4194304 ; 0x400000
|
|
8001f80: 2b00 cmp r3, #0
|
|
8001f82: bf14 ite ne
|
|
8001f84: 2301 movne r3, #1
|
|
8001f86: 2300 moveq r3, #0
|
|
8001f88: b2db uxtb r3, r3
|
|
8001f8a: 461a mov r2, r3
|
|
8001f8c: 683b ldr r3, [r7, #0]
|
|
8001f8e: 735a strb r2, [r3, #13]
|
|
macconf->GiantPacketSizeLimitControl = ((READ_BIT(heth->Instance->MACCR,
|
|
8001f90: 687b ldr r3, [r7, #4]
|
|
8001f92: 681b ldr r3, [r3, #0]
|
|
8001f94: 681b ldr r3, [r3, #0]
|
|
ETH_MACCR_GPSLCE) >> 23) > 0U) ? ENABLE : DISABLE;
|
|
8001f96: f403 0300 and.w r3, r3, #8388608 ; 0x800000
|
|
8001f9a: 2b00 cmp r3, #0
|
|
8001f9c: bf14 ite ne
|
|
8001f9e: 2301 movne r3, #1
|
|
8001fa0: 2300 moveq r3, #0
|
|
8001fa2: b2db uxtb r3, r3
|
|
8001fa4: 461a mov r2, r3
|
|
macconf->GiantPacketSizeLimitControl = ((READ_BIT(heth->Instance->MACCR,
|
|
8001fa6: 683b ldr r3, [r7, #0]
|
|
8001fa8: 731a strb r2, [r3, #12]
|
|
macconf->InterPacketGapVal = READ_BIT(heth->Instance->MACCR, ETH_MACCR_IPG);
|
|
8001faa: 687b ldr r3, [r7, #4]
|
|
8001fac: 681b ldr r3, [r3, #0]
|
|
8001fae: 681b ldr r3, [r3, #0]
|
|
8001fb0: f003 62e0 and.w r2, r3, #117440512 ; 0x7000000
|
|
8001fb4: 683b ldr r3, [r7, #0]
|
|
8001fb6: 609a str r2, [r3, #8]
|
|
macconf->ChecksumOffload = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_IPC) >> 27) > 0U) ? ENABLE : DISABLE;
|
|
8001fb8: 687b ldr r3, [r7, #4]
|
|
8001fba: 681b ldr r3, [r3, #0]
|
|
8001fbc: 681b ldr r3, [r3, #0]
|
|
8001fbe: f003 6300 and.w r3, r3, #134217728 ; 0x8000000
|
|
8001fc2: 2b00 cmp r3, #0
|
|
8001fc4: bf14 ite ne
|
|
8001fc6: 2301 movne r3, #1
|
|
8001fc8: 2300 moveq r3, #0
|
|
8001fca: b2db uxtb r3, r3
|
|
8001fcc: 461a mov r2, r3
|
|
8001fce: 683b ldr r3, [r7, #0]
|
|
8001fd0: 711a strb r2, [r3, #4]
|
|
macconf->SourceAddrControl = READ_BIT(heth->Instance->MACCR, ETH_MACCR_SARC);
|
|
8001fd2: 687b ldr r3, [r7, #4]
|
|
8001fd4: 681b ldr r3, [r3, #0]
|
|
8001fd6: 681b ldr r3, [r3, #0]
|
|
8001fd8: f003 42e0 and.w r2, r3, #1879048192 ; 0x70000000
|
|
8001fdc: 683b ldr r3, [r7, #0]
|
|
8001fde: 601a str r2, [r3, #0]
|
|
|
|
macconf->GiantPacketSizeLimit = READ_BIT(heth->Instance->MACECR, ETH_MACECR_GPSL);
|
|
8001fe0: 687b ldr r3, [r7, #4]
|
|
8001fe2: 681b ldr r3, [r3, #0]
|
|
8001fe4: 685b ldr r3, [r3, #4]
|
|
8001fe6: f3c3 020d ubfx r2, r3, #0, #14
|
|
8001fea: 683b ldr r3, [r7, #0]
|
|
8001fec: 635a str r2, [r3, #52] ; 0x34
|
|
macconf->CRCCheckingRxPackets = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_DCRCC) >> 16) == 0U) ? ENABLE : DISABLE;
|
|
8001fee: 687b ldr r3, [r7, #4]
|
|
8001ff0: 681b ldr r3, [r3, #0]
|
|
8001ff2: 685b ldr r3, [r3, #4]
|
|
8001ff4: f403 3380 and.w r3, r3, #65536 ; 0x10000
|
|
8001ff8: 2b00 cmp r3, #0
|
|
8001ffa: bf0c ite eq
|
|
8001ffc: 2301 moveq r3, #1
|
|
8001ffe: 2300 movne r3, #0
|
|
8002000: b2db uxtb r3, r3
|
|
8002002: 461a mov r2, r3
|
|
8002004: 683b ldr r3, [r7, #0]
|
|
8002006: f883 2032 strb.w r2, [r3, #50] ; 0x32
|
|
macconf->SlowProtocolDetect = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_SPEN) >> 17) > 0U) ? ENABLE : DISABLE;
|
|
800200a: 687b ldr r3, [r7, #4]
|
|
800200c: 681b ldr r3, [r3, #0]
|
|
800200e: 685b ldr r3, [r3, #4]
|
|
8002010: f403 3300 and.w r3, r3, #131072 ; 0x20000
|
|
8002014: 2b00 cmp r3, #0
|
|
8002016: bf14 ite ne
|
|
8002018: 2301 movne r3, #1
|
|
800201a: 2300 moveq r3, #0
|
|
800201c: b2db uxtb r3, r3
|
|
800201e: 461a mov r2, r3
|
|
8002020: 683b ldr r3, [r7, #0]
|
|
8002022: f883 2031 strb.w r2, [r3, #49] ; 0x31
|
|
macconf->UnicastSlowProtocolPacketDetect = ((READ_BIT(heth->Instance->MACECR,
|
|
8002026: 687b ldr r3, [r7, #4]
|
|
8002028: 681b ldr r3, [r3, #0]
|
|
800202a: 685b ldr r3, [r3, #4]
|
|
ETH_MACECR_USP) >> 18) > 0U) ? ENABLE : DISABLE;
|
|
800202c: f403 2380 and.w r3, r3, #262144 ; 0x40000
|
|
8002030: 2b00 cmp r3, #0
|
|
8002032: bf14 ite ne
|
|
8002034: 2301 movne r3, #1
|
|
8002036: 2300 moveq r3, #0
|
|
8002038: b2db uxtb r3, r3
|
|
800203a: 461a mov r2, r3
|
|
macconf->UnicastSlowProtocolPacketDetect = ((READ_BIT(heth->Instance->MACECR,
|
|
800203c: 683b ldr r3, [r7, #0]
|
|
800203e: f883 2030 strb.w r2, [r3, #48] ; 0x30
|
|
macconf->ExtendedInterPacketGap = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_EIPGEN) >> 24) > 0U)
|
|
8002042: 687b ldr r3, [r7, #4]
|
|
8002044: 681b ldr r3, [r3, #0]
|
|
8002046: 685b ldr r3, [r3, #4]
|
|
8002048: f003 7380 and.w r3, r3, #16777216 ; 0x1000000
|
|
? ENABLE : DISABLE;
|
|
800204c: 2b00 cmp r3, #0
|
|
800204e: bf14 ite ne
|
|
8002050: 2301 movne r3, #1
|
|
8002052: 2300 moveq r3, #0
|
|
8002054: b2db uxtb r3, r3
|
|
8002056: 461a mov r2, r3
|
|
macconf->ExtendedInterPacketGap = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_EIPGEN) >> 24) > 0U)
|
|
8002058: 683b ldr r3, [r7, #0]
|
|
800205a: f883 2038 strb.w r2, [r3, #56] ; 0x38
|
|
macconf->ExtendedInterPacketGapVal = READ_BIT(heth->Instance->MACECR, ETH_MACECR_EIPG) >> 25;
|
|
800205e: 687b ldr r3, [r7, #4]
|
|
8002060: 681b ldr r3, [r3, #0]
|
|
8002062: 685b ldr r3, [r3, #4]
|
|
8002064: 0e5b lsrs r3, r3, #25
|
|
8002066: f003 021f and.w r2, r3, #31
|
|
800206a: 683b ldr r3, [r7, #0]
|
|
800206c: 63da str r2, [r3, #60] ; 0x3c
|
|
|
|
|
|
macconf->ProgrammableWatchdog = ((READ_BIT(heth->Instance->MACWTR, ETH_MACWTR_PWE) >> 8) > 0U) ? ENABLE : DISABLE;
|
|
800206e: 687b ldr r3, [r7, #4]
|
|
8002070: 681b ldr r3, [r3, #0]
|
|
8002072: 68db ldr r3, [r3, #12]
|
|
8002074: f403 7380 and.w r3, r3, #256 ; 0x100
|
|
8002078: 2b00 cmp r3, #0
|
|
800207a: bf14 ite ne
|
|
800207c: 2301 movne r3, #1
|
|
800207e: 2300 moveq r3, #0
|
|
8002080: b2db uxtb r3, r3
|
|
8002082: 461a mov r2, r3
|
|
8002084: 683b ldr r3, [r7, #0]
|
|
8002086: f883 2040 strb.w r2, [r3, #64] ; 0x40
|
|
macconf->WatchdogTimeout = READ_BIT(heth->Instance->MACWTR, ETH_MACWTR_WTO);
|
|
800208a: 687b ldr r3, [r7, #4]
|
|
800208c: 681b ldr r3, [r3, #0]
|
|
800208e: 68db ldr r3, [r3, #12]
|
|
8002090: f003 020f and.w r2, r3, #15
|
|
8002094: 683b ldr r3, [r7, #0]
|
|
8002096: 645a str r2, [r3, #68] ; 0x44
|
|
|
|
macconf->TransmitFlowControl = ((READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_TFE) >> 1) > 0U) ? ENABLE : DISABLE;
|
|
8002098: 687b ldr r3, [r7, #4]
|
|
800209a: 681b ldr r3, [r3, #0]
|
|
800209c: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800209e: f003 0302 and.w r3, r3, #2
|
|
80020a2: 2b00 cmp r3, #0
|
|
80020a4: bf14 ite ne
|
|
80020a6: 2301 movne r3, #1
|
|
80020a8: 2300 moveq r3, #0
|
|
80020aa: b2db uxtb r3, r3
|
|
80020ac: 461a mov r2, r3
|
|
80020ae: 683b ldr r3, [r7, #0]
|
|
80020b0: f883 2054 strb.w r2, [r3, #84] ; 0x54
|
|
macconf->ZeroQuantaPause = ((READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_DZPQ) >> 7) == 0U) ? ENABLE : DISABLE;
|
|
80020b4: 687b ldr r3, [r7, #4]
|
|
80020b6: 681b ldr r3, [r3, #0]
|
|
80020b8: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
80020ba: f003 0380 and.w r3, r3, #128 ; 0x80
|
|
80020be: 2b00 cmp r3, #0
|
|
80020c0: bf0c ite eq
|
|
80020c2: 2301 moveq r3, #1
|
|
80020c4: 2300 movne r3, #0
|
|
80020c6: b2db uxtb r3, r3
|
|
80020c8: 461a mov r2, r3
|
|
80020ca: 683b ldr r3, [r7, #0]
|
|
80020cc: f883 204c strb.w r2, [r3, #76] ; 0x4c
|
|
macconf->PauseLowThreshold = READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_PLT);
|
|
80020d0: 687b ldr r3, [r7, #4]
|
|
80020d2: 681b ldr r3, [r3, #0]
|
|
80020d4: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
80020d6: f003 0270 and.w r2, r3, #112 ; 0x70
|
|
80020da: 683b ldr r3, [r7, #0]
|
|
80020dc: 651a str r2, [r3, #80] ; 0x50
|
|
macconf->PauseTime = (READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_PT) >> 16);
|
|
80020de: 687b ldr r3, [r7, #4]
|
|
80020e0: 681b ldr r3, [r3, #0]
|
|
80020e2: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
80020e4: 0c1b lsrs r3, r3, #16
|
|
80020e6: b29a uxth r2, r3
|
|
80020e8: 683b ldr r3, [r7, #0]
|
|
80020ea: 649a str r2, [r3, #72] ; 0x48
|
|
|
|
|
|
macconf->ReceiveFlowControl = (READ_BIT(heth->Instance->MACRFCR, ETH_MACRFCR_RFE) > 0U) ? ENABLE : DISABLE;
|
|
80020ec: 687b ldr r3, [r7, #4]
|
|
80020ee: 681b ldr r3, [r3, #0]
|
|
80020f0: f8d3 3090 ldr.w r3, [r3, #144] ; 0x90
|
|
80020f4: f003 0301 and.w r3, r3, #1
|
|
80020f8: 2b00 cmp r3, #0
|
|
80020fa: bf14 ite ne
|
|
80020fc: 2301 movne r3, #1
|
|
80020fe: 2300 moveq r3, #0
|
|
8002100: b2db uxtb r3, r3
|
|
8002102: 461a mov r2, r3
|
|
8002104: 683b ldr r3, [r7, #0]
|
|
8002106: f883 2056 strb.w r2, [r3, #86] ; 0x56
|
|
macconf->UnicastPausePacketDetect = ((READ_BIT(heth->Instance->MACRFCR, ETH_MACRFCR_UP) >> 1) > 0U)
|
|
800210a: 687b ldr r3, [r7, #4]
|
|
800210c: 681b ldr r3, [r3, #0]
|
|
800210e: f8d3 3090 ldr.w r3, [r3, #144] ; 0x90
|
|
8002112: f003 0302 and.w r3, r3, #2
|
|
? ENABLE : DISABLE;
|
|
8002116: 2b00 cmp r3, #0
|
|
8002118: bf14 ite ne
|
|
800211a: 2301 movne r3, #1
|
|
800211c: 2300 moveq r3, #0
|
|
800211e: b2db uxtb r3, r3
|
|
8002120: 461a mov r2, r3
|
|
macconf->UnicastPausePacketDetect = ((READ_BIT(heth->Instance->MACRFCR, ETH_MACRFCR_UP) >> 1) > 0U)
|
|
8002122: 683b ldr r3, [r7, #0]
|
|
8002124: f883 2055 strb.w r2, [r3, #85] ; 0x55
|
|
|
|
macconf->TransmitQueueMode = READ_BIT(heth->Instance->MTLTQOMR, (ETH_MTLTQOMR_TTC | ETH_MTLTQOMR_TSF));
|
|
8002128: 687b ldr r3, [r7, #4]
|
|
800212a: 681b ldr r3, [r3, #0]
|
|
800212c: f8d3 3d00 ldr.w r3, [r3, #3328] ; 0xd00
|
|
8002130: f003 0272 and.w r2, r3, #114 ; 0x72
|
|
8002134: 683b ldr r3, [r7, #0]
|
|
8002136: 659a str r2, [r3, #88] ; 0x58
|
|
|
|
macconf->ReceiveQueueMode = READ_BIT(heth->Instance->MTLRQOMR, (ETH_MTLRQOMR_RTC | ETH_MTLRQOMR_RSF));
|
|
8002138: 687b ldr r3, [r7, #4]
|
|
800213a: 681b ldr r3, [r3, #0]
|
|
800213c: f8d3 3d30 ldr.w r3, [r3, #3376] ; 0xd30
|
|
8002140: f003 0223 and.w r2, r3, #35 ; 0x23
|
|
8002144: 683b ldr r3, [r7, #0]
|
|
8002146: 65da str r2, [r3, #92] ; 0x5c
|
|
macconf->ForwardRxUndersizedGoodPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
|
|
8002148: 687b ldr r3, [r7, #4]
|
|
800214a: 681b ldr r3, [r3, #0]
|
|
800214c: f8d3 3d30 ldr.w r3, [r3, #3376] ; 0xd30
|
|
ETH_MTLRQOMR_FUP) >> 3) > 0U) ? ENABLE : DISABLE;
|
|
8002150: f003 0308 and.w r3, r3, #8
|
|
8002154: 2b00 cmp r3, #0
|
|
8002156: bf14 ite ne
|
|
8002158: 2301 movne r3, #1
|
|
800215a: 2300 moveq r3, #0
|
|
800215c: b2db uxtb r3, r3
|
|
800215e: 461a mov r2, r3
|
|
macconf->ForwardRxUndersizedGoodPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
|
|
8002160: 683b ldr r3, [r7, #0]
|
|
8002162: f883 2062 strb.w r2, [r3, #98] ; 0x62
|
|
macconf->ForwardRxErrorPacket = ((READ_BIT(heth->Instance->MTLRQOMR, ETH_MTLRQOMR_FEP) >> 4) > 0U) ? ENABLE : DISABLE;
|
|
8002166: 687b ldr r3, [r7, #4]
|
|
8002168: 681b ldr r3, [r3, #0]
|
|
800216a: f8d3 3d30 ldr.w r3, [r3, #3376] ; 0xd30
|
|
800216e: f003 0310 and.w r3, r3, #16
|
|
8002172: 2b00 cmp r3, #0
|
|
8002174: bf14 ite ne
|
|
8002176: 2301 movne r3, #1
|
|
8002178: 2300 moveq r3, #0
|
|
800217a: b2db uxtb r3, r3
|
|
800217c: 461a mov r2, r3
|
|
800217e: 683b ldr r3, [r7, #0]
|
|
8002180: f883 2061 strb.w r2, [r3, #97] ; 0x61
|
|
macconf->DropTCPIPChecksumErrorPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
|
|
8002184: 687b ldr r3, [r7, #4]
|
|
8002186: 681b ldr r3, [r3, #0]
|
|
8002188: f8d3 3d30 ldr.w r3, [r3, #3376] ; 0xd30
|
|
ETH_MTLRQOMR_DISTCPEF) >> 6) == 0U) ? ENABLE : DISABLE;
|
|
800218c: f003 0340 and.w r3, r3, #64 ; 0x40
|
|
8002190: 2b00 cmp r3, #0
|
|
8002192: bf0c ite eq
|
|
8002194: 2301 moveq r3, #1
|
|
8002196: 2300 movne r3, #0
|
|
8002198: b2db uxtb r3, r3
|
|
800219a: 461a mov r2, r3
|
|
macconf->DropTCPIPChecksumErrorPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
|
|
800219c: 683b ldr r3, [r7, #0]
|
|
800219e: f883 2060 strb.w r2, [r3, #96] ; 0x60
|
|
|
|
return HAL_OK;
|
|
80021a2: 2300 movs r3, #0
|
|
}
|
|
80021a4: 4618 mov r0, r3
|
|
80021a6: 370c adds r7, #12
|
|
80021a8: 46bd mov sp, r7
|
|
80021aa: f85d 7b04 ldr.w r7, [sp], #4
|
|
80021ae: 4770 bx lr
|
|
|
|
080021b0 <HAL_ETH_SetMACConfig>:
|
|
* @param macconf: pointer to a ETH_MACConfigTypeDef structure that contains
|
|
* the configuration of the MAC.
|
|
* @retval HAL status
|
|
*/
|
|
HAL_StatusTypeDef HAL_ETH_SetMACConfig(ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
|
|
{
|
|
80021b0: b580 push {r7, lr}
|
|
80021b2: b082 sub sp, #8
|
|
80021b4: af00 add r7, sp, #0
|
|
80021b6: 6078 str r0, [r7, #4]
|
|
80021b8: 6039 str r1, [r7, #0]
|
|
if (macconf == NULL)
|
|
80021ba: 683b ldr r3, [r7, #0]
|
|
80021bc: 2b00 cmp r3, #0
|
|
80021be: d101 bne.n 80021c4 <HAL_ETH_SetMACConfig+0x14>
|
|
{
|
|
return HAL_ERROR;
|
|
80021c0: 2301 movs r3, #1
|
|
80021c2: e00b b.n 80021dc <HAL_ETH_SetMACConfig+0x2c>
|
|
}
|
|
|
|
if (heth->gState == HAL_ETH_STATE_READY)
|
|
80021c4: 687b ldr r3, [r7, #4]
|
|
80021c6: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
80021ca: 2b10 cmp r3, #16
|
|
80021cc: d105 bne.n 80021da <HAL_ETH_SetMACConfig+0x2a>
|
|
{
|
|
ETH_SetMACConfig(heth, macconf);
|
|
80021ce: 6839 ldr r1, [r7, #0]
|
|
80021d0: 6878 ldr r0, [r7, #4]
|
|
80021d2: f000 f85f bl 8002294 <ETH_SetMACConfig>
|
|
|
|
return HAL_OK;
|
|
80021d6: 2300 movs r3, #0
|
|
80021d8: e000 b.n 80021dc <HAL_ETH_SetMACConfig+0x2c>
|
|
}
|
|
else
|
|
{
|
|
return HAL_ERROR;
|
|
80021da: 2301 movs r3, #1
|
|
}
|
|
}
|
|
80021dc: 4618 mov r0, r3
|
|
80021de: 3708 adds r7, #8
|
|
80021e0: 46bd mov sp, r7
|
|
80021e2: bd80 pop {r7, pc}
|
|
|
|
080021e4 <HAL_ETH_SetMDIOClockRange>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval None
|
|
*/
|
|
void HAL_ETH_SetMDIOClockRange(ETH_HandleTypeDef *heth)
|
|
{
|
|
80021e4: b580 push {r7, lr}
|
|
80021e6: b084 sub sp, #16
|
|
80021e8: af00 add r7, sp, #0
|
|
80021ea: 6078 str r0, [r7, #4]
|
|
uint32_t hclk;
|
|
uint32_t tmpreg;
|
|
|
|
/* Get the ETHERNET MACMDIOAR value */
|
|
tmpreg = (heth->Instance)->MACMDIOAR;
|
|
80021ec: 687b ldr r3, [r7, #4]
|
|
80021ee: 681b ldr r3, [r3, #0]
|
|
80021f0: f8d3 3200 ldr.w r3, [r3, #512] ; 0x200
|
|
80021f4: 60fb str r3, [r7, #12]
|
|
|
|
/* Clear CSR Clock Range bits */
|
|
tmpreg &= ~ETH_MACMDIOAR_CR;
|
|
80021f6: 68fb ldr r3, [r7, #12]
|
|
80021f8: f423 6370 bic.w r3, r3, #3840 ; 0xf00
|
|
80021fc: 60fb str r3, [r7, #12]
|
|
|
|
/* Get hclk frequency value */
|
|
hclk = HAL_RCC_GetHCLKFreq();
|
|
80021fe: f001 fea9 bl 8003f54 <HAL_RCC_GetHCLKFreq>
|
|
8002202: 60b8 str r0, [r7, #8]
|
|
|
|
/* Set CR bits depending on hclk value */
|
|
if ((hclk >= 20000000U) && (hclk < 35000000U))
|
|
8002204: 68bb ldr r3, [r7, #8]
|
|
8002206: 4a1e ldr r2, [pc, #120] ; (8002280 <HAL_ETH_SetMDIOClockRange+0x9c>)
|
|
8002208: 4293 cmp r3, r2
|
|
800220a: d908 bls.n 800221e <HAL_ETH_SetMDIOClockRange+0x3a>
|
|
800220c: 68bb ldr r3, [r7, #8]
|
|
800220e: 4a1d ldr r2, [pc, #116] ; (8002284 <HAL_ETH_SetMDIOClockRange+0xa0>)
|
|
8002210: 4293 cmp r3, r2
|
|
8002212: d804 bhi.n 800221e <HAL_ETH_SetMDIOClockRange+0x3a>
|
|
{
|
|
/* CSR Clock Range between 20-35 MHz */
|
|
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV16;
|
|
8002214: 68fb ldr r3, [r7, #12]
|
|
8002216: f443 7300 orr.w r3, r3, #512 ; 0x200
|
|
800221a: 60fb str r3, [r7, #12]
|
|
800221c: e027 b.n 800226e <HAL_ETH_SetMDIOClockRange+0x8a>
|
|
}
|
|
else if ((hclk >= 35000000U) && (hclk < 60000000U))
|
|
800221e: 68bb ldr r3, [r7, #8]
|
|
8002220: 4a18 ldr r2, [pc, #96] ; (8002284 <HAL_ETH_SetMDIOClockRange+0xa0>)
|
|
8002222: 4293 cmp r3, r2
|
|
8002224: d908 bls.n 8002238 <HAL_ETH_SetMDIOClockRange+0x54>
|
|
8002226: 68bb ldr r3, [r7, #8]
|
|
8002228: 4a17 ldr r2, [pc, #92] ; (8002288 <HAL_ETH_SetMDIOClockRange+0xa4>)
|
|
800222a: 4293 cmp r3, r2
|
|
800222c: d204 bcs.n 8002238 <HAL_ETH_SetMDIOClockRange+0x54>
|
|
{
|
|
/* CSR Clock Range between 35-60 MHz */
|
|
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV26;
|
|
800222e: 68fb ldr r3, [r7, #12]
|
|
8002230: f443 7340 orr.w r3, r3, #768 ; 0x300
|
|
8002234: 60fb str r3, [r7, #12]
|
|
8002236: e01a b.n 800226e <HAL_ETH_SetMDIOClockRange+0x8a>
|
|
}
|
|
else if ((hclk >= 60000000U) && (hclk < 100000000U))
|
|
8002238: 68bb ldr r3, [r7, #8]
|
|
800223a: 4a13 ldr r2, [pc, #76] ; (8002288 <HAL_ETH_SetMDIOClockRange+0xa4>)
|
|
800223c: 4293 cmp r3, r2
|
|
800223e: d303 bcc.n 8002248 <HAL_ETH_SetMDIOClockRange+0x64>
|
|
8002240: 68bb ldr r3, [r7, #8]
|
|
8002242: 4a12 ldr r2, [pc, #72] ; (800228c <HAL_ETH_SetMDIOClockRange+0xa8>)
|
|
8002244: 4293 cmp r3, r2
|
|
8002246: d911 bls.n 800226c <HAL_ETH_SetMDIOClockRange+0x88>
|
|
{
|
|
/* CSR Clock Range between 60-100 MHz */
|
|
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV42;
|
|
}
|
|
else if ((hclk >= 100000000U) && (hclk < 150000000U))
|
|
8002248: 68bb ldr r3, [r7, #8]
|
|
800224a: 4a10 ldr r2, [pc, #64] ; (800228c <HAL_ETH_SetMDIOClockRange+0xa8>)
|
|
800224c: 4293 cmp r3, r2
|
|
800224e: d908 bls.n 8002262 <HAL_ETH_SetMDIOClockRange+0x7e>
|
|
8002250: 68bb ldr r3, [r7, #8]
|
|
8002252: 4a0f ldr r2, [pc, #60] ; (8002290 <HAL_ETH_SetMDIOClockRange+0xac>)
|
|
8002254: 4293 cmp r3, r2
|
|
8002256: d804 bhi.n 8002262 <HAL_ETH_SetMDIOClockRange+0x7e>
|
|
{
|
|
/* CSR Clock Range between 100-150 MHz */
|
|
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV62;
|
|
8002258: 68fb ldr r3, [r7, #12]
|
|
800225a: f443 7380 orr.w r3, r3, #256 ; 0x100
|
|
800225e: 60fb str r3, [r7, #12]
|
|
8002260: e005 b.n 800226e <HAL_ETH_SetMDIOClockRange+0x8a>
|
|
}
|
|
else /* (hclk >= 150000000)&&(hclk <= 200000000) */
|
|
{
|
|
/* CSR Clock Range between 150-200 MHz */
|
|
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV102;
|
|
8002262: 68fb ldr r3, [r7, #12]
|
|
8002264: f443 6380 orr.w r3, r3, #1024 ; 0x400
|
|
8002268: 60fb str r3, [r7, #12]
|
|
800226a: e000 b.n 800226e <HAL_ETH_SetMDIOClockRange+0x8a>
|
|
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV42;
|
|
800226c: bf00 nop
|
|
}
|
|
|
|
/* Configure the CSR Clock Range */
|
|
(heth->Instance)->MACMDIOAR = (uint32_t)tmpreg;
|
|
800226e: 687b ldr r3, [r7, #4]
|
|
8002270: 681b ldr r3, [r3, #0]
|
|
8002272: 68fa ldr r2, [r7, #12]
|
|
8002274: f8c3 2200 str.w r2, [r3, #512] ; 0x200
|
|
}
|
|
8002278: bf00 nop
|
|
800227a: 3710 adds r7, #16
|
|
800227c: 46bd mov sp, r7
|
|
800227e: bd80 pop {r7, pc}
|
|
8002280: 01312cff .word 0x01312cff
|
|
8002284: 02160ebf .word 0x02160ebf
|
|
8002288: 03938700 .word 0x03938700
|
|
800228c: 05f5e0ff .word 0x05f5e0ff
|
|
8002290: 08f0d17f .word 0x08f0d17f
|
|
|
|
08002294 <ETH_SetMACConfig>:
|
|
* @{
|
|
*/
|
|
|
|
|
|
static void ETH_SetMACConfig(ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
|
|
{
|
|
8002294: b480 push {r7}
|
|
8002296: b085 sub sp, #20
|
|
8002298: af00 add r7, sp, #0
|
|
800229a: 6078 str r0, [r7, #4]
|
|
800229c: 6039 str r1, [r7, #0]
|
|
uint32_t macregval;
|
|
|
|
/*------------------------ MACCR Configuration --------------------*/
|
|
macregval = (macconf->InterPacketGapVal |
|
|
800229e: 683b ldr r3, [r7, #0]
|
|
80022a0: 689a ldr r2, [r3, #8]
|
|
macconf->SourceAddrControl |
|
|
80022a2: 683b ldr r3, [r7, #0]
|
|
80022a4: 681b ldr r3, [r3, #0]
|
|
macregval = (macconf->InterPacketGapVal |
|
|
80022a6: 431a orrs r2, r3
|
|
((uint32_t)macconf->ChecksumOffload << 27) |
|
|
80022a8: 683b ldr r3, [r7, #0]
|
|
80022aa: 791b ldrb r3, [r3, #4]
|
|
80022ac: 06db lsls r3, r3, #27
|
|
macconf->SourceAddrControl |
|
|
80022ae: 431a orrs r2, r3
|
|
((uint32_t)macconf->GiantPacketSizeLimitControl << 23) |
|
|
80022b0: 683b ldr r3, [r7, #0]
|
|
80022b2: 7b1b ldrb r3, [r3, #12]
|
|
80022b4: 05db lsls r3, r3, #23
|
|
((uint32_t)macconf->ChecksumOffload << 27) |
|
|
80022b6: 431a orrs r2, r3
|
|
((uint32_t)macconf->Support2KPacket << 22) |
|
|
80022b8: 683b ldr r3, [r7, #0]
|
|
80022ba: 7b5b ldrb r3, [r3, #13]
|
|
80022bc: 059b lsls r3, r3, #22
|
|
((uint32_t)macconf->GiantPacketSizeLimitControl << 23) |
|
|
80022be: 431a orrs r2, r3
|
|
((uint32_t)macconf->CRCStripTypePacket << 21) |
|
|
80022c0: 683b ldr r3, [r7, #0]
|
|
80022c2: 7b9b ldrb r3, [r3, #14]
|
|
80022c4: 055b lsls r3, r3, #21
|
|
((uint32_t)macconf->Support2KPacket << 22) |
|
|
80022c6: 431a orrs r2, r3
|
|
((uint32_t)macconf->AutomaticPadCRCStrip << 20) |
|
|
80022c8: 683b ldr r3, [r7, #0]
|
|
80022ca: 7bdb ldrb r3, [r3, #15]
|
|
80022cc: 051b lsls r3, r3, #20
|
|
((uint32_t)macconf->CRCStripTypePacket << 21) |
|
|
80022ce: 4313 orrs r3, r2
|
|
((uint32_t)((macconf->Watchdog == DISABLE) ? 1U : 0U) << 19) |
|
|
80022d0: 683a ldr r2, [r7, #0]
|
|
80022d2: 7c12 ldrb r2, [r2, #16]
|
|
80022d4: 2a00 cmp r2, #0
|
|
80022d6: d102 bne.n 80022de <ETH_SetMACConfig+0x4a>
|
|
80022d8: f44f 2200 mov.w r2, #524288 ; 0x80000
|
|
80022dc: e000 b.n 80022e0 <ETH_SetMACConfig+0x4c>
|
|
80022de: 2200 movs r2, #0
|
|
((uint32_t)macconf->AutomaticPadCRCStrip << 20) |
|
|
80022e0: 4313 orrs r3, r2
|
|
((uint32_t)((macconf->Jabber == DISABLE) ? 1U : 0U) << 17) |
|
|
80022e2: 683a ldr r2, [r7, #0]
|
|
80022e4: 7c52 ldrb r2, [r2, #17]
|
|
80022e6: 2a00 cmp r2, #0
|
|
80022e8: d102 bne.n 80022f0 <ETH_SetMACConfig+0x5c>
|
|
80022ea: f44f 3200 mov.w r2, #131072 ; 0x20000
|
|
80022ee: e000 b.n 80022f2 <ETH_SetMACConfig+0x5e>
|
|
80022f0: 2200 movs r2, #0
|
|
((uint32_t)((macconf->Watchdog == DISABLE) ? 1U : 0U) << 19) |
|
|
80022f2: 431a orrs r2, r3
|
|
((uint32_t)macconf->JumboPacket << 16) |
|
|
80022f4: 683b ldr r3, [r7, #0]
|
|
80022f6: 7c9b ldrb r3, [r3, #18]
|
|
80022f8: 041b lsls r3, r3, #16
|
|
((uint32_t)((macconf->Jabber == DISABLE) ? 1U : 0U) << 17) |
|
|
80022fa: 431a orrs r2, r3
|
|
macconf->Speed |
|
|
80022fc: 683b ldr r3, [r7, #0]
|
|
80022fe: 695b ldr r3, [r3, #20]
|
|
((uint32_t)macconf->JumboPacket << 16) |
|
|
8002300: 431a orrs r2, r3
|
|
macconf->DuplexMode |
|
|
8002302: 683b ldr r3, [r7, #0]
|
|
8002304: 699b ldr r3, [r3, #24]
|
|
macconf->Speed |
|
|
8002306: 431a orrs r2, r3
|
|
((uint32_t)macconf->LoopbackMode << 12) |
|
|
8002308: 683b ldr r3, [r7, #0]
|
|
800230a: 7f1b ldrb r3, [r3, #28]
|
|
800230c: 031b lsls r3, r3, #12
|
|
macconf->DuplexMode |
|
|
800230e: 431a orrs r2, r3
|
|
((uint32_t)macconf->CarrierSenseBeforeTransmit << 11) |
|
|
8002310: 683b ldr r3, [r7, #0]
|
|
8002312: 7f5b ldrb r3, [r3, #29]
|
|
8002314: 02db lsls r3, r3, #11
|
|
((uint32_t)macconf->LoopbackMode << 12) |
|
|
8002316: 4313 orrs r3, r2
|
|
((uint32_t)((macconf->ReceiveOwn == DISABLE) ? 1U : 0U) << 10) |
|
|
8002318: 683a ldr r2, [r7, #0]
|
|
800231a: 7f92 ldrb r2, [r2, #30]
|
|
800231c: 2a00 cmp r2, #0
|
|
800231e: d102 bne.n 8002326 <ETH_SetMACConfig+0x92>
|
|
8002320: f44f 6280 mov.w r2, #1024 ; 0x400
|
|
8002324: e000 b.n 8002328 <ETH_SetMACConfig+0x94>
|
|
8002326: 2200 movs r2, #0
|
|
((uint32_t)macconf->CarrierSenseBeforeTransmit << 11) |
|
|
8002328: 431a orrs r2, r3
|
|
((uint32_t)macconf->CarrierSenseDuringTransmit << 9) |
|
|
800232a: 683b ldr r3, [r7, #0]
|
|
800232c: 7fdb ldrb r3, [r3, #31]
|
|
800232e: 025b lsls r3, r3, #9
|
|
((uint32_t)((macconf->ReceiveOwn == DISABLE) ? 1U : 0U) << 10) |
|
|
8002330: 4313 orrs r3, r2
|
|
((uint32_t)((macconf->RetryTransmission == DISABLE) ? 1U : 0U) << 8) |
|
|
8002332: 683a ldr r2, [r7, #0]
|
|
8002334: f892 2020 ldrb.w r2, [r2, #32]
|
|
8002338: 2a00 cmp r2, #0
|
|
800233a: d102 bne.n 8002342 <ETH_SetMACConfig+0xae>
|
|
800233c: f44f 7280 mov.w r2, #256 ; 0x100
|
|
8002340: e000 b.n 8002344 <ETH_SetMACConfig+0xb0>
|
|
8002342: 2200 movs r2, #0
|
|
((uint32_t)macconf->CarrierSenseDuringTransmit << 9) |
|
|
8002344: 431a orrs r2, r3
|
|
macconf->BackOffLimit |
|
|
8002346: 683b ldr r3, [r7, #0]
|
|
8002348: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
((uint32_t)((macconf->RetryTransmission == DISABLE) ? 1U : 0U) << 8) |
|
|
800234a: 431a orrs r2, r3
|
|
((uint32_t)macconf->DeferralCheck << 4) |
|
|
800234c: 683b ldr r3, [r7, #0]
|
|
800234e: f893 3028 ldrb.w r3, [r3, #40] ; 0x28
|
|
8002352: 011b lsls r3, r3, #4
|
|
macconf->BackOffLimit |
|
|
8002354: 431a orrs r2, r3
|
|
macconf->PreambleLength);
|
|
8002356: 683b ldr r3, [r7, #0]
|
|
8002358: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
macregval = (macconf->InterPacketGapVal |
|
|
800235a: 4313 orrs r3, r2
|
|
800235c: 60fb str r3, [r7, #12]
|
|
|
|
/* Write to MACCR */
|
|
MODIFY_REG(heth->Instance->MACCR, ETH_MACCR_MASK, macregval);
|
|
800235e: 687b ldr r3, [r7, #4]
|
|
8002360: 681b ldr r3, [r3, #0]
|
|
8002362: 681a ldr r2, [r3, #0]
|
|
8002364: 4b56 ldr r3, [pc, #344] ; (80024c0 <ETH_SetMACConfig+0x22c>)
|
|
8002366: 4013 ands r3, r2
|
|
8002368: 687a ldr r2, [r7, #4]
|
|
800236a: 6812 ldr r2, [r2, #0]
|
|
800236c: 68f9 ldr r1, [r7, #12]
|
|
800236e: 430b orrs r3, r1
|
|
8002370: 6013 str r3, [r2, #0]
|
|
|
|
/*------------------------ MACECR Configuration --------------------*/
|
|
macregval = ((macconf->ExtendedInterPacketGapVal << 25) |
|
|
8002372: 683b ldr r3, [r7, #0]
|
|
8002374: 6bdb ldr r3, [r3, #60] ; 0x3c
|
|
8002376: 065a lsls r2, r3, #25
|
|
((uint32_t)macconf->ExtendedInterPacketGap << 24) |
|
|
8002378: 683b ldr r3, [r7, #0]
|
|
800237a: f893 3038 ldrb.w r3, [r3, #56] ; 0x38
|
|
800237e: 061b lsls r3, r3, #24
|
|
macregval = ((macconf->ExtendedInterPacketGapVal << 25) |
|
|
8002380: 431a orrs r2, r3
|
|
((uint32_t)macconf->UnicastSlowProtocolPacketDetect << 18) |
|
|
8002382: 683b ldr r3, [r7, #0]
|
|
8002384: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
8002388: 049b lsls r3, r3, #18
|
|
((uint32_t)macconf->ExtendedInterPacketGap << 24) |
|
|
800238a: 431a orrs r2, r3
|
|
((uint32_t)macconf->SlowProtocolDetect << 17) |
|
|
800238c: 683b ldr r3, [r7, #0]
|
|
800238e: f893 3031 ldrb.w r3, [r3, #49] ; 0x31
|
|
8002392: 045b lsls r3, r3, #17
|
|
((uint32_t)macconf->UnicastSlowProtocolPacketDetect << 18) |
|
|
8002394: 4313 orrs r3, r2
|
|
((uint32_t)((macconf->CRCCheckingRxPackets == DISABLE) ? 1U : 0U) << 16) |
|
|
8002396: 683a ldr r2, [r7, #0]
|
|
8002398: f892 2032 ldrb.w r2, [r2, #50] ; 0x32
|
|
800239c: 2a00 cmp r2, #0
|
|
800239e: d102 bne.n 80023a6 <ETH_SetMACConfig+0x112>
|
|
80023a0: f44f 3280 mov.w r2, #65536 ; 0x10000
|
|
80023a4: e000 b.n 80023a8 <ETH_SetMACConfig+0x114>
|
|
80023a6: 2200 movs r2, #0
|
|
((uint32_t)macconf->SlowProtocolDetect << 17) |
|
|
80023a8: 431a orrs r2, r3
|
|
macconf->GiantPacketSizeLimit);
|
|
80023aa: 683b ldr r3, [r7, #0]
|
|
80023ac: 6b5b ldr r3, [r3, #52] ; 0x34
|
|
macregval = ((macconf->ExtendedInterPacketGapVal << 25) |
|
|
80023ae: 4313 orrs r3, r2
|
|
80023b0: 60fb str r3, [r7, #12]
|
|
|
|
/* Write to MACECR */
|
|
MODIFY_REG(heth->Instance->MACECR, ETH_MACECR_MASK, macregval);
|
|
80023b2: 687b ldr r3, [r7, #4]
|
|
80023b4: 681b ldr r3, [r3, #0]
|
|
80023b6: 685a ldr r2, [r3, #4]
|
|
80023b8: 4b42 ldr r3, [pc, #264] ; (80024c4 <ETH_SetMACConfig+0x230>)
|
|
80023ba: 4013 ands r3, r2
|
|
80023bc: 687a ldr r2, [r7, #4]
|
|
80023be: 6812 ldr r2, [r2, #0]
|
|
80023c0: 68f9 ldr r1, [r7, #12]
|
|
80023c2: 430b orrs r3, r1
|
|
80023c4: 6053 str r3, [r2, #4]
|
|
|
|
/*------------------------ MACWTR Configuration --------------------*/
|
|
macregval = (((uint32_t)macconf->ProgrammableWatchdog << 8) |
|
|
80023c6: 683b ldr r3, [r7, #0]
|
|
80023c8: f893 3040 ldrb.w r3, [r3, #64] ; 0x40
|
|
80023cc: 021a lsls r2, r3, #8
|
|
macconf->WatchdogTimeout);
|
|
80023ce: 683b ldr r3, [r7, #0]
|
|
80023d0: 6c5b ldr r3, [r3, #68] ; 0x44
|
|
macregval = (((uint32_t)macconf->ProgrammableWatchdog << 8) |
|
|
80023d2: 4313 orrs r3, r2
|
|
80023d4: 60fb str r3, [r7, #12]
|
|
|
|
/* Write to MACWTR */
|
|
MODIFY_REG(heth->Instance->MACWTR, ETH_MACWTR_MASK, macregval);
|
|
80023d6: 687b ldr r3, [r7, #4]
|
|
80023d8: 681b ldr r3, [r3, #0]
|
|
80023da: 68da ldr r2, [r3, #12]
|
|
80023dc: 4b3a ldr r3, [pc, #232] ; (80024c8 <ETH_SetMACConfig+0x234>)
|
|
80023de: 4013 ands r3, r2
|
|
80023e0: 687a ldr r2, [r7, #4]
|
|
80023e2: 6812 ldr r2, [r2, #0]
|
|
80023e4: 68f9 ldr r1, [r7, #12]
|
|
80023e6: 430b orrs r3, r1
|
|
80023e8: 60d3 str r3, [r2, #12]
|
|
|
|
/*------------------------ MACTFCR Configuration --------------------*/
|
|
macregval = (((uint32_t)macconf->TransmitFlowControl << 1) |
|
|
80023ea: 683b ldr r3, [r7, #0]
|
|
80023ec: f893 3054 ldrb.w r3, [r3, #84] ; 0x54
|
|
80023f0: 005a lsls r2, r3, #1
|
|
macconf->PauseLowThreshold |
|
|
80023f2: 683b ldr r3, [r7, #0]
|
|
80023f4: 6d1b ldr r3, [r3, #80] ; 0x50
|
|
macregval = (((uint32_t)macconf->TransmitFlowControl << 1) |
|
|
80023f6: 4313 orrs r3, r2
|
|
((uint32_t)((macconf->ZeroQuantaPause == DISABLE) ? 1U : 0U) << 7) |
|
|
80023f8: 683a ldr r2, [r7, #0]
|
|
80023fa: f892 204c ldrb.w r2, [r2, #76] ; 0x4c
|
|
80023fe: 2a00 cmp r2, #0
|
|
8002400: d101 bne.n 8002406 <ETH_SetMACConfig+0x172>
|
|
8002402: 2280 movs r2, #128 ; 0x80
|
|
8002404: e000 b.n 8002408 <ETH_SetMACConfig+0x174>
|
|
8002406: 2200 movs r2, #0
|
|
macconf->PauseLowThreshold |
|
|
8002408: 431a orrs r2, r3
|
|
(macconf->PauseTime << 16));
|
|
800240a: 683b ldr r3, [r7, #0]
|
|
800240c: 6c9b ldr r3, [r3, #72] ; 0x48
|
|
800240e: 041b lsls r3, r3, #16
|
|
macregval = (((uint32_t)macconf->TransmitFlowControl << 1) |
|
|
8002410: 4313 orrs r3, r2
|
|
8002412: 60fb str r3, [r7, #12]
|
|
|
|
/* Write to MACTFCR */
|
|
MODIFY_REG(heth->Instance->MACTFCR, ETH_MACTFCR_MASK, macregval);
|
|
8002414: 687b ldr r3, [r7, #4]
|
|
8002416: 681b ldr r3, [r3, #0]
|
|
8002418: 6f1a ldr r2, [r3, #112] ; 0x70
|
|
800241a: f64f 730d movw r3, #65293 ; 0xff0d
|
|
800241e: 4013 ands r3, r2
|
|
8002420: 687a ldr r2, [r7, #4]
|
|
8002422: 6812 ldr r2, [r2, #0]
|
|
8002424: 68f9 ldr r1, [r7, #12]
|
|
8002426: 430b orrs r3, r1
|
|
8002428: 6713 str r3, [r2, #112] ; 0x70
|
|
|
|
/*------------------------ MACRFCR Configuration --------------------*/
|
|
macregval = ((uint32_t)macconf->ReceiveFlowControl |
|
|
800242a: 683b ldr r3, [r7, #0]
|
|
800242c: f893 3056 ldrb.w r3, [r3, #86] ; 0x56
|
|
8002430: 461a mov r2, r3
|
|
((uint32_t)macconf->UnicastPausePacketDetect << 1));
|
|
8002432: 683b ldr r3, [r7, #0]
|
|
8002434: f893 3055 ldrb.w r3, [r3, #85] ; 0x55
|
|
8002438: 005b lsls r3, r3, #1
|
|
macregval = ((uint32_t)macconf->ReceiveFlowControl |
|
|
800243a: 4313 orrs r3, r2
|
|
800243c: 60fb str r3, [r7, #12]
|
|
|
|
/* Write to MACRFCR */
|
|
MODIFY_REG(heth->Instance->MACRFCR, ETH_MACRFCR_MASK, macregval);
|
|
800243e: 687b ldr r3, [r7, #4]
|
|
8002440: 681b ldr r3, [r3, #0]
|
|
8002442: f8d3 3090 ldr.w r3, [r3, #144] ; 0x90
|
|
8002446: f023 0103 bic.w r1, r3, #3
|
|
800244a: 687b ldr r3, [r7, #4]
|
|
800244c: 681b ldr r3, [r3, #0]
|
|
800244e: 68fa ldr r2, [r7, #12]
|
|
8002450: 430a orrs r2, r1
|
|
8002452: f8c3 2090 str.w r2, [r3, #144] ; 0x90
|
|
|
|
/*------------------------ MTLTQOMR Configuration --------------------*/
|
|
/* Write to MTLTQOMR */
|
|
MODIFY_REG(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_MASK, macconf->TransmitQueueMode);
|
|
8002456: 687b ldr r3, [r7, #4]
|
|
8002458: 681b ldr r3, [r3, #0]
|
|
800245a: f8d3 3d00 ldr.w r3, [r3, #3328] ; 0xd00
|
|
800245e: f023 0172 bic.w r1, r3, #114 ; 0x72
|
|
8002462: 683b ldr r3, [r7, #0]
|
|
8002464: 6d9a ldr r2, [r3, #88] ; 0x58
|
|
8002466: 687b ldr r3, [r7, #4]
|
|
8002468: 681b ldr r3, [r3, #0]
|
|
800246a: 430a orrs r2, r1
|
|
800246c: f8c3 2d00 str.w r2, [r3, #3328] ; 0xd00
|
|
|
|
/*------------------------ MTLRQOMR Configuration --------------------*/
|
|
macregval = (macconf->ReceiveQueueMode |
|
|
8002470: 683b ldr r3, [r7, #0]
|
|
8002472: 6ddb ldr r3, [r3, #92] ; 0x5c
|
|
((uint32_t)((macconf->DropTCPIPChecksumErrorPacket == DISABLE) ? 1U : 0U) << 6) |
|
|
8002474: 683a ldr r2, [r7, #0]
|
|
8002476: f892 2060 ldrb.w r2, [r2, #96] ; 0x60
|
|
800247a: 2a00 cmp r2, #0
|
|
800247c: d101 bne.n 8002482 <ETH_SetMACConfig+0x1ee>
|
|
800247e: 2240 movs r2, #64 ; 0x40
|
|
8002480: e000 b.n 8002484 <ETH_SetMACConfig+0x1f0>
|
|
8002482: 2200 movs r2, #0
|
|
macregval = (macconf->ReceiveQueueMode |
|
|
8002484: 431a orrs r2, r3
|
|
((uint32_t)macconf->ForwardRxErrorPacket << 4) |
|
|
8002486: 683b ldr r3, [r7, #0]
|
|
8002488: f893 3061 ldrb.w r3, [r3, #97] ; 0x61
|
|
800248c: 011b lsls r3, r3, #4
|
|
((uint32_t)((macconf->DropTCPIPChecksumErrorPacket == DISABLE) ? 1U : 0U) << 6) |
|
|
800248e: 431a orrs r2, r3
|
|
((uint32_t)macconf->ForwardRxUndersizedGoodPacket << 3));
|
|
8002490: 683b ldr r3, [r7, #0]
|
|
8002492: f893 3062 ldrb.w r3, [r3, #98] ; 0x62
|
|
8002496: 00db lsls r3, r3, #3
|
|
macregval = (macconf->ReceiveQueueMode |
|
|
8002498: 4313 orrs r3, r2
|
|
800249a: 60fb str r3, [r7, #12]
|
|
|
|
/* Write to MTLRQOMR */
|
|
MODIFY_REG(heth->Instance->MTLRQOMR, ETH_MTLRQOMR_MASK, macregval);
|
|
800249c: 687b ldr r3, [r7, #4]
|
|
800249e: 681b ldr r3, [r3, #0]
|
|
80024a0: f8d3 3d30 ldr.w r3, [r3, #3376] ; 0xd30
|
|
80024a4: f023 017b bic.w r1, r3, #123 ; 0x7b
|
|
80024a8: 687b ldr r3, [r7, #4]
|
|
80024aa: 681b ldr r3, [r3, #0]
|
|
80024ac: 68fa ldr r2, [r7, #12]
|
|
80024ae: 430a orrs r2, r1
|
|
80024b0: f8c3 2d30 str.w r2, [r3, #3376] ; 0xd30
|
|
}
|
|
80024b4: bf00 nop
|
|
80024b6: 3714 adds r7, #20
|
|
80024b8: 46bd mov sp, r7
|
|
80024ba: f85d 7b04 ldr.w r7, [sp], #4
|
|
80024be: 4770 bx lr
|
|
80024c0: 00048083 .word 0x00048083
|
|
80024c4: c0f88000 .word 0xc0f88000
|
|
80024c8: fffffef0 .word 0xfffffef0
|
|
|
|
080024cc <ETH_SetDMAConfig>:
|
|
|
|
static void ETH_SetDMAConfig(ETH_HandleTypeDef *heth, ETH_DMAConfigTypeDef *dmaconf)
|
|
{
|
|
80024cc: b480 push {r7}
|
|
80024ce: b085 sub sp, #20
|
|
80024d0: af00 add r7, sp, #0
|
|
80024d2: 6078 str r0, [r7, #4]
|
|
80024d4: 6039 str r1, [r7, #0]
|
|
uint32_t dmaregval;
|
|
|
|
/*------------------------ DMAMR Configuration --------------------*/
|
|
MODIFY_REG(heth->Instance->DMAMR, ETH_DMAMR_MASK, dmaconf->DMAArbitration);
|
|
80024d6: 687b ldr r3, [r7, #4]
|
|
80024d8: 681b ldr r3, [r3, #0]
|
|
80024da: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
80024de: 681a ldr r2, [r3, #0]
|
|
80024e0: 4b38 ldr r3, [pc, #224] ; (80025c4 <ETH_SetDMAConfig+0xf8>)
|
|
80024e2: 4013 ands r3, r2
|
|
80024e4: 683a ldr r2, [r7, #0]
|
|
80024e6: 6811 ldr r1, [r2, #0]
|
|
80024e8: 687a ldr r2, [r7, #4]
|
|
80024ea: 6812 ldr r2, [r2, #0]
|
|
80024ec: 430b orrs r3, r1
|
|
80024ee: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
80024f2: 6013 str r3, [r2, #0]
|
|
|
|
/*------------------------ DMASBMR Configuration --------------------*/
|
|
dmaregval = (((uint32_t)dmaconf->AddressAlignedBeats << 12) |
|
|
80024f4: 683b ldr r3, [r7, #0]
|
|
80024f6: 791b ldrb r3, [r3, #4]
|
|
80024f8: 031a lsls r2, r3, #12
|
|
dmaconf->BurstMode |
|
|
80024fa: 683b ldr r3, [r7, #0]
|
|
80024fc: 689b ldr r3, [r3, #8]
|
|
dmaregval = (((uint32_t)dmaconf->AddressAlignedBeats << 12) |
|
|
80024fe: 431a orrs r2, r3
|
|
((uint32_t)dmaconf->RebuildINCRxBurst << 15));
|
|
8002500: 683b ldr r3, [r7, #0]
|
|
8002502: 7b1b ldrb r3, [r3, #12]
|
|
8002504: 03db lsls r3, r3, #15
|
|
dmaregval = (((uint32_t)dmaconf->AddressAlignedBeats << 12) |
|
|
8002506: 4313 orrs r3, r2
|
|
8002508: 60fb str r3, [r7, #12]
|
|
|
|
MODIFY_REG(heth->Instance->DMASBMR, ETH_DMASBMR_MASK, dmaregval);
|
|
800250a: 687b ldr r3, [r7, #4]
|
|
800250c: 681b ldr r3, [r3, #0]
|
|
800250e: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8002512: 685a ldr r2, [r3, #4]
|
|
8002514: 4b2c ldr r3, [pc, #176] ; (80025c8 <ETH_SetDMAConfig+0xfc>)
|
|
8002516: 4013 ands r3, r2
|
|
8002518: 687a ldr r2, [r7, #4]
|
|
800251a: 6812 ldr r2, [r2, #0]
|
|
800251c: 68f9 ldr r1, [r7, #12]
|
|
800251e: 430b orrs r3, r1
|
|
8002520: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
8002524: 6053 str r3, [r2, #4]
|
|
|
|
/*------------------------ DMACCR Configuration --------------------*/
|
|
dmaregval = (((uint32_t)dmaconf->PBLx8Mode << 16) |
|
|
8002526: 683b ldr r3, [r7, #0]
|
|
8002528: 7b5b ldrb r3, [r3, #13]
|
|
800252a: 041a lsls r2, r3, #16
|
|
dmaconf->MaximumSegmentSize);
|
|
800252c: 683b ldr r3, [r7, #0]
|
|
800252e: 6a1b ldr r3, [r3, #32]
|
|
dmaregval = (((uint32_t)dmaconf->PBLx8Mode << 16) |
|
|
8002530: 4313 orrs r3, r2
|
|
8002532: 60fb str r3, [r7, #12]
|
|
|
|
MODIFY_REG(heth->Instance->DMACCR, ETH_DMACCR_MASK, dmaregval);
|
|
8002534: 687b ldr r3, [r7, #4]
|
|
8002536: 681b ldr r3, [r3, #0]
|
|
8002538: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
800253c: f8d3 2100 ldr.w r2, [r3, #256] ; 0x100
|
|
8002540: 4b22 ldr r3, [pc, #136] ; (80025cc <ETH_SetDMAConfig+0x100>)
|
|
8002542: 4013 ands r3, r2
|
|
8002544: 687a ldr r2, [r7, #4]
|
|
8002546: 6812 ldr r2, [r2, #0]
|
|
8002548: 68f9 ldr r1, [r7, #12]
|
|
800254a: 430b orrs r3, r1
|
|
800254c: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
8002550: f8c2 3100 str.w r3, [r2, #256] ; 0x100
|
|
|
|
/*------------------------ DMACTCR Configuration --------------------*/
|
|
dmaregval = (dmaconf->TxDMABurstLength |
|
|
8002554: 683b ldr r3, [r7, #0]
|
|
8002556: 691a ldr r2, [r3, #16]
|
|
((uint32_t)dmaconf->SecondPacketOperate << 4) |
|
|
8002558: 683b ldr r3, [r7, #0]
|
|
800255a: 7d1b ldrb r3, [r3, #20]
|
|
800255c: 011b lsls r3, r3, #4
|
|
dmaregval = (dmaconf->TxDMABurstLength |
|
|
800255e: 431a orrs r2, r3
|
|
((uint32_t)dmaconf->TCPSegmentation << 12));
|
|
8002560: 683b ldr r3, [r7, #0]
|
|
8002562: 7f5b ldrb r3, [r3, #29]
|
|
8002564: 031b lsls r3, r3, #12
|
|
dmaregval = (dmaconf->TxDMABurstLength |
|
|
8002566: 4313 orrs r3, r2
|
|
8002568: 60fb str r3, [r7, #12]
|
|
|
|
MODIFY_REG(heth->Instance->DMACTCR, ETH_DMACTCR_MASK, dmaregval);
|
|
800256a: 687b ldr r3, [r7, #4]
|
|
800256c: 681b ldr r3, [r3, #0]
|
|
800256e: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8002572: f8d3 2104 ldr.w r2, [r3, #260] ; 0x104
|
|
8002576: 4b16 ldr r3, [pc, #88] ; (80025d0 <ETH_SetDMAConfig+0x104>)
|
|
8002578: 4013 ands r3, r2
|
|
800257a: 687a ldr r2, [r7, #4]
|
|
800257c: 6812 ldr r2, [r2, #0]
|
|
800257e: 68f9 ldr r1, [r7, #12]
|
|
8002580: 430b orrs r3, r1
|
|
8002582: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
8002586: f8c2 3104 str.w r3, [r2, #260] ; 0x104
|
|
|
|
/*------------------------ DMACRCR Configuration --------------------*/
|
|
dmaregval = (((uint32_t)dmaconf->FlushRxPacket << 31) |
|
|
800258a: 683b ldr r3, [r7, #0]
|
|
800258c: 7f1b ldrb r3, [r3, #28]
|
|
800258e: 07da lsls r2, r3, #31
|
|
dmaconf->RxDMABurstLength);
|
|
8002590: 683b ldr r3, [r7, #0]
|
|
8002592: 699b ldr r3, [r3, #24]
|
|
dmaregval = (((uint32_t)dmaconf->FlushRxPacket << 31) |
|
|
8002594: 4313 orrs r3, r2
|
|
8002596: 60fb str r3, [r7, #12]
|
|
|
|
/* Write to DMACRCR */
|
|
MODIFY_REG(heth->Instance->DMACRCR, ETH_DMACRCR_MASK, dmaregval);
|
|
8002598: 687b ldr r3, [r7, #4]
|
|
800259a: 681b ldr r3, [r3, #0]
|
|
800259c: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
80025a0: f8d3 2108 ldr.w r2, [r3, #264] ; 0x108
|
|
80025a4: 4b0b ldr r3, [pc, #44] ; (80025d4 <ETH_SetDMAConfig+0x108>)
|
|
80025a6: 4013 ands r3, r2
|
|
80025a8: 687a ldr r2, [r7, #4]
|
|
80025aa: 6812 ldr r2, [r2, #0]
|
|
80025ac: 68f9 ldr r1, [r7, #12]
|
|
80025ae: 430b orrs r3, r1
|
|
80025b0: f502 5280 add.w r2, r2, #4096 ; 0x1000
|
|
80025b4: f8c2 3108 str.w r3, [r2, #264] ; 0x108
|
|
}
|
|
80025b8: bf00 nop
|
|
80025ba: 3714 adds r7, #20
|
|
80025bc: 46bd mov sp, r7
|
|
80025be: f85d 7b04 ldr.w r7, [sp], #4
|
|
80025c2: 4770 bx lr
|
|
80025c4: ffff87fd .word 0xffff87fd
|
|
80025c8: ffff2ffe .word 0xffff2ffe
|
|
80025cc: fffec000 .word 0xfffec000
|
|
80025d0: ffc0efef .word 0xffc0efef
|
|
80025d4: 7fc0ffff .word 0x7fc0ffff
|
|
|
|
080025d8 <ETH_MACDMAConfig>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval HAL status
|
|
*/
|
|
static void ETH_MACDMAConfig(ETH_HandleTypeDef *heth)
|
|
{
|
|
80025d8: b580 push {r7, lr}
|
|
80025da: b0a4 sub sp, #144 ; 0x90
|
|
80025dc: af00 add r7, sp, #0
|
|
80025de: 6078 str r0, [r7, #4]
|
|
ETH_MACConfigTypeDef macDefaultConf;
|
|
ETH_DMAConfigTypeDef dmaDefaultConf;
|
|
|
|
/*--------------- ETHERNET MAC registers default Configuration --------------*/
|
|
macDefaultConf.AutomaticPadCRCStrip = ENABLE;
|
|
80025e0: 2301 movs r3, #1
|
|
80025e2: f887 303b strb.w r3, [r7, #59] ; 0x3b
|
|
macDefaultConf.BackOffLimit = ETH_BACKOFFLIMIT_10;
|
|
80025e6: 2300 movs r3, #0
|
|
80025e8: 653b str r3, [r7, #80] ; 0x50
|
|
macDefaultConf.CarrierSenseBeforeTransmit = DISABLE;
|
|
80025ea: 2300 movs r3, #0
|
|
80025ec: f887 3049 strb.w r3, [r7, #73] ; 0x49
|
|
macDefaultConf.CarrierSenseDuringTransmit = DISABLE;
|
|
80025f0: 2300 movs r3, #0
|
|
80025f2: f887 304b strb.w r3, [r7, #75] ; 0x4b
|
|
macDefaultConf.ChecksumOffload = ENABLE;
|
|
80025f6: 2301 movs r3, #1
|
|
80025f8: f887 3030 strb.w r3, [r7, #48] ; 0x30
|
|
macDefaultConf.CRCCheckingRxPackets = ENABLE;
|
|
80025fc: 2301 movs r3, #1
|
|
80025fe: f887 305e strb.w r3, [r7, #94] ; 0x5e
|
|
macDefaultConf.CRCStripTypePacket = ENABLE;
|
|
8002602: 2301 movs r3, #1
|
|
8002604: f887 303a strb.w r3, [r7, #58] ; 0x3a
|
|
macDefaultConf.DeferralCheck = DISABLE;
|
|
8002608: 2300 movs r3, #0
|
|
800260a: f887 3054 strb.w r3, [r7, #84] ; 0x54
|
|
macDefaultConf.DropTCPIPChecksumErrorPacket = ENABLE;
|
|
800260e: 2301 movs r3, #1
|
|
8002610: f887 308c strb.w r3, [r7, #140] ; 0x8c
|
|
macDefaultConf.DuplexMode = ETH_FULLDUPLEX_MODE;
|
|
8002614: f44f 5300 mov.w r3, #8192 ; 0x2000
|
|
8002618: 647b str r3, [r7, #68] ; 0x44
|
|
macDefaultConf.ExtendedInterPacketGap = DISABLE;
|
|
800261a: 2300 movs r3, #0
|
|
800261c: f887 3064 strb.w r3, [r7, #100] ; 0x64
|
|
macDefaultConf.ExtendedInterPacketGapVal = 0x0;
|
|
8002620: 2300 movs r3, #0
|
|
8002622: 66bb str r3, [r7, #104] ; 0x68
|
|
macDefaultConf.ForwardRxErrorPacket = DISABLE;
|
|
8002624: 2300 movs r3, #0
|
|
8002626: f887 308d strb.w r3, [r7, #141] ; 0x8d
|
|
macDefaultConf.ForwardRxUndersizedGoodPacket = DISABLE;
|
|
800262a: 2300 movs r3, #0
|
|
800262c: f887 308e strb.w r3, [r7, #142] ; 0x8e
|
|
macDefaultConf.GiantPacketSizeLimit = 0x618;
|
|
8002630: f44f 63c3 mov.w r3, #1560 ; 0x618
|
|
8002634: 663b str r3, [r7, #96] ; 0x60
|
|
macDefaultConf.GiantPacketSizeLimitControl = DISABLE;
|
|
8002636: 2300 movs r3, #0
|
|
8002638: f887 3038 strb.w r3, [r7, #56] ; 0x38
|
|
macDefaultConf.InterPacketGapVal = ETH_INTERPACKETGAP_96BIT;
|
|
800263c: 2300 movs r3, #0
|
|
800263e: 637b str r3, [r7, #52] ; 0x34
|
|
macDefaultConf.Jabber = ENABLE;
|
|
8002640: 2301 movs r3, #1
|
|
8002642: f887 303d strb.w r3, [r7, #61] ; 0x3d
|
|
macDefaultConf.JumboPacket = DISABLE;
|
|
8002646: 2300 movs r3, #0
|
|
8002648: f887 303e strb.w r3, [r7, #62] ; 0x3e
|
|
macDefaultConf.LoopbackMode = DISABLE;
|
|
800264c: 2300 movs r3, #0
|
|
800264e: f887 3048 strb.w r3, [r7, #72] ; 0x48
|
|
macDefaultConf.PauseLowThreshold = ETH_PAUSELOWTHRESHOLD_MINUS_4;
|
|
8002652: 2300 movs r3, #0
|
|
8002654: 67fb str r3, [r7, #124] ; 0x7c
|
|
macDefaultConf.PauseTime = 0x0;
|
|
8002656: 2300 movs r3, #0
|
|
8002658: 677b str r3, [r7, #116] ; 0x74
|
|
macDefaultConf.PreambleLength = ETH_PREAMBLELENGTH_7;
|
|
800265a: 2300 movs r3, #0
|
|
800265c: 65bb str r3, [r7, #88] ; 0x58
|
|
macDefaultConf.ProgrammableWatchdog = DISABLE;
|
|
800265e: 2300 movs r3, #0
|
|
8002660: f887 306c strb.w r3, [r7, #108] ; 0x6c
|
|
macDefaultConf.ReceiveFlowControl = DISABLE;
|
|
8002664: 2300 movs r3, #0
|
|
8002666: f887 3082 strb.w r3, [r7, #130] ; 0x82
|
|
macDefaultConf.ReceiveOwn = ENABLE;
|
|
800266a: 2301 movs r3, #1
|
|
800266c: f887 304a strb.w r3, [r7, #74] ; 0x4a
|
|
macDefaultConf.ReceiveQueueMode = ETH_RECEIVESTOREFORWARD;
|
|
8002670: 2320 movs r3, #32
|
|
8002672: f8c7 3088 str.w r3, [r7, #136] ; 0x88
|
|
macDefaultConf.RetryTransmission = ENABLE;
|
|
8002676: 2301 movs r3, #1
|
|
8002678: f887 304c strb.w r3, [r7, #76] ; 0x4c
|
|
macDefaultConf.SlowProtocolDetect = DISABLE;
|
|
800267c: 2300 movs r3, #0
|
|
800267e: f887 305d strb.w r3, [r7, #93] ; 0x5d
|
|
macDefaultConf.SourceAddrControl = ETH_SOURCEADDRESS_REPLACE_ADDR0;
|
|
8002682: f04f 5340 mov.w r3, #805306368 ; 0x30000000
|
|
8002686: 62fb str r3, [r7, #44] ; 0x2c
|
|
macDefaultConf.Speed = ETH_SPEED_100M;
|
|
8002688: f44f 4380 mov.w r3, #16384 ; 0x4000
|
|
800268c: 643b str r3, [r7, #64] ; 0x40
|
|
macDefaultConf.Support2KPacket = DISABLE;
|
|
800268e: 2300 movs r3, #0
|
|
8002690: f887 3039 strb.w r3, [r7, #57] ; 0x39
|
|
macDefaultConf.TransmitQueueMode = ETH_TRANSMITSTOREFORWARD;
|
|
8002694: 2302 movs r3, #2
|
|
8002696: f8c7 3084 str.w r3, [r7, #132] ; 0x84
|
|
macDefaultConf.TransmitFlowControl = DISABLE;
|
|
800269a: 2300 movs r3, #0
|
|
800269c: f887 3080 strb.w r3, [r7, #128] ; 0x80
|
|
macDefaultConf.UnicastPausePacketDetect = DISABLE;
|
|
80026a0: 2300 movs r3, #0
|
|
80026a2: f887 3081 strb.w r3, [r7, #129] ; 0x81
|
|
macDefaultConf.UnicastSlowProtocolPacketDetect = DISABLE;
|
|
80026a6: 2300 movs r3, #0
|
|
80026a8: f887 305c strb.w r3, [r7, #92] ; 0x5c
|
|
macDefaultConf.Watchdog = ENABLE;
|
|
80026ac: 2301 movs r3, #1
|
|
80026ae: f887 303c strb.w r3, [r7, #60] ; 0x3c
|
|
macDefaultConf.WatchdogTimeout = ETH_MACWTR_WTO_2KB;
|
|
80026b2: 2300 movs r3, #0
|
|
80026b4: 673b str r3, [r7, #112] ; 0x70
|
|
macDefaultConf.ZeroQuantaPause = ENABLE;
|
|
80026b6: 2301 movs r3, #1
|
|
80026b8: f887 3078 strb.w r3, [r7, #120] ; 0x78
|
|
|
|
/* MAC default configuration */
|
|
ETH_SetMACConfig(heth, &macDefaultConf);
|
|
80026bc: f107 032c add.w r3, r7, #44 ; 0x2c
|
|
80026c0: 4619 mov r1, r3
|
|
80026c2: 6878 ldr r0, [r7, #4]
|
|
80026c4: f7ff fde6 bl 8002294 <ETH_SetMACConfig>
|
|
|
|
/*--------------- ETHERNET DMA registers default Configuration --------------*/
|
|
dmaDefaultConf.AddressAlignedBeats = ENABLE;
|
|
80026c8: 2301 movs r3, #1
|
|
80026ca: 733b strb r3, [r7, #12]
|
|
dmaDefaultConf.BurstMode = ETH_BURSTLENGTH_FIXED;
|
|
80026cc: 2301 movs r3, #1
|
|
80026ce: 613b str r3, [r7, #16]
|
|
dmaDefaultConf.DMAArbitration = ETH_DMAARBITRATION_RX1_TX1;
|
|
80026d0: 2300 movs r3, #0
|
|
80026d2: 60bb str r3, [r7, #8]
|
|
dmaDefaultConf.FlushRxPacket = DISABLE;
|
|
80026d4: 2300 movs r3, #0
|
|
80026d6: f887 3024 strb.w r3, [r7, #36] ; 0x24
|
|
dmaDefaultConf.PBLx8Mode = DISABLE;
|
|
80026da: 2300 movs r3, #0
|
|
80026dc: 757b strb r3, [r7, #21]
|
|
dmaDefaultConf.RebuildINCRxBurst = DISABLE;
|
|
80026de: 2300 movs r3, #0
|
|
80026e0: 753b strb r3, [r7, #20]
|
|
dmaDefaultConf.RxDMABurstLength = ETH_RXDMABURSTLENGTH_32BEAT;
|
|
80026e2: f44f 1300 mov.w r3, #2097152 ; 0x200000
|
|
80026e6: 623b str r3, [r7, #32]
|
|
dmaDefaultConf.SecondPacketOperate = DISABLE;
|
|
80026e8: 2300 movs r3, #0
|
|
80026ea: 773b strb r3, [r7, #28]
|
|
dmaDefaultConf.TxDMABurstLength = ETH_TXDMABURSTLENGTH_32BEAT;
|
|
80026ec: f44f 1300 mov.w r3, #2097152 ; 0x200000
|
|
80026f0: 61bb str r3, [r7, #24]
|
|
dmaDefaultConf.TCPSegmentation = DISABLE;
|
|
80026f2: 2300 movs r3, #0
|
|
80026f4: f887 3025 strb.w r3, [r7, #37] ; 0x25
|
|
dmaDefaultConf.MaximumSegmentSize = ETH_SEGMENT_SIZE_DEFAULT;
|
|
80026f8: f44f 7306 mov.w r3, #536 ; 0x218
|
|
80026fc: 62bb str r3, [r7, #40] ; 0x28
|
|
|
|
/* DMA default configuration */
|
|
ETH_SetDMAConfig(heth, &dmaDefaultConf);
|
|
80026fe: f107 0308 add.w r3, r7, #8
|
|
8002702: 4619 mov r1, r3
|
|
8002704: 6878 ldr r0, [r7, #4]
|
|
8002706: f7ff fee1 bl 80024cc <ETH_SetDMAConfig>
|
|
}
|
|
800270a: bf00 nop
|
|
800270c: 3790 adds r7, #144 ; 0x90
|
|
800270e: 46bd mov sp, r7
|
|
8002710: bd80 pop {r7, pc}
|
|
|
|
08002712 <ETH_DMATxDescListInit>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval None
|
|
*/
|
|
static void ETH_DMATxDescListInit(ETH_HandleTypeDef *heth)
|
|
{
|
|
8002712: b480 push {r7}
|
|
8002714: b085 sub sp, #20
|
|
8002716: af00 add r7, sp, #0
|
|
8002718: 6078 str r0, [r7, #4]
|
|
ETH_DMADescTypeDef *dmatxdesc;
|
|
uint32_t i;
|
|
|
|
/* Fill each DMATxDesc descriptor with the right values */
|
|
for (i = 0; i < (uint32_t)ETH_TX_DESC_CNT; i++)
|
|
800271a: 2300 movs r3, #0
|
|
800271c: 60fb str r3, [r7, #12]
|
|
800271e: e01d b.n 800275c <ETH_DMATxDescListInit+0x4a>
|
|
{
|
|
dmatxdesc = heth->Init.TxDesc + i;
|
|
8002720: 687b ldr r3, [r7, #4]
|
|
8002722: 68d9 ldr r1, [r3, #12]
|
|
8002724: 68fa ldr r2, [r7, #12]
|
|
8002726: 4613 mov r3, r2
|
|
8002728: 005b lsls r3, r3, #1
|
|
800272a: 4413 add r3, r2
|
|
800272c: 00db lsls r3, r3, #3
|
|
800272e: 440b add r3, r1
|
|
8002730: 60bb str r3, [r7, #8]
|
|
|
|
WRITE_REG(dmatxdesc->DESC0, 0x0);
|
|
8002732: 68bb ldr r3, [r7, #8]
|
|
8002734: 2200 movs r2, #0
|
|
8002736: 601a str r2, [r3, #0]
|
|
WRITE_REG(dmatxdesc->DESC1, 0x0);
|
|
8002738: 68bb ldr r3, [r7, #8]
|
|
800273a: 2200 movs r2, #0
|
|
800273c: 605a str r2, [r3, #4]
|
|
WRITE_REG(dmatxdesc->DESC2, 0x0);
|
|
800273e: 68bb ldr r3, [r7, #8]
|
|
8002740: 2200 movs r2, #0
|
|
8002742: 609a str r2, [r3, #8]
|
|
WRITE_REG(dmatxdesc->DESC3, 0x0);
|
|
8002744: 68bb ldr r3, [r7, #8]
|
|
8002746: 2200 movs r2, #0
|
|
8002748: 60da str r2, [r3, #12]
|
|
|
|
WRITE_REG(heth->TxDescList.TxDesc[i], (uint32_t)dmatxdesc);
|
|
800274a: 68b9 ldr r1, [r7, #8]
|
|
800274c: 687b ldr r3, [r7, #4]
|
|
800274e: 68fa ldr r2, [r7, #12]
|
|
8002750: 3206 adds r2, #6
|
|
8002752: f843 1022 str.w r1, [r3, r2, lsl #2]
|
|
for (i = 0; i < (uint32_t)ETH_TX_DESC_CNT; i++)
|
|
8002756: 68fb ldr r3, [r7, #12]
|
|
8002758: 3301 adds r3, #1
|
|
800275a: 60fb str r3, [r7, #12]
|
|
800275c: 68fb ldr r3, [r7, #12]
|
|
800275e: 2b03 cmp r3, #3
|
|
8002760: d9de bls.n 8002720 <ETH_DMATxDescListInit+0xe>
|
|
|
|
}
|
|
|
|
heth->TxDescList.CurTxDesc = 0;
|
|
8002762: 687b ldr r3, [r7, #4]
|
|
8002764: 2200 movs r2, #0
|
|
8002766: 629a str r2, [r3, #40] ; 0x28
|
|
|
|
/* Set Transmit Descriptor Ring Length */
|
|
WRITE_REG(heth->Instance->DMACTDRLR, (ETH_TX_DESC_CNT - 1U));
|
|
8002768: 687b ldr r3, [r7, #4]
|
|
800276a: 681b ldr r3, [r3, #0]
|
|
800276c: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8002770: 461a mov r2, r3
|
|
8002772: 2303 movs r3, #3
|
|
8002774: f8c2 312c str.w r3, [r2, #300] ; 0x12c
|
|
|
|
/* Set Transmit Descriptor List Address */
|
|
WRITE_REG(heth->Instance->DMACTDLAR, (uint32_t) heth->Init.TxDesc);
|
|
8002778: 687b ldr r3, [r7, #4]
|
|
800277a: 68da ldr r2, [r3, #12]
|
|
800277c: 687b ldr r3, [r7, #4]
|
|
800277e: 681b ldr r3, [r3, #0]
|
|
8002780: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8002784: f8c3 2114 str.w r2, [r3, #276] ; 0x114
|
|
|
|
/* Set Transmit Descriptor Tail pointer */
|
|
WRITE_REG(heth->Instance->DMACTDTPR, (uint32_t) heth->Init.TxDesc);
|
|
8002788: 687b ldr r3, [r7, #4]
|
|
800278a: 68da ldr r2, [r3, #12]
|
|
800278c: 687b ldr r3, [r7, #4]
|
|
800278e: 681b ldr r3, [r3, #0]
|
|
8002790: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8002794: f8c3 2120 str.w r2, [r3, #288] ; 0x120
|
|
}
|
|
8002798: bf00 nop
|
|
800279a: 3714 adds r7, #20
|
|
800279c: 46bd mov sp, r7
|
|
800279e: f85d 7b04 ldr.w r7, [sp], #4
|
|
80027a2: 4770 bx lr
|
|
|
|
080027a4 <ETH_DMARxDescListInit>:
|
|
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
|
|
* the configuration information for ETHERNET module
|
|
* @retval None
|
|
*/
|
|
static void ETH_DMARxDescListInit(ETH_HandleTypeDef *heth)
|
|
{
|
|
80027a4: b480 push {r7}
|
|
80027a6: b085 sub sp, #20
|
|
80027a8: af00 add r7, sp, #0
|
|
80027aa: 6078 str r0, [r7, #4]
|
|
ETH_DMADescTypeDef *dmarxdesc;
|
|
uint32_t i;
|
|
|
|
for (i = 0; i < (uint32_t)ETH_RX_DESC_CNT; i++)
|
|
80027ac: 2300 movs r3, #0
|
|
80027ae: 60fb str r3, [r7, #12]
|
|
80027b0: e023 b.n 80027fa <ETH_DMARxDescListInit+0x56>
|
|
{
|
|
dmarxdesc = heth->Init.RxDesc + i;
|
|
80027b2: 687b ldr r3, [r7, #4]
|
|
80027b4: 6919 ldr r1, [r3, #16]
|
|
80027b6: 68fa ldr r2, [r7, #12]
|
|
80027b8: 4613 mov r3, r2
|
|
80027ba: 005b lsls r3, r3, #1
|
|
80027bc: 4413 add r3, r2
|
|
80027be: 00db lsls r3, r3, #3
|
|
80027c0: 440b add r3, r1
|
|
80027c2: 60bb str r3, [r7, #8]
|
|
|
|
WRITE_REG(dmarxdesc->DESC0, 0x0);
|
|
80027c4: 68bb ldr r3, [r7, #8]
|
|
80027c6: 2200 movs r2, #0
|
|
80027c8: 601a str r2, [r3, #0]
|
|
WRITE_REG(dmarxdesc->DESC1, 0x0);
|
|
80027ca: 68bb ldr r3, [r7, #8]
|
|
80027cc: 2200 movs r2, #0
|
|
80027ce: 605a str r2, [r3, #4]
|
|
WRITE_REG(dmarxdesc->DESC2, 0x0);
|
|
80027d0: 68bb ldr r3, [r7, #8]
|
|
80027d2: 2200 movs r2, #0
|
|
80027d4: 609a str r2, [r3, #8]
|
|
WRITE_REG(dmarxdesc->DESC3, 0x0);
|
|
80027d6: 68bb ldr r3, [r7, #8]
|
|
80027d8: 2200 movs r2, #0
|
|
80027da: 60da str r2, [r3, #12]
|
|
WRITE_REG(dmarxdesc->BackupAddr0, 0x0);
|
|
80027dc: 68bb ldr r3, [r7, #8]
|
|
80027de: 2200 movs r2, #0
|
|
80027e0: 611a str r2, [r3, #16]
|
|
WRITE_REG(dmarxdesc->BackupAddr1, 0x0);
|
|
80027e2: 68bb ldr r3, [r7, #8]
|
|
80027e4: 2200 movs r2, #0
|
|
80027e6: 615a str r2, [r3, #20]
|
|
|
|
|
|
/* Set Rx descritors addresses */
|
|
WRITE_REG(heth->RxDescList.RxDesc[i], (uint32_t)dmarxdesc);
|
|
80027e8: 68b9 ldr r1, [r7, #8]
|
|
80027ea: 687b ldr r3, [r7, #4]
|
|
80027ec: 68fa ldr r2, [r7, #12]
|
|
80027ee: 3212 adds r2, #18
|
|
80027f0: f843 1022 str.w r1, [r3, r2, lsl #2]
|
|
for (i = 0; i < (uint32_t)ETH_RX_DESC_CNT; i++)
|
|
80027f4: 68fb ldr r3, [r7, #12]
|
|
80027f6: 3301 adds r3, #1
|
|
80027f8: 60fb str r3, [r7, #12]
|
|
80027fa: 68fb ldr r3, [r7, #12]
|
|
80027fc: 2b03 cmp r3, #3
|
|
80027fe: d9d8 bls.n 80027b2 <ETH_DMARxDescListInit+0xe>
|
|
|
|
}
|
|
|
|
WRITE_REG(heth->RxDescList.RxDescIdx, 0);
|
|
8002800: 687b ldr r3, [r7, #4]
|
|
8002802: 2200 movs r2, #0
|
|
8002804: 65da str r2, [r3, #92] ; 0x5c
|
|
WRITE_REG(heth->RxDescList.RxDescCnt, 0);
|
|
8002806: 687b ldr r3, [r7, #4]
|
|
8002808: 2200 movs r2, #0
|
|
800280a: 661a str r2, [r3, #96] ; 0x60
|
|
WRITE_REG(heth->RxDescList.RxBuildDescIdx, 0);
|
|
800280c: 687b ldr r3, [r7, #4]
|
|
800280e: 2200 movs r2, #0
|
|
8002810: 669a str r2, [r3, #104] ; 0x68
|
|
WRITE_REG(heth->RxDescList.RxBuildDescCnt, 0);
|
|
8002812: 687b ldr r3, [r7, #4]
|
|
8002814: 2200 movs r2, #0
|
|
8002816: 66da str r2, [r3, #108] ; 0x6c
|
|
WRITE_REG(heth->RxDescList.ItMode, 0);
|
|
8002818: 687b ldr r3, [r7, #4]
|
|
800281a: 2200 movs r2, #0
|
|
800281c: 659a str r2, [r3, #88] ; 0x58
|
|
|
|
/* Set Receive Descriptor Ring Length */
|
|
WRITE_REG(heth->Instance->DMACRDRLR, ((uint32_t)(ETH_RX_DESC_CNT - 1U)));
|
|
800281e: 687b ldr r3, [r7, #4]
|
|
8002820: 681b ldr r3, [r3, #0]
|
|
8002822: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
8002826: 461a mov r2, r3
|
|
8002828: 2303 movs r3, #3
|
|
800282a: f8c2 3130 str.w r3, [r2, #304] ; 0x130
|
|
|
|
/* Set Receive Descriptor List Address */
|
|
WRITE_REG(heth->Instance->DMACRDLAR, (uint32_t) heth->Init.RxDesc);
|
|
800282e: 687b ldr r3, [r7, #4]
|
|
8002830: 691a ldr r2, [r3, #16]
|
|
8002832: 687b ldr r3, [r7, #4]
|
|
8002834: 681b ldr r3, [r3, #0]
|
|
8002836: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
800283a: f8c3 211c str.w r2, [r3, #284] ; 0x11c
|
|
|
|
/* Set Receive Descriptor Tail pointer Address */
|
|
WRITE_REG(heth->Instance->DMACRDTPR, ((uint32_t)(heth->Init.RxDesc + (uint32_t)(ETH_RX_DESC_CNT - 1U))));
|
|
800283e: 687b ldr r3, [r7, #4]
|
|
8002840: 691b ldr r3, [r3, #16]
|
|
8002842: f103 0248 add.w r2, r3, #72 ; 0x48
|
|
8002846: 687b ldr r3, [r7, #4]
|
|
8002848: 681b ldr r3, [r3, #0]
|
|
800284a: f503 5380 add.w r3, r3, #4096 ; 0x1000
|
|
800284e: f8c3 2128 str.w r2, [r3, #296] ; 0x128
|
|
}
|
|
8002852: bf00 nop
|
|
8002854: 3714 adds r7, #20
|
|
8002856: 46bd mov sp, r7
|
|
8002858: f85d 7b04 ldr.w r7, [sp], #4
|
|
800285c: 4770 bx lr
|
|
...
|
|
|
|
08002860 <ETH_Prepare_Tx_Descriptors>:
|
|
* @param pTxConfig: Tx packet configuration
|
|
* @param ItMode: Enable or disable Tx EOT interrept
|
|
* @retval Status
|
|
*/
|
|
static uint32_t ETH_Prepare_Tx_Descriptors(ETH_HandleTypeDef *heth, ETH_TxPacketConfig *pTxConfig, uint32_t ItMode)
|
|
{
|
|
8002860: b480 push {r7}
|
|
8002862: b08d sub sp, #52 ; 0x34
|
|
8002864: af00 add r7, sp, #0
|
|
8002866: 60f8 str r0, [r7, #12]
|
|
8002868: 60b9 str r1, [r7, #8]
|
|
800286a: 607a str r2, [r7, #4]
|
|
ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
|
|
800286c: 68fb ldr r3, [r7, #12]
|
|
800286e: 3318 adds r3, #24
|
|
8002870: 617b str r3, [r7, #20]
|
|
uint32_t descidx = dmatxdesclist->CurTxDesc;
|
|
8002872: 697b ldr r3, [r7, #20]
|
|
8002874: 691b ldr r3, [r3, #16]
|
|
8002876: 62fb str r3, [r7, #44] ; 0x2c
|
|
uint32_t firstdescidx = dmatxdesclist->CurTxDesc;
|
|
8002878: 697b ldr r3, [r7, #20]
|
|
800287a: 691b ldr r3, [r3, #16]
|
|
800287c: 613b str r3, [r7, #16]
|
|
uint32_t idx;
|
|
uint32_t descnbr = 0;
|
|
800287e: 2300 movs r3, #0
|
|
8002880: 627b str r3, [r7, #36] ; 0x24
|
|
ETH_DMADescTypeDef *dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
|
|
8002882: 697b ldr r3, [r7, #20]
|
|
8002884: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8002886: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
800288a: 623b str r3, [r7, #32]
|
|
|
|
ETH_BufferTypeDef *txbuffer = pTxConfig->TxBuffer;
|
|
800288c: 68bb ldr r3, [r7, #8]
|
|
800288e: 689b ldr r3, [r3, #8]
|
|
8002890: 61fb str r3, [r7, #28]
|
|
uint32_t bd_count = 0;
|
|
8002892: 2300 movs r3, #0
|
|
8002894: 61bb str r3, [r7, #24]
|
|
|
|
/* Current Tx Descriptor Owned by DMA: cannot be used by the application */
|
|
if ((READ_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCWBF_OWN) == ETH_DMATXNDESCWBF_OWN)
|
|
8002896: 6a3b ldr r3, [r7, #32]
|
|
8002898: 68db ldr r3, [r3, #12]
|
|
800289a: f003 4300 and.w r3, r3, #2147483648 ; 0x80000000
|
|
800289e: f1b3 4f00 cmp.w r3, #2147483648 ; 0x80000000
|
|
80028a2: d007 beq.n 80028b4 <ETH_Prepare_Tx_Descriptors+0x54>
|
|
|| (dmatxdesclist->PacketAddress[descidx] != NULL))
|
|
80028a4: 697a ldr r2, [r7, #20]
|
|
80028a6: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80028a8: 3304 adds r3, #4
|
|
80028aa: 009b lsls r3, r3, #2
|
|
80028ac: 4413 add r3, r2
|
|
80028ae: 685b ldr r3, [r3, #4]
|
|
80028b0: 2b00 cmp r3, #0
|
|
80028b2: d001 beq.n 80028b8 <ETH_Prepare_Tx_Descriptors+0x58>
|
|
{
|
|
return HAL_ETH_ERROR_BUSY;
|
|
80028b4: 2302 movs r3, #2
|
|
80028b6: e259 b.n 8002d6c <ETH_Prepare_Tx_Descriptors+0x50c>
|
|
|
|
/***************************************************************************/
|
|
/***************** Context descriptor configuration (Optional) **********/
|
|
/***************************************************************************/
|
|
/* If VLAN tag is enabled for this packet */
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET)
|
|
80028b8: 68bb ldr r3, [r7, #8]
|
|
80028ba: 681b ldr r3, [r3, #0]
|
|
80028bc: f003 0304 and.w r3, r3, #4
|
|
80028c0: 2b00 cmp r3, #0
|
|
80028c2: d044 beq.n 800294e <ETH_Prepare_Tx_Descriptors+0xee>
|
|
{
|
|
/* Set vlan tag value */
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXCDESC_VT, pTxConfig->VlanTag);
|
|
80028c4: 6a3b ldr r3, [r7, #32]
|
|
80028c6: 68da ldr r2, [r3, #12]
|
|
80028c8: 4b75 ldr r3, [pc, #468] ; (8002aa0 <ETH_Prepare_Tx_Descriptors+0x240>)
|
|
80028ca: 4013 ands r3, r2
|
|
80028cc: 68ba ldr r2, [r7, #8]
|
|
80028ce: 6a52 ldr r2, [r2, #36] ; 0x24
|
|
80028d0: 431a orrs r2, r3
|
|
80028d2: 6a3b ldr r3, [r7, #32]
|
|
80028d4: 60da str r2, [r3, #12]
|
|
/* Set vlan tag valid bit */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_VLTV);
|
|
80028d6: 6a3b ldr r3, [r7, #32]
|
|
80028d8: 68db ldr r3, [r3, #12]
|
|
80028da: f443 3280 orr.w r2, r3, #65536 ; 0x10000
|
|
80028de: 6a3b ldr r3, [r7, #32]
|
|
80028e0: 60da str r2, [r3, #12]
|
|
/* Set the descriptor as the vlan input source */
|
|
SET_BIT(heth->Instance->MACVIR, ETH_MACVIR_VLTI);
|
|
80028e2: 68fb ldr r3, [r7, #12]
|
|
80028e4: 681b ldr r3, [r3, #0]
|
|
80028e6: 6e1a ldr r2, [r3, #96] ; 0x60
|
|
80028e8: 68fb ldr r3, [r7, #12]
|
|
80028ea: 681b ldr r3, [r3, #0]
|
|
80028ec: f442 1280 orr.w r2, r2, #1048576 ; 0x100000
|
|
80028f0: 661a str r2, [r3, #96] ; 0x60
|
|
|
|
/* if inner VLAN is enabled */
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_INNERVLANTAG) != (uint32_t)RESET)
|
|
80028f2: 68bb ldr r3, [r7, #8]
|
|
80028f4: 681b ldr r3, [r3, #0]
|
|
80028f6: f003 0308 and.w r3, r3, #8
|
|
80028fa: 2b00 cmp r3, #0
|
|
80028fc: d027 beq.n 800294e <ETH_Prepare_Tx_Descriptors+0xee>
|
|
{
|
|
/* Set inner vlan tag value */
|
|
MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXCDESC_IVT, (pTxConfig->InnerVlanTag << 16));
|
|
80028fe: 6a3b ldr r3, [r7, #32]
|
|
8002900: 689b ldr r3, [r3, #8]
|
|
8002902: b29a uxth r2, r3
|
|
8002904: 68bb ldr r3, [r7, #8]
|
|
8002906: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8002908: 041b lsls r3, r3, #16
|
|
800290a: 431a orrs r2, r3
|
|
800290c: 6a3b ldr r3, [r7, #32]
|
|
800290e: 609a str r2, [r3, #8]
|
|
/* Set inner vlan tag valid bit */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_IVLTV);
|
|
8002910: 6a3b ldr r3, [r7, #32]
|
|
8002912: 68db ldr r3, [r3, #12]
|
|
8002914: f443 3200 orr.w r2, r3, #131072 ; 0x20000
|
|
8002918: 6a3b ldr r3, [r7, #32]
|
|
800291a: 60da str r2, [r3, #12]
|
|
|
|
/* Set Vlan Tag control */
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXCDESC_IVTIR, pTxConfig->InnerVlanCtrl);
|
|
800291c: 6a3b ldr r3, [r7, #32]
|
|
800291e: 68db ldr r3, [r3, #12]
|
|
8002920: f423 2240 bic.w r2, r3, #786432 ; 0xc0000
|
|
8002924: 68bb ldr r3, [r7, #8]
|
|
8002926: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8002928: 431a orrs r2, r3
|
|
800292a: 6a3b ldr r3, [r7, #32]
|
|
800292c: 60da str r2, [r3, #12]
|
|
|
|
/* Set the descriptor as the inner vlan input source */
|
|
SET_BIT(heth->Instance->MACIVIR, ETH_MACIVIR_VLTI);
|
|
800292e: 68fb ldr r3, [r7, #12]
|
|
8002930: 681b ldr r3, [r3, #0]
|
|
8002932: 6e5a ldr r2, [r3, #100] ; 0x64
|
|
8002934: 68fb ldr r3, [r7, #12]
|
|
8002936: 681b ldr r3, [r3, #0]
|
|
8002938: f442 1280 orr.w r2, r2, #1048576 ; 0x100000
|
|
800293c: 665a str r2, [r3, #100] ; 0x64
|
|
/* Enable double VLAN processing */
|
|
SET_BIT(heth->Instance->MACVTR, ETH_MACVTR_EDVLP);
|
|
800293e: 68fb ldr r3, [r7, #12]
|
|
8002940: 681b ldr r3, [r3, #0]
|
|
8002942: 6d1a ldr r2, [r3, #80] ; 0x50
|
|
8002944: 68fb ldr r3, [r7, #12]
|
|
8002946: 681b ldr r3, [r3, #0]
|
|
8002948: f042 6280 orr.w r2, r2, #67108864 ; 0x4000000
|
|
800294c: 651a str r2, [r3, #80] ; 0x50
|
|
}
|
|
}
|
|
|
|
/* if tcp segmentation is enabled for this packet */
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET)
|
|
800294e: 68bb ldr r3, [r7, #8]
|
|
8002950: 681b ldr r3, [r3, #0]
|
|
8002952: f003 0310 and.w r3, r3, #16
|
|
8002956: 2b00 cmp r3, #0
|
|
8002958: d00e beq.n 8002978 <ETH_Prepare_Tx_Descriptors+0x118>
|
|
{
|
|
/* Set MSS value */
|
|
MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXCDESC_MSS, pTxConfig->MaxSegmentSize);
|
|
800295a: 6a3b ldr r3, [r7, #32]
|
|
800295c: 689a ldr r2, [r3, #8]
|
|
800295e: 4b51 ldr r3, [pc, #324] ; (8002aa4 <ETH_Prepare_Tx_Descriptors+0x244>)
|
|
8002960: 4013 ands r3, r2
|
|
8002962: 68ba ldr r2, [r7, #8]
|
|
8002964: 6992 ldr r2, [r2, #24]
|
|
8002966: 431a orrs r2, r3
|
|
8002968: 6a3b ldr r3, [r7, #32]
|
|
800296a: 609a str r2, [r3, #8]
|
|
/* Set MSS valid bit */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_TCMSSV);
|
|
800296c: 6a3b ldr r3, [r7, #32]
|
|
800296e: 68db ldr r3, [r3, #12]
|
|
8002970: f043 6280 orr.w r2, r3, #67108864 ; 0x4000000
|
|
8002974: 6a3b ldr r3, [r7, #32]
|
|
8002976: 60da str r2, [r3, #12]
|
|
}
|
|
|
|
if ((READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET)
|
|
8002978: 68bb ldr r3, [r7, #8]
|
|
800297a: 681b ldr r3, [r3, #0]
|
|
800297c: f003 0304 and.w r3, r3, #4
|
|
8002980: 2b00 cmp r3, #0
|
|
8002982: d105 bne.n 8002990 <ETH_Prepare_Tx_Descriptors+0x130>
|
|
|| (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET))
|
|
8002984: 68bb ldr r3, [r7, #8]
|
|
8002986: 681b ldr r3, [r3, #0]
|
|
8002988: f003 0310 and.w r3, r3, #16
|
|
800298c: 2b00 cmp r3, #0
|
|
800298e: d036 beq.n 80029fe <ETH_Prepare_Tx_Descriptors+0x19e>
|
|
{
|
|
/* Set as context descriptor */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_CTXT);
|
|
8002990: 6a3b ldr r3, [r7, #32]
|
|
8002992: 68db ldr r3, [r3, #12]
|
|
8002994: f043 4280 orr.w r2, r3, #1073741824 ; 0x40000000
|
|
8002998: 6a3b ldr r3, [r7, #32]
|
|
800299a: 60da str r2, [r3, #12]
|
|
__ASM volatile ("dmb 0xF":::"memory");
|
|
800299c: f3bf 8f5f dmb sy
|
|
}
|
|
80029a0: bf00 nop
|
|
/* Ensure rest of descriptor is written to RAM before the OWN bit */
|
|
__DMB();
|
|
/* Set own bit */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_OWN);
|
|
80029a2: 6a3b ldr r3, [r7, #32]
|
|
80029a4: 68db ldr r3, [r3, #12]
|
|
80029a6: f043 4200 orr.w r2, r3, #2147483648 ; 0x80000000
|
|
80029aa: 6a3b ldr r3, [r7, #32]
|
|
80029ac: 60da str r2, [r3, #12]
|
|
/* Increment current tx descriptor index */
|
|
INCR_TX_DESC_INDEX(descidx, 1U);
|
|
80029ae: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80029b0: 3301 adds r3, #1
|
|
80029b2: 62fb str r3, [r7, #44] ; 0x2c
|
|
80029b4: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80029b6: 2b03 cmp r3, #3
|
|
80029b8: d902 bls.n 80029c0 <ETH_Prepare_Tx_Descriptors+0x160>
|
|
80029ba: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80029bc: 3b04 subs r3, #4
|
|
80029be: 62fb str r3, [r7, #44] ; 0x2c
|
|
/* Get current descriptor address */
|
|
dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
|
|
80029c0: 697b ldr r3, [r7, #20]
|
|
80029c2: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
80029c4: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
80029c8: 623b str r3, [r7, #32]
|
|
|
|
descnbr += 1U;
|
|
80029ca: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80029cc: 3301 adds r3, #1
|
|
80029ce: 627b str r3, [r7, #36] ; 0x24
|
|
|
|
/* Current Tx Descriptor Owned by DMA: cannot be used by the application */
|
|
if (READ_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCWBF_OWN) == ETH_DMATXNDESCWBF_OWN)
|
|
80029d0: 6a3b ldr r3, [r7, #32]
|
|
80029d2: 68db ldr r3, [r3, #12]
|
|
80029d4: f003 4300 and.w r3, r3, #2147483648 ; 0x80000000
|
|
80029d8: f1b3 4f00 cmp.w r3, #2147483648 ; 0x80000000
|
|
80029dc: d10f bne.n 80029fe <ETH_Prepare_Tx_Descriptors+0x19e>
|
|
{
|
|
dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[firstdescidx];
|
|
80029de: 697b ldr r3, [r7, #20]
|
|
80029e0: 693a ldr r2, [r7, #16]
|
|
80029e2: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
80029e6: 623b str r3, [r7, #32]
|
|
__ASM volatile ("dmb 0xF":::"memory");
|
|
80029e8: f3bf 8f5f dmb sy
|
|
}
|
|
80029ec: bf00 nop
|
|
/* Ensure rest of descriptor is written to RAM before the OWN bit */
|
|
__DMB();
|
|
/* Clear own bit */
|
|
CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_OWN);
|
|
80029ee: 6a3b ldr r3, [r7, #32]
|
|
80029f0: 68db ldr r3, [r3, #12]
|
|
80029f2: f023 4200 bic.w r2, r3, #2147483648 ; 0x80000000
|
|
80029f6: 6a3b ldr r3, [r7, #32]
|
|
80029f8: 60da str r2, [r3, #12]
|
|
|
|
return HAL_ETH_ERROR_BUSY;
|
|
80029fa: 2302 movs r3, #2
|
|
80029fc: e1b6 b.n 8002d6c <ETH_Prepare_Tx_Descriptors+0x50c>
|
|
|
|
/***************************************************************************/
|
|
/***************** Normal descriptors configuration *****************/
|
|
/***************************************************************************/
|
|
|
|
descnbr += 1U;
|
|
80029fe: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8002a00: 3301 adds r3, #1
|
|
8002a02: 627b str r3, [r7, #36] ; 0x24
|
|
|
|
/* Set header or buffer 1 address */
|
|
WRITE_REG(dmatxdesc->DESC0, (uint32_t)txbuffer->buffer);
|
|
8002a04: 69fb ldr r3, [r7, #28]
|
|
8002a06: 681b ldr r3, [r3, #0]
|
|
8002a08: 461a mov r2, r3
|
|
8002a0a: 6a3b ldr r3, [r7, #32]
|
|
8002a0c: 601a str r2, [r3, #0]
|
|
/* Set header or buffer 1 Length */
|
|
MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B1L, txbuffer->len);
|
|
8002a0e: 6a3b ldr r3, [r7, #32]
|
|
8002a10: 689a ldr r2, [r3, #8]
|
|
8002a12: 4b24 ldr r3, [pc, #144] ; (8002aa4 <ETH_Prepare_Tx_Descriptors+0x244>)
|
|
8002a14: 4013 ands r3, r2
|
|
8002a16: 69fa ldr r2, [r7, #28]
|
|
8002a18: 6852 ldr r2, [r2, #4]
|
|
8002a1a: 431a orrs r2, r3
|
|
8002a1c: 6a3b ldr r3, [r7, #32]
|
|
8002a1e: 609a str r2, [r3, #8]
|
|
|
|
if (txbuffer->next != NULL)
|
|
8002a20: 69fb ldr r3, [r7, #28]
|
|
8002a22: 689b ldr r3, [r3, #8]
|
|
8002a24: 2b00 cmp r3, #0
|
|
8002a26: d012 beq.n 8002a4e <ETH_Prepare_Tx_Descriptors+0x1ee>
|
|
{
|
|
txbuffer = txbuffer->next;
|
|
8002a28: 69fb ldr r3, [r7, #28]
|
|
8002a2a: 689b ldr r3, [r3, #8]
|
|
8002a2c: 61fb str r3, [r7, #28]
|
|
/* Set buffer 2 address */
|
|
WRITE_REG(dmatxdesc->DESC1, (uint32_t)txbuffer->buffer);
|
|
8002a2e: 69fb ldr r3, [r7, #28]
|
|
8002a30: 681b ldr r3, [r3, #0]
|
|
8002a32: 461a mov r2, r3
|
|
8002a34: 6a3b ldr r3, [r7, #32]
|
|
8002a36: 605a str r2, [r3, #4]
|
|
/* Set buffer 2 Length */
|
|
MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, (txbuffer->len << 16));
|
|
8002a38: 6a3b ldr r3, [r7, #32]
|
|
8002a3a: 689a ldr r2, [r3, #8]
|
|
8002a3c: 4b1a ldr r3, [pc, #104] ; (8002aa8 <ETH_Prepare_Tx_Descriptors+0x248>)
|
|
8002a3e: 4013 ands r3, r2
|
|
8002a40: 69fa ldr r2, [r7, #28]
|
|
8002a42: 6852 ldr r2, [r2, #4]
|
|
8002a44: 0412 lsls r2, r2, #16
|
|
8002a46: 431a orrs r2, r3
|
|
8002a48: 6a3b ldr r3, [r7, #32]
|
|
8002a4a: 609a str r2, [r3, #8]
|
|
8002a4c: e008 b.n 8002a60 <ETH_Prepare_Tx_Descriptors+0x200>
|
|
}
|
|
else
|
|
{
|
|
WRITE_REG(dmatxdesc->DESC1, 0x0);
|
|
8002a4e: 6a3b ldr r3, [r7, #32]
|
|
8002a50: 2200 movs r2, #0
|
|
8002a52: 605a str r2, [r3, #4]
|
|
/* Set buffer 2 Length */
|
|
MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, 0x0U);
|
|
8002a54: 6a3b ldr r3, [r7, #32]
|
|
8002a56: 689a ldr r2, [r3, #8]
|
|
8002a58: 4b13 ldr r3, [pc, #76] ; (8002aa8 <ETH_Prepare_Tx_Descriptors+0x248>)
|
|
8002a5a: 4013 ands r3, r2
|
|
8002a5c: 6a3a ldr r2, [r7, #32]
|
|
8002a5e: 6093 str r3, [r2, #8]
|
|
}
|
|
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET)
|
|
8002a60: 68bb ldr r3, [r7, #8]
|
|
8002a62: 681b ldr r3, [r3, #0]
|
|
8002a64: f003 0310 and.w r3, r3, #16
|
|
8002a68: 2b00 cmp r3, #0
|
|
8002a6a: d021 beq.n 8002ab0 <ETH_Prepare_Tx_Descriptors+0x250>
|
|
{
|
|
/* Set TCP Header length */
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_THL, (pTxConfig->TCPHeaderLen << 19));
|
|
8002a6c: 6a3b ldr r3, [r7, #32]
|
|
8002a6e: 68db ldr r3, [r3, #12]
|
|
8002a70: f423 02f0 bic.w r2, r3, #7864320 ; 0x780000
|
|
8002a74: 68bb ldr r3, [r7, #8]
|
|
8002a76: 6a1b ldr r3, [r3, #32]
|
|
8002a78: 04db lsls r3, r3, #19
|
|
8002a7a: 431a orrs r2, r3
|
|
8002a7c: 6a3b ldr r3, [r7, #32]
|
|
8002a7e: 60da str r2, [r3, #12]
|
|
/* Set TCP payload length */
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TPL, pTxConfig->PayloadLen);
|
|
8002a80: 6a3b ldr r3, [r7, #32]
|
|
8002a82: 68da ldr r2, [r3, #12]
|
|
8002a84: 4b09 ldr r3, [pc, #36] ; (8002aac <ETH_Prepare_Tx_Descriptors+0x24c>)
|
|
8002a86: 4013 ands r3, r2
|
|
8002a88: 68ba ldr r2, [r7, #8]
|
|
8002a8a: 69d2 ldr r2, [r2, #28]
|
|
8002a8c: 431a orrs r2, r3
|
|
8002a8e: 6a3b ldr r3, [r7, #32]
|
|
8002a90: 60da str r2, [r3, #12]
|
|
/* Set TCP Segmentation Enabled bit */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TSE);
|
|
8002a92: 6a3b ldr r3, [r7, #32]
|
|
8002a94: 68db ldr r3, [r3, #12]
|
|
8002a96: f443 2280 orr.w r2, r3, #262144 ; 0x40000
|
|
8002a9a: 6a3b ldr r3, [r7, #32]
|
|
8002a9c: 60da str r2, [r3, #12]
|
|
8002a9e: e02e b.n 8002afe <ETH_Prepare_Tx_Descriptors+0x29e>
|
|
8002aa0: ffff0000 .word 0xffff0000
|
|
8002aa4: ffffc000 .word 0xffffc000
|
|
8002aa8: c000ffff .word 0xc000ffff
|
|
8002aac: fffc0000 .word 0xfffc0000
|
|
}
|
|
else
|
|
{
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FL, pTxConfig->Length);
|
|
8002ab0: 6a3b ldr r3, [r7, #32]
|
|
8002ab2: 68da ldr r2, [r3, #12]
|
|
8002ab4: 4b7b ldr r3, [pc, #492] ; (8002ca4 <ETH_Prepare_Tx_Descriptors+0x444>)
|
|
8002ab6: 4013 ands r3, r2
|
|
8002ab8: 68ba ldr r2, [r7, #8]
|
|
8002aba: 6852 ldr r2, [r2, #4]
|
|
8002abc: 431a orrs r2, r3
|
|
8002abe: 6a3b ldr r3, [r7, #32]
|
|
8002ac0: 60da str r2, [r3, #12]
|
|
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CSUM) != (uint32_t)RESET)
|
|
8002ac2: 68bb ldr r3, [r7, #8]
|
|
8002ac4: 681b ldr r3, [r3, #0]
|
|
8002ac6: f003 0301 and.w r3, r3, #1
|
|
8002aca: 2b00 cmp r3, #0
|
|
8002acc: d008 beq.n 8002ae0 <ETH_Prepare_Tx_Descriptors+0x280>
|
|
{
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CIC, pTxConfig->ChecksumCtrl);
|
|
8002ace: 6a3b ldr r3, [r7, #32]
|
|
8002ad0: 68db ldr r3, [r3, #12]
|
|
8002ad2: f423 3240 bic.w r2, r3, #196608 ; 0x30000
|
|
8002ad6: 68bb ldr r3, [r7, #8]
|
|
8002ad8: 695b ldr r3, [r3, #20]
|
|
8002ada: 431a orrs r2, r3
|
|
8002adc: 6a3b ldr r3, [r7, #32]
|
|
8002ade: 60da str r2, [r3, #12]
|
|
}
|
|
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CRCPAD) != (uint32_t)RESET)
|
|
8002ae0: 68bb ldr r3, [r7, #8]
|
|
8002ae2: 681b ldr r3, [r3, #0]
|
|
8002ae4: f003 0320 and.w r3, r3, #32
|
|
8002ae8: 2b00 cmp r3, #0
|
|
8002aea: d008 beq.n 8002afe <ETH_Prepare_Tx_Descriptors+0x29e>
|
|
{
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CPC, pTxConfig->CRCPadCtrl);
|
|
8002aec: 6a3b ldr r3, [r7, #32]
|
|
8002aee: 68db ldr r3, [r3, #12]
|
|
8002af0: f023 6240 bic.w r2, r3, #201326592 ; 0xc000000
|
|
8002af4: 68bb ldr r3, [r7, #8]
|
|
8002af6: 691b ldr r3, [r3, #16]
|
|
8002af8: 431a orrs r2, r3
|
|
8002afa: 6a3b ldr r3, [r7, #32]
|
|
8002afc: 60da str r2, [r3, #12]
|
|
}
|
|
}
|
|
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET)
|
|
8002afe: 68bb ldr r3, [r7, #8]
|
|
8002b00: 681b ldr r3, [r3, #0]
|
|
8002b02: f003 0304 and.w r3, r3, #4
|
|
8002b06: 2b00 cmp r3, #0
|
|
8002b08: d008 beq.n 8002b1c <ETH_Prepare_Tx_Descriptors+0x2bc>
|
|
{
|
|
/* Set Vlan Tag control */
|
|
MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_VTIR, pTxConfig->VlanCtrl);
|
|
8002b0a: 6a3b ldr r3, [r7, #32]
|
|
8002b0c: 689b ldr r3, [r3, #8]
|
|
8002b0e: f423 4240 bic.w r2, r3, #49152 ; 0xc000
|
|
8002b12: 68bb ldr r3, [r7, #8]
|
|
8002b14: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
8002b16: 431a orrs r2, r3
|
|
8002b18: 6a3b ldr r3, [r7, #32]
|
|
8002b1a: 609a str r2, [r3, #8]
|
|
}
|
|
|
|
/* Mark it as First Descriptor */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FD);
|
|
8002b1c: 6a3b ldr r3, [r7, #32]
|
|
8002b1e: 68db ldr r3, [r3, #12]
|
|
8002b20: f043 5200 orr.w r2, r3, #536870912 ; 0x20000000
|
|
8002b24: 6a3b ldr r3, [r7, #32]
|
|
8002b26: 60da str r2, [r3, #12]
|
|
/* Mark it as NORMAL descriptor */
|
|
CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CTXT);
|
|
8002b28: 6a3b ldr r3, [r7, #32]
|
|
8002b2a: 68db ldr r3, [r3, #12]
|
|
8002b2c: f023 4280 bic.w r2, r3, #1073741824 ; 0x40000000
|
|
8002b30: 6a3b ldr r3, [r7, #32]
|
|
8002b32: 60da str r2, [r3, #12]
|
|
__ASM volatile ("dmb 0xF":::"memory");
|
|
8002b34: f3bf 8f5f dmb sy
|
|
}
|
|
8002b38: bf00 nop
|
|
/* Ensure rest of descriptor is written to RAM before the OWN bit */
|
|
__DMB();
|
|
/* set OWN bit of FIRST descriptor */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN);
|
|
8002b3a: 6a3b ldr r3, [r7, #32]
|
|
8002b3c: 68db ldr r3, [r3, #12]
|
|
8002b3e: f043 4200 orr.w r2, r3, #2147483648 ; 0x80000000
|
|
8002b42: 6a3b ldr r3, [r7, #32]
|
|
8002b44: 60da str r2, [r3, #12]
|
|
|
|
/* If source address insertion/replacement is enabled for this packet */
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_SAIC) != (uint32_t)RESET)
|
|
8002b46: 68bb ldr r3, [r7, #8]
|
|
8002b48: 681b ldr r3, [r3, #0]
|
|
8002b4a: f003 0302 and.w r3, r3, #2
|
|
8002b4e: 2b00 cmp r3, #0
|
|
8002b50: f000 80da beq.w 8002d08 <ETH_Prepare_Tx_Descriptors+0x4a8>
|
|
{
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_SAIC, pTxConfig->SrcAddrCtrl);
|
|
8002b54: 6a3b ldr r3, [r7, #32]
|
|
8002b56: 68db ldr r3, [r3, #12]
|
|
8002b58: f023 7260 bic.w r2, r3, #58720256 ; 0x3800000
|
|
8002b5c: 68bb ldr r3, [r7, #8]
|
|
8002b5e: 68db ldr r3, [r3, #12]
|
|
8002b60: 431a orrs r2, r3
|
|
8002b62: 6a3b ldr r3, [r7, #32]
|
|
8002b64: 60da str r2, [r3, #12]
|
|
}
|
|
|
|
/* only if the packet is split into more than one descriptors > 1 */
|
|
while (txbuffer->next != NULL)
|
|
8002b66: e0cf b.n 8002d08 <ETH_Prepare_Tx_Descriptors+0x4a8>
|
|
{
|
|
/* Clear the LD bit of previous descriptor */
|
|
CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_LD);
|
|
8002b68: 6a3b ldr r3, [r7, #32]
|
|
8002b6a: 68db ldr r3, [r3, #12]
|
|
8002b6c: f023 5280 bic.w r2, r3, #268435456 ; 0x10000000
|
|
8002b70: 6a3b ldr r3, [r7, #32]
|
|
8002b72: 60da str r2, [r3, #12]
|
|
/* Increment current tx descriptor index */
|
|
INCR_TX_DESC_INDEX(descidx, 1U);
|
|
8002b74: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8002b76: 3301 adds r3, #1
|
|
8002b78: 62fb str r3, [r7, #44] ; 0x2c
|
|
8002b7a: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8002b7c: 2b03 cmp r3, #3
|
|
8002b7e: d902 bls.n 8002b86 <ETH_Prepare_Tx_Descriptors+0x326>
|
|
8002b80: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8002b82: 3b04 subs r3, #4
|
|
8002b84: 62fb str r3, [r7, #44] ; 0x2c
|
|
/* Get current descriptor address */
|
|
dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
|
|
8002b86: 697b ldr r3, [r7, #20]
|
|
8002b88: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8002b8a: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
8002b8e: 623b str r3, [r7, #32]
|
|
|
|
/* Clear the FD bit of new Descriptor */
|
|
CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FD);
|
|
8002b90: 6a3b ldr r3, [r7, #32]
|
|
8002b92: 68db ldr r3, [r3, #12]
|
|
8002b94: f023 5200 bic.w r2, r3, #536870912 ; 0x20000000
|
|
8002b98: 6a3b ldr r3, [r7, #32]
|
|
8002b9a: 60da str r2, [r3, #12]
|
|
|
|
/* Current Tx Descriptor Owned by DMA: cannot be used by the application */
|
|
if ((READ_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN) == ETH_DMATXNDESCRF_OWN)
|
|
8002b9c: 6a3b ldr r3, [r7, #32]
|
|
8002b9e: 68db ldr r3, [r3, #12]
|
|
8002ba0: f003 4300 and.w r3, r3, #2147483648 ; 0x80000000
|
|
8002ba4: f1b3 4f00 cmp.w r3, #2147483648 ; 0x80000000
|
|
8002ba8: d007 beq.n 8002bba <ETH_Prepare_Tx_Descriptors+0x35a>
|
|
|| (dmatxdesclist->PacketAddress[descidx] != NULL))
|
|
8002baa: 697a ldr r2, [r7, #20]
|
|
8002bac: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8002bae: 3304 adds r3, #4
|
|
8002bb0: 009b lsls r3, r3, #2
|
|
8002bb2: 4413 add r3, r2
|
|
8002bb4: 685b ldr r3, [r3, #4]
|
|
8002bb6: 2b00 cmp r3, #0
|
|
8002bb8: d029 beq.n 8002c0e <ETH_Prepare_Tx_Descriptors+0x3ae>
|
|
{
|
|
descidx = firstdescidx;
|
|
8002bba: 693b ldr r3, [r7, #16]
|
|
8002bbc: 62fb str r3, [r7, #44] ; 0x2c
|
|
dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
|
|
8002bbe: 697b ldr r3, [r7, #20]
|
|
8002bc0: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8002bc2: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
8002bc6: 623b str r3, [r7, #32]
|
|
|
|
/* clear previous desc own bit */
|
|
for (idx = 0; idx < descnbr; idx ++)
|
|
8002bc8: 2300 movs r3, #0
|
|
8002bca: 62bb str r3, [r7, #40] ; 0x28
|
|
8002bcc: e019 b.n 8002c02 <ETH_Prepare_Tx_Descriptors+0x3a2>
|
|
__ASM volatile ("dmb 0xF":::"memory");
|
|
8002bce: f3bf 8f5f dmb sy
|
|
}
|
|
8002bd2: bf00 nop
|
|
{
|
|
/* Ensure rest of descriptor is written to RAM before the OWN bit */
|
|
__DMB();
|
|
|
|
CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN);
|
|
8002bd4: 6a3b ldr r3, [r7, #32]
|
|
8002bd6: 68db ldr r3, [r3, #12]
|
|
8002bd8: f023 4200 bic.w r2, r3, #2147483648 ; 0x80000000
|
|
8002bdc: 6a3b ldr r3, [r7, #32]
|
|
8002bde: 60da str r2, [r3, #12]
|
|
|
|
/* Increment current tx descriptor index */
|
|
INCR_TX_DESC_INDEX(descidx, 1U);
|
|
8002be0: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8002be2: 3301 adds r3, #1
|
|
8002be4: 62fb str r3, [r7, #44] ; 0x2c
|
|
8002be6: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8002be8: 2b03 cmp r3, #3
|
|
8002bea: d902 bls.n 8002bf2 <ETH_Prepare_Tx_Descriptors+0x392>
|
|
8002bec: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8002bee: 3b04 subs r3, #4
|
|
8002bf0: 62fb str r3, [r7, #44] ; 0x2c
|
|
/* Get current descriptor address */
|
|
dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
|
|
8002bf2: 697b ldr r3, [r7, #20]
|
|
8002bf4: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8002bf6: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
8002bfa: 623b str r3, [r7, #32]
|
|
for (idx = 0; idx < descnbr; idx ++)
|
|
8002bfc: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8002bfe: 3301 adds r3, #1
|
|
8002c00: 62bb str r3, [r7, #40] ; 0x28
|
|
8002c02: 6aba ldr r2, [r7, #40] ; 0x28
|
|
8002c04: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8002c06: 429a cmp r2, r3
|
|
8002c08: d3e1 bcc.n 8002bce <ETH_Prepare_Tx_Descriptors+0x36e>
|
|
}
|
|
|
|
return HAL_ETH_ERROR_BUSY;
|
|
8002c0a: 2302 movs r3, #2
|
|
8002c0c: e0ae b.n 8002d6c <ETH_Prepare_Tx_Descriptors+0x50c>
|
|
}
|
|
|
|
descnbr += 1U;
|
|
8002c0e: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8002c10: 3301 adds r3, #1
|
|
8002c12: 627b str r3, [r7, #36] ; 0x24
|
|
|
|
/* Get the next Tx buffer in the list */
|
|
txbuffer = txbuffer->next;
|
|
8002c14: 69fb ldr r3, [r7, #28]
|
|
8002c16: 689b ldr r3, [r3, #8]
|
|
8002c18: 61fb str r3, [r7, #28]
|
|
|
|
/* Set header or buffer 1 address */
|
|
WRITE_REG(dmatxdesc->DESC0, (uint32_t)txbuffer->buffer);
|
|
8002c1a: 69fb ldr r3, [r7, #28]
|
|
8002c1c: 681b ldr r3, [r3, #0]
|
|
8002c1e: 461a mov r2, r3
|
|
8002c20: 6a3b ldr r3, [r7, #32]
|
|
8002c22: 601a str r2, [r3, #0]
|
|
/* Set header or buffer 1 Length */
|
|
MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B1L, txbuffer->len);
|
|
8002c24: 6a3b ldr r3, [r7, #32]
|
|
8002c26: 689a ldr r2, [r3, #8]
|
|
8002c28: 4b1f ldr r3, [pc, #124] ; (8002ca8 <ETH_Prepare_Tx_Descriptors+0x448>)
|
|
8002c2a: 4013 ands r3, r2
|
|
8002c2c: 69fa ldr r2, [r7, #28]
|
|
8002c2e: 6852 ldr r2, [r2, #4]
|
|
8002c30: 431a orrs r2, r3
|
|
8002c32: 6a3b ldr r3, [r7, #32]
|
|
8002c34: 609a str r2, [r3, #8]
|
|
|
|
if (txbuffer->next != NULL)
|
|
8002c36: 69fb ldr r3, [r7, #28]
|
|
8002c38: 689b ldr r3, [r3, #8]
|
|
8002c3a: 2b00 cmp r3, #0
|
|
8002c3c: d012 beq.n 8002c64 <ETH_Prepare_Tx_Descriptors+0x404>
|
|
{
|
|
/* Get the next Tx buffer in the list */
|
|
txbuffer = txbuffer->next;
|
|
8002c3e: 69fb ldr r3, [r7, #28]
|
|
8002c40: 689b ldr r3, [r3, #8]
|
|
8002c42: 61fb str r3, [r7, #28]
|
|
/* Set buffer 2 address */
|
|
WRITE_REG(dmatxdesc->DESC1, (uint32_t)txbuffer->buffer);
|
|
8002c44: 69fb ldr r3, [r7, #28]
|
|
8002c46: 681b ldr r3, [r3, #0]
|
|
8002c48: 461a mov r2, r3
|
|
8002c4a: 6a3b ldr r3, [r7, #32]
|
|
8002c4c: 605a str r2, [r3, #4]
|
|
/* Set buffer 2 Length */
|
|
MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, (txbuffer->len << 16));
|
|
8002c4e: 6a3b ldr r3, [r7, #32]
|
|
8002c50: 689a ldr r2, [r3, #8]
|
|
8002c52: 4b16 ldr r3, [pc, #88] ; (8002cac <ETH_Prepare_Tx_Descriptors+0x44c>)
|
|
8002c54: 4013 ands r3, r2
|
|
8002c56: 69fa ldr r2, [r7, #28]
|
|
8002c58: 6852 ldr r2, [r2, #4]
|
|
8002c5a: 0412 lsls r2, r2, #16
|
|
8002c5c: 431a orrs r2, r3
|
|
8002c5e: 6a3b ldr r3, [r7, #32]
|
|
8002c60: 609a str r2, [r3, #8]
|
|
8002c62: e008 b.n 8002c76 <ETH_Prepare_Tx_Descriptors+0x416>
|
|
}
|
|
else
|
|
{
|
|
WRITE_REG(dmatxdesc->DESC1, 0x0);
|
|
8002c64: 6a3b ldr r3, [r7, #32]
|
|
8002c66: 2200 movs r2, #0
|
|
8002c68: 605a str r2, [r3, #4]
|
|
/* Set buffer 2 Length */
|
|
MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, 0x0U);
|
|
8002c6a: 6a3b ldr r3, [r7, #32]
|
|
8002c6c: 689a ldr r2, [r3, #8]
|
|
8002c6e: 4b0f ldr r3, [pc, #60] ; (8002cac <ETH_Prepare_Tx_Descriptors+0x44c>)
|
|
8002c70: 4013 ands r3, r2
|
|
8002c72: 6a3a ldr r2, [r7, #32]
|
|
8002c74: 6093 str r3, [r2, #8]
|
|
}
|
|
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET)
|
|
8002c76: 68bb ldr r3, [r7, #8]
|
|
8002c78: 681b ldr r3, [r3, #0]
|
|
8002c7a: f003 0310 and.w r3, r3, #16
|
|
8002c7e: 2b00 cmp r3, #0
|
|
8002c80: d018 beq.n 8002cb4 <ETH_Prepare_Tx_Descriptors+0x454>
|
|
{
|
|
/* Set TCP payload length */
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TPL, pTxConfig->PayloadLen);
|
|
8002c82: 6a3b ldr r3, [r7, #32]
|
|
8002c84: 68da ldr r2, [r3, #12]
|
|
8002c86: 4b0a ldr r3, [pc, #40] ; (8002cb0 <ETH_Prepare_Tx_Descriptors+0x450>)
|
|
8002c88: 4013 ands r3, r2
|
|
8002c8a: 68ba ldr r2, [r7, #8]
|
|
8002c8c: 69d2 ldr r2, [r2, #28]
|
|
8002c8e: 431a orrs r2, r3
|
|
8002c90: 6a3b ldr r3, [r7, #32]
|
|
8002c92: 60da str r2, [r3, #12]
|
|
/* Set TCP Segmentation Enabled bit */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TSE);
|
|
8002c94: 6a3b ldr r3, [r7, #32]
|
|
8002c96: 68db ldr r3, [r3, #12]
|
|
8002c98: f443 2280 orr.w r2, r3, #262144 ; 0x40000
|
|
8002c9c: 6a3b ldr r3, [r7, #32]
|
|
8002c9e: 60da str r2, [r3, #12]
|
|
8002ca0: e020 b.n 8002ce4 <ETH_Prepare_Tx_Descriptors+0x484>
|
|
8002ca2: bf00 nop
|
|
8002ca4: ffff8000 .word 0xffff8000
|
|
8002ca8: ffffc000 .word 0xffffc000
|
|
8002cac: c000ffff .word 0xc000ffff
|
|
8002cb0: fffc0000 .word 0xfffc0000
|
|
}
|
|
else
|
|
{
|
|
/* Set the packet length */
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FL, pTxConfig->Length);
|
|
8002cb4: 6a3b ldr r3, [r7, #32]
|
|
8002cb6: 68da ldr r2, [r3, #12]
|
|
8002cb8: 4b2f ldr r3, [pc, #188] ; (8002d78 <ETH_Prepare_Tx_Descriptors+0x518>)
|
|
8002cba: 4013 ands r3, r2
|
|
8002cbc: 68ba ldr r2, [r7, #8]
|
|
8002cbe: 6852 ldr r2, [r2, #4]
|
|
8002cc0: 431a orrs r2, r3
|
|
8002cc2: 6a3b ldr r3, [r7, #32]
|
|
8002cc4: 60da str r2, [r3, #12]
|
|
|
|
if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CSUM) != (uint32_t)RESET)
|
|
8002cc6: 68bb ldr r3, [r7, #8]
|
|
8002cc8: 681b ldr r3, [r3, #0]
|
|
8002cca: f003 0301 and.w r3, r3, #1
|
|
8002cce: 2b00 cmp r3, #0
|
|
8002cd0: d008 beq.n 8002ce4 <ETH_Prepare_Tx_Descriptors+0x484>
|
|
{
|
|
/* Checksum Insertion Control */
|
|
MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CIC, pTxConfig->ChecksumCtrl);
|
|
8002cd2: 6a3b ldr r3, [r7, #32]
|
|
8002cd4: 68db ldr r3, [r3, #12]
|
|
8002cd6: f423 3240 bic.w r2, r3, #196608 ; 0x30000
|
|
8002cda: 68bb ldr r3, [r7, #8]
|
|
8002cdc: 695b ldr r3, [r3, #20]
|
|
8002cde: 431a orrs r2, r3
|
|
8002ce0: 6a3b ldr r3, [r7, #32]
|
|
8002ce2: 60da str r2, [r3, #12]
|
|
}
|
|
}
|
|
|
|
bd_count += 1U;
|
|
8002ce4: 69bb ldr r3, [r7, #24]
|
|
8002ce6: 3301 adds r3, #1
|
|
8002ce8: 61bb str r3, [r7, #24]
|
|
__ASM volatile ("dmb 0xF":::"memory");
|
|
8002cea: f3bf 8f5f dmb sy
|
|
}
|
|
8002cee: bf00 nop
|
|
|
|
/* Ensure rest of descriptor is written to RAM before the OWN bit */
|
|
__DMB();
|
|
/* Set Own bit */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN);
|
|
8002cf0: 6a3b ldr r3, [r7, #32]
|
|
8002cf2: 68db ldr r3, [r3, #12]
|
|
8002cf4: f043 4200 orr.w r2, r3, #2147483648 ; 0x80000000
|
|
8002cf8: 6a3b ldr r3, [r7, #32]
|
|
8002cfa: 60da str r2, [r3, #12]
|
|
/* Mark it as NORMAL descriptor */
|
|
CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CTXT);
|
|
8002cfc: 6a3b ldr r3, [r7, #32]
|
|
8002cfe: 68db ldr r3, [r3, #12]
|
|
8002d00: f023 4280 bic.w r2, r3, #1073741824 ; 0x40000000
|
|
8002d04: 6a3b ldr r3, [r7, #32]
|
|
8002d06: 60da str r2, [r3, #12]
|
|
while (txbuffer->next != NULL)
|
|
8002d08: 69fb ldr r3, [r7, #28]
|
|
8002d0a: 689b ldr r3, [r3, #8]
|
|
8002d0c: 2b00 cmp r3, #0
|
|
8002d0e: f47f af2b bne.w 8002b68 <ETH_Prepare_Tx_Descriptors+0x308>
|
|
}
|
|
|
|
if (ItMode != ((uint32_t)RESET))
|
|
8002d12: 687b ldr r3, [r7, #4]
|
|
8002d14: 2b00 cmp r3, #0
|
|
8002d16: d006 beq.n 8002d26 <ETH_Prepare_Tx_Descriptors+0x4c6>
|
|
{
|
|
/* Set Interrupt on completion bit */
|
|
SET_BIT(dmatxdesc->DESC2, ETH_DMATXNDESCRF_IOC);
|
|
8002d18: 6a3b ldr r3, [r7, #32]
|
|
8002d1a: 689b ldr r3, [r3, #8]
|
|
8002d1c: f043 4200 orr.w r2, r3, #2147483648 ; 0x80000000
|
|
8002d20: 6a3b ldr r3, [r7, #32]
|
|
8002d22: 609a str r2, [r3, #8]
|
|
8002d24: e005 b.n 8002d32 <ETH_Prepare_Tx_Descriptors+0x4d2>
|
|
}
|
|
else
|
|
{
|
|
/* Clear Interrupt on completion bit */
|
|
CLEAR_BIT(dmatxdesc->DESC2, ETH_DMATXNDESCRF_IOC);
|
|
8002d26: 6a3b ldr r3, [r7, #32]
|
|
8002d28: 689b ldr r3, [r3, #8]
|
|
8002d2a: f023 4200 bic.w r2, r3, #2147483648 ; 0x80000000
|
|
8002d2e: 6a3b ldr r3, [r7, #32]
|
|
8002d30: 609a str r2, [r3, #8]
|
|
}
|
|
|
|
/* Mark it as LAST descriptor */
|
|
SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_LD);
|
|
8002d32: 6a3b ldr r3, [r7, #32]
|
|
8002d34: 68db ldr r3, [r3, #12]
|
|
8002d36: f043 5280 orr.w r2, r3, #268435456 ; 0x10000000
|
|
8002d3a: 6a3b ldr r3, [r7, #32]
|
|
8002d3c: 60da str r2, [r3, #12]
|
|
/* Save the current packet address to expose it to the application */
|
|
dmatxdesclist->PacketAddress[descidx] = dmatxdesclist->CurrentPacketAddress;
|
|
8002d3e: 697b ldr r3, [r7, #20]
|
|
8002d40: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
8002d42: 6979 ldr r1, [r7, #20]
|
|
8002d44: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8002d46: 3304 adds r3, #4
|
|
8002d48: 009b lsls r3, r3, #2
|
|
8002d4a: 440b add r3, r1
|
|
8002d4c: 605a str r2, [r3, #4]
|
|
|
|
dmatxdesclist->CurTxDesc = descidx;
|
|
8002d4e: 697b ldr r3, [r7, #20]
|
|
8002d50: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8002d52: 611a str r2, [r3, #16]
|
|
__ASM volatile ("cpsid i" : : : "memory");
|
|
8002d54: b672 cpsid i
|
|
}
|
|
8002d56: bf00 nop
|
|
|
|
/* disable the interrupt */
|
|
__disable_irq();
|
|
|
|
dmatxdesclist->BuffersInUse += bd_count + 1U;
|
|
8002d58: 697b ldr r3, [r7, #20]
|
|
8002d5a: 6a9a ldr r2, [r3, #40] ; 0x28
|
|
8002d5c: 69bb ldr r3, [r7, #24]
|
|
8002d5e: 4413 add r3, r2
|
|
8002d60: 1c5a adds r2, r3, #1
|
|
8002d62: 697b ldr r3, [r7, #20]
|
|
8002d64: 629a str r2, [r3, #40] ; 0x28
|
|
__ASM volatile ("cpsie i" : : : "memory");
|
|
8002d66: b662 cpsie i
|
|
}
|
|
8002d68: bf00 nop
|
|
/* Enable interrupts back */
|
|
__enable_irq();
|
|
|
|
|
|
/* Return function status */
|
|
return HAL_ETH_ERROR_NONE;
|
|
8002d6a: 2300 movs r3, #0
|
|
}
|
|
8002d6c: 4618 mov r0, r3
|
|
8002d6e: 3734 adds r7, #52 ; 0x34
|
|
8002d70: 46bd mov sp, r7
|
|
8002d72: f85d 7b04 ldr.w r7, [sp], #4
|
|
8002d76: 4770 bx lr
|
|
8002d78: ffff8000 .word 0xffff8000
|
|
|
|
08002d7c <HAL_GPIO_Init>:
|
|
* @param GPIO_Init: pointer to a GPIO_InitTypeDef structure that contains
|
|
* the configuration information for the specified GPIO peripheral.
|
|
* @retval None
|
|
*/
|
|
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
|
|
{
|
|
8002d7c: b480 push {r7}
|
|
8002d7e: b089 sub sp, #36 ; 0x24
|
|
8002d80: af00 add r7, sp, #0
|
|
8002d82: 6078 str r0, [r7, #4]
|
|
8002d84: 6039 str r1, [r7, #0]
|
|
uint32_t position = 0x00U;
|
|
8002d86: 2300 movs r3, #0
|
|
8002d88: 61fb str r3, [r7, #28]
|
|
EXTI_Core_TypeDef *EXTI_CurrentCPU;
|
|
|
|
#if defined(DUAL_CORE) && defined(CORE_CM4)
|
|
EXTI_CurrentCPU = EXTI_D2; /* EXTI for CM4 CPU */
|
|
#else
|
|
EXTI_CurrentCPU = EXTI_D1; /* EXTI for CM7 CPU */
|
|
8002d8a: 4b86 ldr r3, [pc, #536] ; (8002fa4 <HAL_GPIO_Init+0x228>)
|
|
8002d8c: 617b str r3, [r7, #20]
|
|
assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
|
|
assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
|
|
assert_param(IS_GPIO_MODE(GPIO_Init->Mode));
|
|
|
|
/* Configure the port pins */
|
|
while (((GPIO_Init->Pin) >> position) != 0x00U)
|
|
8002d8e: e18c b.n 80030aa <HAL_GPIO_Init+0x32e>
|
|
{
|
|
/* Get current io position */
|
|
iocurrent = (GPIO_Init->Pin) & (1UL << position);
|
|
8002d90: 683b ldr r3, [r7, #0]
|
|
8002d92: 681a ldr r2, [r3, #0]
|
|
8002d94: 2101 movs r1, #1
|
|
8002d96: 69fb ldr r3, [r7, #28]
|
|
8002d98: fa01 f303 lsl.w r3, r1, r3
|
|
8002d9c: 4013 ands r3, r2
|
|
8002d9e: 613b str r3, [r7, #16]
|
|
|
|
if (iocurrent != 0x00U)
|
|
8002da0: 693b ldr r3, [r7, #16]
|
|
8002da2: 2b00 cmp r3, #0
|
|
8002da4: f000 817e beq.w 80030a4 <HAL_GPIO_Init+0x328>
|
|
{
|
|
/*--------------------- GPIO Mode Configuration ------------------------*/
|
|
/* In case of Output or Alternate function mode selection */
|
|
if (((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || ((GPIO_Init->Mode & GPIO_MODE) == MODE_AF))
|
|
8002da8: 683b ldr r3, [r7, #0]
|
|
8002daa: 685b ldr r3, [r3, #4]
|
|
8002dac: f003 0303 and.w r3, r3, #3
|
|
8002db0: 2b01 cmp r3, #1
|
|
8002db2: d005 beq.n 8002dc0 <HAL_GPIO_Init+0x44>
|
|
8002db4: 683b ldr r3, [r7, #0]
|
|
8002db6: 685b ldr r3, [r3, #4]
|
|
8002db8: f003 0303 and.w r3, r3, #3
|
|
8002dbc: 2b02 cmp r3, #2
|
|
8002dbe: d130 bne.n 8002e22 <HAL_GPIO_Init+0xa6>
|
|
{
|
|
/* Check the Speed parameter */
|
|
assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
|
|
|
|
/* Configure the IO Speed */
|
|
temp = GPIOx->OSPEEDR;
|
|
8002dc0: 687b ldr r3, [r7, #4]
|
|
8002dc2: 689b ldr r3, [r3, #8]
|
|
8002dc4: 61bb str r3, [r7, #24]
|
|
temp &= ~(GPIO_OSPEEDR_OSPEED0 << (position * 2U));
|
|
8002dc6: 69fb ldr r3, [r7, #28]
|
|
8002dc8: 005b lsls r3, r3, #1
|
|
8002dca: 2203 movs r2, #3
|
|
8002dcc: fa02 f303 lsl.w r3, r2, r3
|
|
8002dd0: 43db mvns r3, r3
|
|
8002dd2: 69ba ldr r2, [r7, #24]
|
|
8002dd4: 4013 ands r3, r2
|
|
8002dd6: 61bb str r3, [r7, #24]
|
|
temp |= (GPIO_Init->Speed << (position * 2U));
|
|
8002dd8: 683b ldr r3, [r7, #0]
|
|
8002dda: 68da ldr r2, [r3, #12]
|
|
8002ddc: 69fb ldr r3, [r7, #28]
|
|
8002dde: 005b lsls r3, r3, #1
|
|
8002de0: fa02 f303 lsl.w r3, r2, r3
|
|
8002de4: 69ba ldr r2, [r7, #24]
|
|
8002de6: 4313 orrs r3, r2
|
|
8002de8: 61bb str r3, [r7, #24]
|
|
GPIOx->OSPEEDR = temp;
|
|
8002dea: 687b ldr r3, [r7, #4]
|
|
8002dec: 69ba ldr r2, [r7, #24]
|
|
8002dee: 609a str r2, [r3, #8]
|
|
|
|
/* Configure the IO Output Type */
|
|
temp = GPIOx->OTYPER;
|
|
8002df0: 687b ldr r3, [r7, #4]
|
|
8002df2: 685b ldr r3, [r3, #4]
|
|
8002df4: 61bb str r3, [r7, #24]
|
|
temp &= ~(GPIO_OTYPER_OT0 << position) ;
|
|
8002df6: 2201 movs r2, #1
|
|
8002df8: 69fb ldr r3, [r7, #28]
|
|
8002dfa: fa02 f303 lsl.w r3, r2, r3
|
|
8002dfe: 43db mvns r3, r3
|
|
8002e00: 69ba ldr r2, [r7, #24]
|
|
8002e02: 4013 ands r3, r2
|
|
8002e04: 61bb str r3, [r7, #24]
|
|
temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position);
|
|
8002e06: 683b ldr r3, [r7, #0]
|
|
8002e08: 685b ldr r3, [r3, #4]
|
|
8002e0a: 091b lsrs r3, r3, #4
|
|
8002e0c: f003 0201 and.w r2, r3, #1
|
|
8002e10: 69fb ldr r3, [r7, #28]
|
|
8002e12: fa02 f303 lsl.w r3, r2, r3
|
|
8002e16: 69ba ldr r2, [r7, #24]
|
|
8002e18: 4313 orrs r3, r2
|
|
8002e1a: 61bb str r3, [r7, #24]
|
|
GPIOx->OTYPER = temp;
|
|
8002e1c: 687b ldr r3, [r7, #4]
|
|
8002e1e: 69ba ldr r2, [r7, #24]
|
|
8002e20: 605a str r2, [r3, #4]
|
|
}
|
|
|
|
if ((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG)
|
|
8002e22: 683b ldr r3, [r7, #0]
|
|
8002e24: 685b ldr r3, [r3, #4]
|
|
8002e26: f003 0303 and.w r3, r3, #3
|
|
8002e2a: 2b03 cmp r3, #3
|
|
8002e2c: d017 beq.n 8002e5e <HAL_GPIO_Init+0xe2>
|
|
{
|
|
/* Check the Pull parameter */
|
|
assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
|
|
|
|
/* Activate the Pull-up or Pull down resistor for the current IO */
|
|
temp = GPIOx->PUPDR;
|
|
8002e2e: 687b ldr r3, [r7, #4]
|
|
8002e30: 68db ldr r3, [r3, #12]
|
|
8002e32: 61bb str r3, [r7, #24]
|
|
temp &= ~(GPIO_PUPDR_PUPD0 << (position * 2U));
|
|
8002e34: 69fb ldr r3, [r7, #28]
|
|
8002e36: 005b lsls r3, r3, #1
|
|
8002e38: 2203 movs r2, #3
|
|
8002e3a: fa02 f303 lsl.w r3, r2, r3
|
|
8002e3e: 43db mvns r3, r3
|
|
8002e40: 69ba ldr r2, [r7, #24]
|
|
8002e42: 4013 ands r3, r2
|
|
8002e44: 61bb str r3, [r7, #24]
|
|
temp |= ((GPIO_Init->Pull) << (position * 2U));
|
|
8002e46: 683b ldr r3, [r7, #0]
|
|
8002e48: 689a ldr r2, [r3, #8]
|
|
8002e4a: 69fb ldr r3, [r7, #28]
|
|
8002e4c: 005b lsls r3, r3, #1
|
|
8002e4e: fa02 f303 lsl.w r3, r2, r3
|
|
8002e52: 69ba ldr r2, [r7, #24]
|
|
8002e54: 4313 orrs r3, r2
|
|
8002e56: 61bb str r3, [r7, #24]
|
|
GPIOx->PUPDR = temp;
|
|
8002e58: 687b ldr r3, [r7, #4]
|
|
8002e5a: 69ba ldr r2, [r7, #24]
|
|
8002e5c: 60da str r2, [r3, #12]
|
|
}
|
|
|
|
/* In case of Alternate function mode selection */
|
|
if ((GPIO_Init->Mode & GPIO_MODE) == MODE_AF)
|
|
8002e5e: 683b ldr r3, [r7, #0]
|
|
8002e60: 685b ldr r3, [r3, #4]
|
|
8002e62: f003 0303 and.w r3, r3, #3
|
|
8002e66: 2b02 cmp r3, #2
|
|
8002e68: d123 bne.n 8002eb2 <HAL_GPIO_Init+0x136>
|
|
/* Check the Alternate function parameters */
|
|
assert_param(IS_GPIO_AF_INSTANCE(GPIOx));
|
|
assert_param(IS_GPIO_AF(GPIO_Init->Alternate));
|
|
|
|
/* Configure Alternate function mapped with the current IO */
|
|
temp = GPIOx->AFR[position >> 3U];
|
|
8002e6a: 69fb ldr r3, [r7, #28]
|
|
8002e6c: 08da lsrs r2, r3, #3
|
|
8002e6e: 687b ldr r3, [r7, #4]
|
|
8002e70: 3208 adds r2, #8
|
|
8002e72: f853 3022 ldr.w r3, [r3, r2, lsl #2]
|
|
8002e76: 61bb str r3, [r7, #24]
|
|
temp &= ~(0xFU << ((position & 0x07U) * 4U));
|
|
8002e78: 69fb ldr r3, [r7, #28]
|
|
8002e7a: f003 0307 and.w r3, r3, #7
|
|
8002e7e: 009b lsls r3, r3, #2
|
|
8002e80: 220f movs r2, #15
|
|
8002e82: fa02 f303 lsl.w r3, r2, r3
|
|
8002e86: 43db mvns r3, r3
|
|
8002e88: 69ba ldr r2, [r7, #24]
|
|
8002e8a: 4013 ands r3, r2
|
|
8002e8c: 61bb str r3, [r7, #24]
|
|
temp |= ((GPIO_Init->Alternate) << ((position & 0x07U) * 4U));
|
|
8002e8e: 683b ldr r3, [r7, #0]
|
|
8002e90: 691a ldr r2, [r3, #16]
|
|
8002e92: 69fb ldr r3, [r7, #28]
|
|
8002e94: f003 0307 and.w r3, r3, #7
|
|
8002e98: 009b lsls r3, r3, #2
|
|
8002e9a: fa02 f303 lsl.w r3, r2, r3
|
|
8002e9e: 69ba ldr r2, [r7, #24]
|
|
8002ea0: 4313 orrs r3, r2
|
|
8002ea2: 61bb str r3, [r7, #24]
|
|
GPIOx->AFR[position >> 3U] = temp;
|
|
8002ea4: 69fb ldr r3, [r7, #28]
|
|
8002ea6: 08da lsrs r2, r3, #3
|
|
8002ea8: 687b ldr r3, [r7, #4]
|
|
8002eaa: 3208 adds r2, #8
|
|
8002eac: 69b9 ldr r1, [r7, #24]
|
|
8002eae: f843 1022 str.w r1, [r3, r2, lsl #2]
|
|
}
|
|
|
|
/* Configure IO Direction mode (Input, Output, Alternate or Analog) */
|
|
temp = GPIOx->MODER;
|
|
8002eb2: 687b ldr r3, [r7, #4]
|
|
8002eb4: 681b ldr r3, [r3, #0]
|
|
8002eb6: 61bb str r3, [r7, #24]
|
|
temp &= ~(GPIO_MODER_MODE0 << (position * 2U));
|
|
8002eb8: 69fb ldr r3, [r7, #28]
|
|
8002eba: 005b lsls r3, r3, #1
|
|
8002ebc: 2203 movs r2, #3
|
|
8002ebe: fa02 f303 lsl.w r3, r2, r3
|
|
8002ec2: 43db mvns r3, r3
|
|
8002ec4: 69ba ldr r2, [r7, #24]
|
|
8002ec6: 4013 ands r3, r2
|
|
8002ec8: 61bb str r3, [r7, #24]
|
|
temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U));
|
|
8002eca: 683b ldr r3, [r7, #0]
|
|
8002ecc: 685b ldr r3, [r3, #4]
|
|
8002ece: f003 0203 and.w r2, r3, #3
|
|
8002ed2: 69fb ldr r3, [r7, #28]
|
|
8002ed4: 005b lsls r3, r3, #1
|
|
8002ed6: fa02 f303 lsl.w r3, r2, r3
|
|
8002eda: 69ba ldr r2, [r7, #24]
|
|
8002edc: 4313 orrs r3, r2
|
|
8002ede: 61bb str r3, [r7, #24]
|
|
GPIOx->MODER = temp;
|
|
8002ee0: 687b ldr r3, [r7, #4]
|
|
8002ee2: 69ba ldr r2, [r7, #24]
|
|
8002ee4: 601a str r2, [r3, #0]
|
|
|
|
/*--------------------- EXTI Mode Configuration ------------------------*/
|
|
/* Configure the External Interrupt or event for the current IO */
|
|
if ((GPIO_Init->Mode & EXTI_MODE) != 0x00U)
|
|
8002ee6: 683b ldr r3, [r7, #0]
|
|
8002ee8: 685b ldr r3, [r3, #4]
|
|
8002eea: f403 3340 and.w r3, r3, #196608 ; 0x30000
|
|
8002eee: 2b00 cmp r3, #0
|
|
8002ef0: f000 80d8 beq.w 80030a4 <HAL_GPIO_Init+0x328>
|
|
{
|
|
/* Enable SYSCFG Clock */
|
|
__HAL_RCC_SYSCFG_CLK_ENABLE();
|
|
8002ef4: 4b2c ldr r3, [pc, #176] ; (8002fa8 <HAL_GPIO_Init+0x22c>)
|
|
8002ef6: f8d3 30f4 ldr.w r3, [r3, #244] ; 0xf4
|
|
8002efa: 4a2b ldr r2, [pc, #172] ; (8002fa8 <HAL_GPIO_Init+0x22c>)
|
|
8002efc: f043 0302 orr.w r3, r3, #2
|
|
8002f00: f8c2 30f4 str.w r3, [r2, #244] ; 0xf4
|
|
8002f04: 4b28 ldr r3, [pc, #160] ; (8002fa8 <HAL_GPIO_Init+0x22c>)
|
|
8002f06: f8d3 30f4 ldr.w r3, [r3, #244] ; 0xf4
|
|
8002f0a: f003 0302 and.w r3, r3, #2
|
|
8002f0e: 60fb str r3, [r7, #12]
|
|
8002f10: 68fb ldr r3, [r7, #12]
|
|
|
|
temp = SYSCFG->EXTICR[position >> 2U];
|
|
8002f12: 4a26 ldr r2, [pc, #152] ; (8002fac <HAL_GPIO_Init+0x230>)
|
|
8002f14: 69fb ldr r3, [r7, #28]
|
|
8002f16: 089b lsrs r3, r3, #2
|
|
8002f18: 3302 adds r3, #2
|
|
8002f1a: f852 3023 ldr.w r3, [r2, r3, lsl #2]
|
|
8002f1e: 61bb str r3, [r7, #24]
|
|
temp &= ~(0x0FUL << (4U * (position & 0x03U)));
|
|
8002f20: 69fb ldr r3, [r7, #28]
|
|
8002f22: f003 0303 and.w r3, r3, #3
|
|
8002f26: 009b lsls r3, r3, #2
|
|
8002f28: 220f movs r2, #15
|
|
8002f2a: fa02 f303 lsl.w r3, r2, r3
|
|
8002f2e: 43db mvns r3, r3
|
|
8002f30: 69ba ldr r2, [r7, #24]
|
|
8002f32: 4013 ands r3, r2
|
|
8002f34: 61bb str r3, [r7, #24]
|
|
temp |= (GPIO_GET_INDEX(GPIOx) << (4U * (position & 0x03U)));
|
|
8002f36: 687b ldr r3, [r7, #4]
|
|
8002f38: 4a1d ldr r2, [pc, #116] ; (8002fb0 <HAL_GPIO_Init+0x234>)
|
|
8002f3a: 4293 cmp r3, r2
|
|
8002f3c: d04a beq.n 8002fd4 <HAL_GPIO_Init+0x258>
|
|
8002f3e: 687b ldr r3, [r7, #4]
|
|
8002f40: 4a1c ldr r2, [pc, #112] ; (8002fb4 <HAL_GPIO_Init+0x238>)
|
|
8002f42: 4293 cmp r3, r2
|
|
8002f44: d02b beq.n 8002f9e <HAL_GPIO_Init+0x222>
|
|
8002f46: 687b ldr r3, [r7, #4]
|
|
8002f48: 4a1b ldr r2, [pc, #108] ; (8002fb8 <HAL_GPIO_Init+0x23c>)
|
|
8002f4a: 4293 cmp r3, r2
|
|
8002f4c: d025 beq.n 8002f9a <HAL_GPIO_Init+0x21e>
|
|
8002f4e: 687b ldr r3, [r7, #4]
|
|
8002f50: 4a1a ldr r2, [pc, #104] ; (8002fbc <HAL_GPIO_Init+0x240>)
|
|
8002f52: 4293 cmp r3, r2
|
|
8002f54: d01f beq.n 8002f96 <HAL_GPIO_Init+0x21a>
|
|
8002f56: 687b ldr r3, [r7, #4]
|
|
8002f58: 4a19 ldr r2, [pc, #100] ; (8002fc0 <HAL_GPIO_Init+0x244>)
|
|
8002f5a: 4293 cmp r3, r2
|
|
8002f5c: d019 beq.n 8002f92 <HAL_GPIO_Init+0x216>
|
|
8002f5e: 687b ldr r3, [r7, #4]
|
|
8002f60: 4a18 ldr r2, [pc, #96] ; (8002fc4 <HAL_GPIO_Init+0x248>)
|
|
8002f62: 4293 cmp r3, r2
|
|
8002f64: d013 beq.n 8002f8e <HAL_GPIO_Init+0x212>
|
|
8002f66: 687b ldr r3, [r7, #4]
|
|
8002f68: 4a17 ldr r2, [pc, #92] ; (8002fc8 <HAL_GPIO_Init+0x24c>)
|
|
8002f6a: 4293 cmp r3, r2
|
|
8002f6c: d00d beq.n 8002f8a <HAL_GPIO_Init+0x20e>
|
|
8002f6e: 687b ldr r3, [r7, #4]
|
|
8002f70: 4a16 ldr r2, [pc, #88] ; (8002fcc <HAL_GPIO_Init+0x250>)
|
|
8002f72: 4293 cmp r3, r2
|
|
8002f74: d007 beq.n 8002f86 <HAL_GPIO_Init+0x20a>
|
|
8002f76: 687b ldr r3, [r7, #4]
|
|
8002f78: 4a15 ldr r2, [pc, #84] ; (8002fd0 <HAL_GPIO_Init+0x254>)
|
|
8002f7a: 4293 cmp r3, r2
|
|
8002f7c: d101 bne.n 8002f82 <HAL_GPIO_Init+0x206>
|
|
8002f7e: 2309 movs r3, #9
|
|
8002f80: e029 b.n 8002fd6 <HAL_GPIO_Init+0x25a>
|
|
8002f82: 230a movs r3, #10
|
|
8002f84: e027 b.n 8002fd6 <HAL_GPIO_Init+0x25a>
|
|
8002f86: 2307 movs r3, #7
|
|
8002f88: e025 b.n 8002fd6 <HAL_GPIO_Init+0x25a>
|
|
8002f8a: 2306 movs r3, #6
|
|
8002f8c: e023 b.n 8002fd6 <HAL_GPIO_Init+0x25a>
|
|
8002f8e: 2305 movs r3, #5
|
|
8002f90: e021 b.n 8002fd6 <HAL_GPIO_Init+0x25a>
|
|
8002f92: 2304 movs r3, #4
|
|
8002f94: e01f b.n 8002fd6 <HAL_GPIO_Init+0x25a>
|
|
8002f96: 2303 movs r3, #3
|
|
8002f98: e01d b.n 8002fd6 <HAL_GPIO_Init+0x25a>
|
|
8002f9a: 2302 movs r3, #2
|
|
8002f9c: e01b b.n 8002fd6 <HAL_GPIO_Init+0x25a>
|
|
8002f9e: 2301 movs r3, #1
|
|
8002fa0: e019 b.n 8002fd6 <HAL_GPIO_Init+0x25a>
|
|
8002fa2: bf00 nop
|
|
8002fa4: 58000080 .word 0x58000080
|
|
8002fa8: 58024400 .word 0x58024400
|
|
8002fac: 58000400 .word 0x58000400
|
|
8002fb0: 58020000 .word 0x58020000
|
|
8002fb4: 58020400 .word 0x58020400
|
|
8002fb8: 58020800 .word 0x58020800
|
|
8002fbc: 58020c00 .word 0x58020c00
|
|
8002fc0: 58021000 .word 0x58021000
|
|
8002fc4: 58021400 .word 0x58021400
|
|
8002fc8: 58021800 .word 0x58021800
|
|
8002fcc: 58021c00 .word 0x58021c00
|
|
8002fd0: 58022400 .word 0x58022400
|
|
8002fd4: 2300 movs r3, #0
|
|
8002fd6: 69fa ldr r2, [r7, #28]
|
|
8002fd8: f002 0203 and.w r2, r2, #3
|
|
8002fdc: 0092 lsls r2, r2, #2
|
|
8002fde: 4093 lsls r3, r2
|
|
8002fe0: 69ba ldr r2, [r7, #24]
|
|
8002fe2: 4313 orrs r3, r2
|
|
8002fe4: 61bb str r3, [r7, #24]
|
|
SYSCFG->EXTICR[position >> 2U] = temp;
|
|
8002fe6: 4938 ldr r1, [pc, #224] ; (80030c8 <HAL_GPIO_Init+0x34c>)
|
|
8002fe8: 69fb ldr r3, [r7, #28]
|
|
8002fea: 089b lsrs r3, r3, #2
|
|
8002fec: 3302 adds r3, #2
|
|
8002fee: 69ba ldr r2, [r7, #24]
|
|
8002ff0: f841 2023 str.w r2, [r1, r3, lsl #2]
|
|
|
|
/* Clear Rising Falling edge configuration */
|
|
temp = EXTI->RTSR1;
|
|
8002ff4: f04f 43b0 mov.w r3, #1476395008 ; 0x58000000
|
|
8002ff8: 681b ldr r3, [r3, #0]
|
|
8002ffa: 61bb str r3, [r7, #24]
|
|
temp &= ~(iocurrent);
|
|
8002ffc: 693b ldr r3, [r7, #16]
|
|
8002ffe: 43db mvns r3, r3
|
|
8003000: 69ba ldr r2, [r7, #24]
|
|
8003002: 4013 ands r3, r2
|
|
8003004: 61bb str r3, [r7, #24]
|
|
if ((GPIO_Init->Mode & TRIGGER_RISING) != 0x00U)
|
|
8003006: 683b ldr r3, [r7, #0]
|
|
8003008: 685b ldr r3, [r3, #4]
|
|
800300a: f403 1380 and.w r3, r3, #1048576 ; 0x100000
|
|
800300e: 2b00 cmp r3, #0
|
|
8003010: d003 beq.n 800301a <HAL_GPIO_Init+0x29e>
|
|
{
|
|
temp |= iocurrent;
|
|
8003012: 69ba ldr r2, [r7, #24]
|
|
8003014: 693b ldr r3, [r7, #16]
|
|
8003016: 4313 orrs r3, r2
|
|
8003018: 61bb str r3, [r7, #24]
|
|
}
|
|
EXTI->RTSR1 = temp;
|
|
800301a: f04f 42b0 mov.w r2, #1476395008 ; 0x58000000
|
|
800301e: 69bb ldr r3, [r7, #24]
|
|
8003020: 6013 str r3, [r2, #0]
|
|
|
|
temp = EXTI->FTSR1;
|
|
8003022: f04f 43b0 mov.w r3, #1476395008 ; 0x58000000
|
|
8003026: 685b ldr r3, [r3, #4]
|
|
8003028: 61bb str r3, [r7, #24]
|
|
temp &= ~(iocurrent);
|
|
800302a: 693b ldr r3, [r7, #16]
|
|
800302c: 43db mvns r3, r3
|
|
800302e: 69ba ldr r2, [r7, #24]
|
|
8003030: 4013 ands r3, r2
|
|
8003032: 61bb str r3, [r7, #24]
|
|
if ((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00U)
|
|
8003034: 683b ldr r3, [r7, #0]
|
|
8003036: 685b ldr r3, [r3, #4]
|
|
8003038: f403 1300 and.w r3, r3, #2097152 ; 0x200000
|
|
800303c: 2b00 cmp r3, #0
|
|
800303e: d003 beq.n 8003048 <HAL_GPIO_Init+0x2cc>
|
|
{
|
|
temp |= iocurrent;
|
|
8003040: 69ba ldr r2, [r7, #24]
|
|
8003042: 693b ldr r3, [r7, #16]
|
|
8003044: 4313 orrs r3, r2
|
|
8003046: 61bb str r3, [r7, #24]
|
|
}
|
|
EXTI->FTSR1 = temp;
|
|
8003048: f04f 42b0 mov.w r2, #1476395008 ; 0x58000000
|
|
800304c: 69bb ldr r3, [r7, #24]
|
|
800304e: 6053 str r3, [r2, #4]
|
|
|
|
temp = EXTI_CurrentCPU->EMR1;
|
|
8003050: 697b ldr r3, [r7, #20]
|
|
8003052: 685b ldr r3, [r3, #4]
|
|
8003054: 61bb str r3, [r7, #24]
|
|
temp &= ~(iocurrent);
|
|
8003056: 693b ldr r3, [r7, #16]
|
|
8003058: 43db mvns r3, r3
|
|
800305a: 69ba ldr r2, [r7, #24]
|
|
800305c: 4013 ands r3, r2
|
|
800305e: 61bb str r3, [r7, #24]
|
|
if ((GPIO_Init->Mode & EXTI_EVT) != 0x00U)
|
|
8003060: 683b ldr r3, [r7, #0]
|
|
8003062: 685b ldr r3, [r3, #4]
|
|
8003064: f403 3300 and.w r3, r3, #131072 ; 0x20000
|
|
8003068: 2b00 cmp r3, #0
|
|
800306a: d003 beq.n 8003074 <HAL_GPIO_Init+0x2f8>
|
|
{
|
|
temp |= iocurrent;
|
|
800306c: 69ba ldr r2, [r7, #24]
|
|
800306e: 693b ldr r3, [r7, #16]
|
|
8003070: 4313 orrs r3, r2
|
|
8003072: 61bb str r3, [r7, #24]
|
|
}
|
|
EXTI_CurrentCPU->EMR1 = temp;
|
|
8003074: 697b ldr r3, [r7, #20]
|
|
8003076: 69ba ldr r2, [r7, #24]
|
|
8003078: 605a str r2, [r3, #4]
|
|
|
|
/* Clear EXTI line configuration */
|
|
temp = EXTI_CurrentCPU->IMR1;
|
|
800307a: 697b ldr r3, [r7, #20]
|
|
800307c: 681b ldr r3, [r3, #0]
|
|
800307e: 61bb str r3, [r7, #24]
|
|
temp &= ~(iocurrent);
|
|
8003080: 693b ldr r3, [r7, #16]
|
|
8003082: 43db mvns r3, r3
|
|
8003084: 69ba ldr r2, [r7, #24]
|
|
8003086: 4013 ands r3, r2
|
|
8003088: 61bb str r3, [r7, #24]
|
|
if ((GPIO_Init->Mode & EXTI_IT) != 0x00U)
|
|
800308a: 683b ldr r3, [r7, #0]
|
|
800308c: 685b ldr r3, [r3, #4]
|
|
800308e: f403 3380 and.w r3, r3, #65536 ; 0x10000
|
|
8003092: 2b00 cmp r3, #0
|
|
8003094: d003 beq.n 800309e <HAL_GPIO_Init+0x322>
|
|
{
|
|
temp |= iocurrent;
|
|
8003096: 69ba ldr r2, [r7, #24]
|
|
8003098: 693b ldr r3, [r7, #16]
|
|
800309a: 4313 orrs r3, r2
|
|
800309c: 61bb str r3, [r7, #24]
|
|
}
|
|
EXTI_CurrentCPU->IMR1 = temp;
|
|
800309e: 697b ldr r3, [r7, #20]
|
|
80030a0: 69ba ldr r2, [r7, #24]
|
|
80030a2: 601a str r2, [r3, #0]
|
|
}
|
|
}
|
|
|
|
position++;
|
|
80030a4: 69fb ldr r3, [r7, #28]
|
|
80030a6: 3301 adds r3, #1
|
|
80030a8: 61fb str r3, [r7, #28]
|
|
while (((GPIO_Init->Pin) >> position) != 0x00U)
|
|
80030aa: 683b ldr r3, [r7, #0]
|
|
80030ac: 681a ldr r2, [r3, #0]
|
|
80030ae: 69fb ldr r3, [r7, #28]
|
|
80030b0: fa22 f303 lsr.w r3, r2, r3
|
|
80030b4: 2b00 cmp r3, #0
|
|
80030b6: f47f ae6b bne.w 8002d90 <HAL_GPIO_Init+0x14>
|
|
}
|
|
}
|
|
80030ba: bf00 nop
|
|
80030bc: bf00 nop
|
|
80030be: 3724 adds r7, #36 ; 0x24
|
|
80030c0: 46bd mov sp, r7
|
|
80030c2: f85d 7b04 ldr.w r7, [sp], #4
|
|
80030c6: 4770 bx lr
|
|
80030c8: 58000400 .word 0x58000400
|
|
|
|
080030cc <HAL_PWREx_ConfigSupply>:
|
|
* PWR_SMPS_2V5_SUPPLIES_EXT are used only for lines that supports SMPS
|
|
* regulator.
|
|
* @retval HAL status.
|
|
*/
|
|
HAL_StatusTypeDef HAL_PWREx_ConfigSupply (uint32_t SupplySource)
|
|
{
|
|
80030cc: b580 push {r7, lr}
|
|
80030ce: b084 sub sp, #16
|
|
80030d0: af00 add r7, sp, #0
|
|
80030d2: 6078 str r0, [r7, #4]
|
|
/* Check the parameters */
|
|
assert_param (IS_PWR_SUPPLY (SupplySource));
|
|
|
|
/* Check if supply source was configured */
|
|
#if defined (PWR_FLAG_SCUEN)
|
|
if (__HAL_PWR_GET_FLAG (PWR_FLAG_SCUEN) == 0U)
|
|
80030d4: 4b19 ldr r3, [pc, #100] ; (800313c <HAL_PWREx_ConfigSupply+0x70>)
|
|
80030d6: 68db ldr r3, [r3, #12]
|
|
80030d8: f003 0304 and.w r3, r3, #4
|
|
80030dc: 2b04 cmp r3, #4
|
|
80030de: d00a beq.n 80030f6 <HAL_PWREx_ConfigSupply+0x2a>
|
|
#else
|
|
if ((PWR->CR3 & (PWR_CR3_SMPSEN | PWR_CR3_LDOEN | PWR_CR3_BYPASS)) != (PWR_CR3_SMPSEN | PWR_CR3_LDOEN))
|
|
#endif /* defined (PWR_FLAG_SCUEN) */
|
|
{
|
|
/* Check supply configuration */
|
|
if ((PWR->CR3 & PWR_SUPPLY_CONFIG_MASK) != SupplySource)
|
|
80030e0: 4b16 ldr r3, [pc, #88] ; (800313c <HAL_PWREx_ConfigSupply+0x70>)
|
|
80030e2: 68db ldr r3, [r3, #12]
|
|
80030e4: f003 0307 and.w r3, r3, #7
|
|
80030e8: 687a ldr r2, [r7, #4]
|
|
80030ea: 429a cmp r2, r3
|
|
80030ec: d001 beq.n 80030f2 <HAL_PWREx_ConfigSupply+0x26>
|
|
{
|
|
/* Supply configuration update locked, can't apply a new supply config */
|
|
return HAL_ERROR;
|
|
80030ee: 2301 movs r3, #1
|
|
80030f0: e01f b.n 8003132 <HAL_PWREx_ConfigSupply+0x66>
|
|
else
|
|
{
|
|
/* Supply configuration update locked, but new supply configuration
|
|
matches with old supply configuration : nothing to do
|
|
*/
|
|
return HAL_OK;
|
|
80030f2: 2300 movs r3, #0
|
|
80030f4: e01d b.n 8003132 <HAL_PWREx_ConfigSupply+0x66>
|
|
}
|
|
}
|
|
|
|
/* Set the power supply configuration */
|
|
MODIFY_REG (PWR->CR3, PWR_SUPPLY_CONFIG_MASK, SupplySource);
|
|
80030f6: 4b11 ldr r3, [pc, #68] ; (800313c <HAL_PWREx_ConfigSupply+0x70>)
|
|
80030f8: 68db ldr r3, [r3, #12]
|
|
80030fa: f023 0207 bic.w r2, r3, #7
|
|
80030fe: 490f ldr r1, [pc, #60] ; (800313c <HAL_PWREx_ConfigSupply+0x70>)
|
|
8003100: 687b ldr r3, [r7, #4]
|
|
8003102: 4313 orrs r3, r2
|
|
8003104: 60cb str r3, [r1, #12]
|
|
|
|
/* Get tick */
|
|
tickstart = HAL_GetTick ();
|
|
8003106: f7fd ff81 bl 800100c <HAL_GetTick>
|
|
800310a: 60f8 str r0, [r7, #12]
|
|
|
|
/* Wait till voltage level flag is set */
|
|
while (__HAL_PWR_GET_FLAG (PWR_FLAG_ACTVOSRDY) == 0U)
|
|
800310c: e009 b.n 8003122 <HAL_PWREx_ConfigSupply+0x56>
|
|
{
|
|
if ((HAL_GetTick () - tickstart) > PWR_FLAG_SETTING_DELAY)
|
|
800310e: f7fd ff7d bl 800100c <HAL_GetTick>
|
|
8003112: 4602 mov r2, r0
|
|
8003114: 68fb ldr r3, [r7, #12]
|
|
8003116: 1ad3 subs r3, r2, r3
|
|
8003118: f5b3 7f7a cmp.w r3, #1000 ; 0x3e8
|
|
800311c: d901 bls.n 8003122 <HAL_PWREx_ConfigSupply+0x56>
|
|
{
|
|
return HAL_ERROR;
|
|
800311e: 2301 movs r3, #1
|
|
8003120: e007 b.n 8003132 <HAL_PWREx_ConfigSupply+0x66>
|
|
while (__HAL_PWR_GET_FLAG (PWR_FLAG_ACTVOSRDY) == 0U)
|
|
8003122: 4b06 ldr r3, [pc, #24] ; (800313c <HAL_PWREx_ConfigSupply+0x70>)
|
|
8003124: 685b ldr r3, [r3, #4]
|
|
8003126: f403 5300 and.w r3, r3, #8192 ; 0x2000
|
|
800312a: f5b3 5f00 cmp.w r3, #8192 ; 0x2000
|
|
800312e: d1ee bne.n 800310e <HAL_PWREx_ConfigSupply+0x42>
|
|
}
|
|
}
|
|
}
|
|
#endif /* defined (SMPS) */
|
|
|
|
return HAL_OK;
|
|
8003130: 2300 movs r3, #0
|
|
}
|
|
8003132: 4618 mov r0, r3
|
|
8003134: 3710 adds r7, #16
|
|
8003136: 46bd mov sp, r7
|
|
8003138: bd80 pop {r7, pc}
|
|
800313a: bf00 nop
|
|
800313c: 58024800 .word 0x58024800
|
|
|
|
08003140 <HAL_RCC_OscConfig>:
|
|
* supported by this function. User should request a transition to HSE Off
|
|
* first and then HSE On or HSE Bypass.
|
|
* @retval HAL status
|
|
*/
|
|
__weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
|
|
{
|
|
8003140: b580 push {r7, lr}
|
|
8003142: b08c sub sp, #48 ; 0x30
|
|
8003144: af00 add r7, sp, #0
|
|
8003146: 6078 str r0, [r7, #4]
|
|
uint32_t tickstart;
|
|
uint32_t temp1_pllckcfg, temp2_pllckcfg;
|
|
|
|
/* Check Null pointer */
|
|
if (RCC_OscInitStruct == NULL)
|
|
8003148: 687b ldr r3, [r7, #4]
|
|
800314a: 2b00 cmp r3, #0
|
|
800314c: d101 bne.n 8003152 <HAL_RCC_OscConfig+0x12>
|
|
{
|
|
return HAL_ERROR;
|
|
800314e: 2301 movs r3, #1
|
|
8003150: e3c8 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
}
|
|
|
|
/* Check the parameters */
|
|
assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType));
|
|
/*------------------------------- HSE Configuration ------------------------*/
|
|
if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE)
|
|
8003152: 687b ldr r3, [r7, #4]
|
|
8003154: 681b ldr r3, [r3, #0]
|
|
8003156: f003 0301 and.w r3, r3, #1
|
|
800315a: 2b00 cmp r3, #0
|
|
800315c: f000 8087 beq.w 800326e <HAL_RCC_OscConfig+0x12e>
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState));
|
|
|
|
const uint32_t temp_sysclksrc = __HAL_RCC_GET_SYSCLK_SOURCE();
|
|
8003160: 4b88 ldr r3, [pc, #544] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003162: 691b ldr r3, [r3, #16]
|
|
8003164: f003 0338 and.w r3, r3, #56 ; 0x38
|
|
8003168: 62fb str r3, [r7, #44] ; 0x2c
|
|
const uint32_t temp_pllckselr = RCC->PLLCKSELR;
|
|
800316a: 4b86 ldr r3, [pc, #536] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
800316c: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
800316e: 62bb str r3, [r7, #40] ; 0x28
|
|
/* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */
|
|
if ((temp_sysclksrc == RCC_CFGR_SWS_HSE) || ((temp_sysclksrc == RCC_CFGR_SWS_PLL1) && ((temp_pllckselr & RCC_PLLCKSELR_PLLSRC) == RCC_PLLCKSELR_PLLSRC_HSE)))
|
|
8003170: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8003172: 2b10 cmp r3, #16
|
|
8003174: d007 beq.n 8003186 <HAL_RCC_OscConfig+0x46>
|
|
8003176: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8003178: 2b18 cmp r3, #24
|
|
800317a: d110 bne.n 800319e <HAL_RCC_OscConfig+0x5e>
|
|
800317c: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800317e: f003 0303 and.w r3, r3, #3
|
|
8003182: 2b02 cmp r3, #2
|
|
8003184: d10b bne.n 800319e <HAL_RCC_OscConfig+0x5e>
|
|
{
|
|
if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
|
|
8003186: 4b7f ldr r3, [pc, #508] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003188: 681b ldr r3, [r3, #0]
|
|
800318a: f403 3300 and.w r3, r3, #131072 ; 0x20000
|
|
800318e: 2b00 cmp r3, #0
|
|
8003190: d06c beq.n 800326c <HAL_RCC_OscConfig+0x12c>
|
|
8003192: 687b ldr r3, [r7, #4]
|
|
8003194: 685b ldr r3, [r3, #4]
|
|
8003196: 2b00 cmp r3, #0
|
|
8003198: d168 bne.n 800326c <HAL_RCC_OscConfig+0x12c>
|
|
{
|
|
return HAL_ERROR;
|
|
800319a: 2301 movs r3, #1
|
|
800319c: e3a2 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Set the new HSE configuration ---------------------------------------*/
|
|
__HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState);
|
|
800319e: 687b ldr r3, [r7, #4]
|
|
80031a0: 685b ldr r3, [r3, #4]
|
|
80031a2: f5b3 3f80 cmp.w r3, #65536 ; 0x10000
|
|
80031a6: d106 bne.n 80031b6 <HAL_RCC_OscConfig+0x76>
|
|
80031a8: 4b76 ldr r3, [pc, #472] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031aa: 681b ldr r3, [r3, #0]
|
|
80031ac: 4a75 ldr r2, [pc, #468] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031ae: f443 3380 orr.w r3, r3, #65536 ; 0x10000
|
|
80031b2: 6013 str r3, [r2, #0]
|
|
80031b4: e02e b.n 8003214 <HAL_RCC_OscConfig+0xd4>
|
|
80031b6: 687b ldr r3, [r7, #4]
|
|
80031b8: 685b ldr r3, [r3, #4]
|
|
80031ba: 2b00 cmp r3, #0
|
|
80031bc: d10c bne.n 80031d8 <HAL_RCC_OscConfig+0x98>
|
|
80031be: 4b71 ldr r3, [pc, #452] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031c0: 681b ldr r3, [r3, #0]
|
|
80031c2: 4a70 ldr r2, [pc, #448] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031c4: f423 3380 bic.w r3, r3, #65536 ; 0x10000
|
|
80031c8: 6013 str r3, [r2, #0]
|
|
80031ca: 4b6e ldr r3, [pc, #440] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031cc: 681b ldr r3, [r3, #0]
|
|
80031ce: 4a6d ldr r2, [pc, #436] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031d0: f423 2380 bic.w r3, r3, #262144 ; 0x40000
|
|
80031d4: 6013 str r3, [r2, #0]
|
|
80031d6: e01d b.n 8003214 <HAL_RCC_OscConfig+0xd4>
|
|
80031d8: 687b ldr r3, [r7, #4]
|
|
80031da: 685b ldr r3, [r3, #4]
|
|
80031dc: f5b3 2fa0 cmp.w r3, #327680 ; 0x50000
|
|
80031e0: d10c bne.n 80031fc <HAL_RCC_OscConfig+0xbc>
|
|
80031e2: 4b68 ldr r3, [pc, #416] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031e4: 681b ldr r3, [r3, #0]
|
|
80031e6: 4a67 ldr r2, [pc, #412] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031e8: f443 2380 orr.w r3, r3, #262144 ; 0x40000
|
|
80031ec: 6013 str r3, [r2, #0]
|
|
80031ee: 4b65 ldr r3, [pc, #404] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031f0: 681b ldr r3, [r3, #0]
|
|
80031f2: 4a64 ldr r2, [pc, #400] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031f4: f443 3380 orr.w r3, r3, #65536 ; 0x10000
|
|
80031f8: 6013 str r3, [r2, #0]
|
|
80031fa: e00b b.n 8003214 <HAL_RCC_OscConfig+0xd4>
|
|
80031fc: 4b61 ldr r3, [pc, #388] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80031fe: 681b ldr r3, [r3, #0]
|
|
8003200: 4a60 ldr r2, [pc, #384] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003202: f423 3380 bic.w r3, r3, #65536 ; 0x10000
|
|
8003206: 6013 str r3, [r2, #0]
|
|
8003208: 4b5e ldr r3, [pc, #376] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
800320a: 681b ldr r3, [r3, #0]
|
|
800320c: 4a5d ldr r2, [pc, #372] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
800320e: f423 2380 bic.w r3, r3, #262144 ; 0x40000
|
|
8003212: 6013 str r3, [r2, #0]
|
|
|
|
/* Check the HSE State */
|
|
if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF)
|
|
8003214: 687b ldr r3, [r7, #4]
|
|
8003216: 685b ldr r3, [r3, #4]
|
|
8003218: 2b00 cmp r3, #0
|
|
800321a: d013 beq.n 8003244 <HAL_RCC_OscConfig+0x104>
|
|
{
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
800321c: f7fd fef6 bl 800100c <HAL_GetTick>
|
|
8003220: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till HSE is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == 0U)
|
|
8003222: e008 b.n 8003236 <HAL_RCC_OscConfig+0xf6>
|
|
{
|
|
if ((uint32_t)(HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
|
|
8003224: f7fd fef2 bl 800100c <HAL_GetTick>
|
|
8003228: 4602 mov r2, r0
|
|
800322a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800322c: 1ad3 subs r3, r2, r3
|
|
800322e: 2b64 cmp r3, #100 ; 0x64
|
|
8003230: d901 bls.n 8003236 <HAL_RCC_OscConfig+0xf6>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
8003232: 2303 movs r3, #3
|
|
8003234: e356 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == 0U)
|
|
8003236: 4b53 ldr r3, [pc, #332] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003238: 681b ldr r3, [r3, #0]
|
|
800323a: f403 3300 and.w r3, r3, #131072 ; 0x20000
|
|
800323e: 2b00 cmp r3, #0
|
|
8003240: d0f0 beq.n 8003224 <HAL_RCC_OscConfig+0xe4>
|
|
8003242: e014 b.n 800326e <HAL_RCC_OscConfig+0x12e>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
8003244: f7fd fee2 bl 800100c <HAL_GetTick>
|
|
8003248: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till HSE is disabled */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U)
|
|
800324a: e008 b.n 800325e <HAL_RCC_OscConfig+0x11e>
|
|
{
|
|
if ((uint32_t)(HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
|
|
800324c: f7fd fede bl 800100c <HAL_GetTick>
|
|
8003250: 4602 mov r2, r0
|
|
8003252: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8003254: 1ad3 subs r3, r2, r3
|
|
8003256: 2b64 cmp r3, #100 ; 0x64
|
|
8003258: d901 bls.n 800325e <HAL_RCC_OscConfig+0x11e>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
800325a: 2303 movs r3, #3
|
|
800325c: e342 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U)
|
|
800325e: 4b49 ldr r3, [pc, #292] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003260: 681b ldr r3, [r3, #0]
|
|
8003262: f403 3300 and.w r3, r3, #131072 ; 0x20000
|
|
8003266: 2b00 cmp r3, #0
|
|
8003268: d1f0 bne.n 800324c <HAL_RCC_OscConfig+0x10c>
|
|
800326a: e000 b.n 800326e <HAL_RCC_OscConfig+0x12e>
|
|
if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
|
|
800326c: bf00 nop
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/*----------------------------- HSI Configuration --------------------------*/
|
|
if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI)
|
|
800326e: 687b ldr r3, [r7, #4]
|
|
8003270: 681b ldr r3, [r3, #0]
|
|
8003272: f003 0302 and.w r3, r3, #2
|
|
8003276: 2b00 cmp r3, #0
|
|
8003278: f000 808c beq.w 8003394 <HAL_RCC_OscConfig+0x254>
|
|
/* Check the parameters */
|
|
assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState));
|
|
assert_param(IS_RCC_HSICALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue));
|
|
|
|
/* When the HSI is used as system clock it will not be disabled */
|
|
const uint32_t temp_sysclksrc = __HAL_RCC_GET_SYSCLK_SOURCE();
|
|
800327c: 4b41 ldr r3, [pc, #260] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
800327e: 691b ldr r3, [r3, #16]
|
|
8003280: f003 0338 and.w r3, r3, #56 ; 0x38
|
|
8003284: 623b str r3, [r7, #32]
|
|
const uint32_t temp_pllckselr = RCC->PLLCKSELR;
|
|
8003286: 4b3f ldr r3, [pc, #252] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003288: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
800328a: 61fb str r3, [r7, #28]
|
|
if ((temp_sysclksrc == RCC_CFGR_SWS_HSI) || ((temp_sysclksrc == RCC_CFGR_SWS_PLL1) && ((temp_pllckselr & RCC_PLLCKSELR_PLLSRC) == RCC_PLLCKSELR_PLLSRC_HSI)))
|
|
800328c: 6a3b ldr r3, [r7, #32]
|
|
800328e: 2b00 cmp r3, #0
|
|
8003290: d007 beq.n 80032a2 <HAL_RCC_OscConfig+0x162>
|
|
8003292: 6a3b ldr r3, [r7, #32]
|
|
8003294: 2b18 cmp r3, #24
|
|
8003296: d137 bne.n 8003308 <HAL_RCC_OscConfig+0x1c8>
|
|
8003298: 69fb ldr r3, [r7, #28]
|
|
800329a: f003 0303 and.w r3, r3, #3
|
|
800329e: 2b00 cmp r3, #0
|
|
80032a0: d132 bne.n 8003308 <HAL_RCC_OscConfig+0x1c8>
|
|
{
|
|
/* When HSI is used as system clock it will not be disabled */
|
|
if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U) && (RCC_OscInitStruct->HSIState == RCC_HSI_OFF))
|
|
80032a2: 4b38 ldr r3, [pc, #224] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80032a4: 681b ldr r3, [r3, #0]
|
|
80032a6: f003 0304 and.w r3, r3, #4
|
|
80032aa: 2b00 cmp r3, #0
|
|
80032ac: d005 beq.n 80032ba <HAL_RCC_OscConfig+0x17a>
|
|
80032ae: 687b ldr r3, [r7, #4]
|
|
80032b0: 68db ldr r3, [r3, #12]
|
|
80032b2: 2b00 cmp r3, #0
|
|
80032b4: d101 bne.n 80032ba <HAL_RCC_OscConfig+0x17a>
|
|
{
|
|
return HAL_ERROR;
|
|
80032b6: 2301 movs r3, #1
|
|
80032b8: e314 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
}
|
|
/* Otherwise, only HSI division and calibration are allowed */
|
|
else
|
|
{
|
|
/* Enable the Internal High Speed oscillator (HSI, HSIDIV2, HSIDIV4, or HSIDIV8) */
|
|
__HAL_RCC_HSI_CONFIG(RCC_OscInitStruct->HSIState);
|
|
80032ba: 4b32 ldr r3, [pc, #200] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80032bc: 681b ldr r3, [r3, #0]
|
|
80032be: f023 0219 bic.w r2, r3, #25
|
|
80032c2: 687b ldr r3, [r7, #4]
|
|
80032c4: 68db ldr r3, [r3, #12]
|
|
80032c6: 492f ldr r1, [pc, #188] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80032c8: 4313 orrs r3, r2
|
|
80032ca: 600b str r3, [r1, #0]
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
80032cc: f7fd fe9e bl 800100c <HAL_GetTick>
|
|
80032d0: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till HSI is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
|
|
80032d2: e008 b.n 80032e6 <HAL_RCC_OscConfig+0x1a6>
|
|
{
|
|
if ((uint32_t)(HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
|
|
80032d4: f7fd fe9a bl 800100c <HAL_GetTick>
|
|
80032d8: 4602 mov r2, r0
|
|
80032da: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80032dc: 1ad3 subs r3, r2, r3
|
|
80032de: 2b02 cmp r3, #2
|
|
80032e0: d901 bls.n 80032e6 <HAL_RCC_OscConfig+0x1a6>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
80032e2: 2303 movs r3, #3
|
|
80032e4: e2fe b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
|
|
80032e6: 4b27 ldr r3, [pc, #156] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80032e8: 681b ldr r3, [r3, #0]
|
|
80032ea: f003 0304 and.w r3, r3, #4
|
|
80032ee: 2b00 cmp r3, #0
|
|
80032f0: d0f0 beq.n 80032d4 <HAL_RCC_OscConfig+0x194>
|
|
}
|
|
}
|
|
/* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
|
|
__HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
|
|
80032f2: 4b24 ldr r3, [pc, #144] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
80032f4: 685b ldr r3, [r3, #4]
|
|
80032f6: f023 42fe bic.w r2, r3, #2130706432 ; 0x7f000000
|
|
80032fa: 687b ldr r3, [r7, #4]
|
|
80032fc: 691b ldr r3, [r3, #16]
|
|
80032fe: 061b lsls r3, r3, #24
|
|
8003300: 4920 ldr r1, [pc, #128] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003302: 4313 orrs r3, r2
|
|
8003304: 604b str r3, [r1, #4]
|
|
if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U) && (RCC_OscInitStruct->HSIState == RCC_HSI_OFF))
|
|
8003306: e045 b.n 8003394 <HAL_RCC_OscConfig+0x254>
|
|
}
|
|
|
|
else
|
|
{
|
|
/* Check the HSI State */
|
|
if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF)
|
|
8003308: 687b ldr r3, [r7, #4]
|
|
800330a: 68db ldr r3, [r3, #12]
|
|
800330c: 2b00 cmp r3, #0
|
|
800330e: d026 beq.n 800335e <HAL_RCC_OscConfig+0x21e>
|
|
{
|
|
/* Enable the Internal High Speed oscillator (HSI, HSIDIV2,HSIDIV4, or HSIDIV8) */
|
|
__HAL_RCC_HSI_CONFIG(RCC_OscInitStruct->HSIState);
|
|
8003310: 4b1c ldr r3, [pc, #112] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003312: 681b ldr r3, [r3, #0]
|
|
8003314: f023 0219 bic.w r2, r3, #25
|
|
8003318: 687b ldr r3, [r7, #4]
|
|
800331a: 68db ldr r3, [r3, #12]
|
|
800331c: 4919 ldr r1, [pc, #100] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
800331e: 4313 orrs r3, r2
|
|
8003320: 600b str r3, [r1, #0]
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
8003322: f7fd fe73 bl 800100c <HAL_GetTick>
|
|
8003326: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till HSI is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
|
|
8003328: e008 b.n 800333c <HAL_RCC_OscConfig+0x1fc>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
|
|
800332a: f7fd fe6f bl 800100c <HAL_GetTick>
|
|
800332e: 4602 mov r2, r0
|
|
8003330: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8003332: 1ad3 subs r3, r2, r3
|
|
8003334: 2b02 cmp r3, #2
|
|
8003336: d901 bls.n 800333c <HAL_RCC_OscConfig+0x1fc>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
8003338: 2303 movs r3, #3
|
|
800333a: e2d3 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
|
|
800333c: 4b11 ldr r3, [pc, #68] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
800333e: 681b ldr r3, [r3, #0]
|
|
8003340: f003 0304 and.w r3, r3, #4
|
|
8003344: 2b00 cmp r3, #0
|
|
8003346: d0f0 beq.n 800332a <HAL_RCC_OscConfig+0x1ea>
|
|
}
|
|
}
|
|
|
|
/* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
|
|
__HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
|
|
8003348: 4b0e ldr r3, [pc, #56] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
800334a: 685b ldr r3, [r3, #4]
|
|
800334c: f023 42fe bic.w r2, r3, #2130706432 ; 0x7f000000
|
|
8003350: 687b ldr r3, [r7, #4]
|
|
8003352: 691b ldr r3, [r3, #16]
|
|
8003354: 061b lsls r3, r3, #24
|
|
8003356: 490b ldr r1, [pc, #44] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003358: 4313 orrs r3, r2
|
|
800335a: 604b str r3, [r1, #4]
|
|
800335c: e01a b.n 8003394 <HAL_RCC_OscConfig+0x254>
|
|
}
|
|
else
|
|
{
|
|
/* Disable the Internal High Speed oscillator (HSI). */
|
|
__HAL_RCC_HSI_DISABLE();
|
|
800335e: 4b09 ldr r3, [pc, #36] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003360: 681b ldr r3, [r3, #0]
|
|
8003362: 4a08 ldr r2, [pc, #32] ; (8003384 <HAL_RCC_OscConfig+0x244>)
|
|
8003364: f023 0301 bic.w r3, r3, #1
|
|
8003368: 6013 str r3, [r2, #0]
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
800336a: f7fd fe4f bl 800100c <HAL_GetTick>
|
|
800336e: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till HSI is disabled */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U)
|
|
8003370: e00a b.n 8003388 <HAL_RCC_OscConfig+0x248>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
|
|
8003372: f7fd fe4b bl 800100c <HAL_GetTick>
|
|
8003376: 4602 mov r2, r0
|
|
8003378: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800337a: 1ad3 subs r3, r2, r3
|
|
800337c: 2b02 cmp r3, #2
|
|
800337e: d903 bls.n 8003388 <HAL_RCC_OscConfig+0x248>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
8003380: 2303 movs r3, #3
|
|
8003382: e2af b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
8003384: 58024400 .word 0x58024400
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U)
|
|
8003388: 4b96 ldr r3, [pc, #600] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
800338a: 681b ldr r3, [r3, #0]
|
|
800338c: f003 0304 and.w r3, r3, #4
|
|
8003390: 2b00 cmp r3, #0
|
|
8003392: d1ee bne.n 8003372 <HAL_RCC_OscConfig+0x232>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/*----------------------------- CSI Configuration --------------------------*/
|
|
if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_CSI) == RCC_OSCILLATORTYPE_CSI)
|
|
8003394: 687b ldr r3, [r7, #4]
|
|
8003396: 681b ldr r3, [r3, #0]
|
|
8003398: f003 0310 and.w r3, r3, #16
|
|
800339c: 2b00 cmp r3, #0
|
|
800339e: d06a beq.n 8003476 <HAL_RCC_OscConfig+0x336>
|
|
/* Check the parameters */
|
|
assert_param(IS_RCC_CSI(RCC_OscInitStruct->CSIState));
|
|
assert_param(IS_RCC_CSICALIBRATION_VALUE(RCC_OscInitStruct->CSICalibrationValue));
|
|
|
|
/* When the CSI is used as system clock it will not disabled */
|
|
const uint32_t temp_sysclksrc = __HAL_RCC_GET_SYSCLK_SOURCE();
|
|
80033a0: 4b90 ldr r3, [pc, #576] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80033a2: 691b ldr r3, [r3, #16]
|
|
80033a4: f003 0338 and.w r3, r3, #56 ; 0x38
|
|
80033a8: 61bb str r3, [r7, #24]
|
|
const uint32_t temp_pllckselr = RCC->PLLCKSELR;
|
|
80033aa: 4b8e ldr r3, [pc, #568] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80033ac: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
80033ae: 617b str r3, [r7, #20]
|
|
if ((temp_sysclksrc == RCC_CFGR_SWS_CSI) || ((temp_sysclksrc == RCC_CFGR_SWS_PLL1) && ((temp_pllckselr & RCC_PLLCKSELR_PLLSRC) == RCC_PLLCKSELR_PLLSRC_CSI)))
|
|
80033b0: 69bb ldr r3, [r7, #24]
|
|
80033b2: 2b08 cmp r3, #8
|
|
80033b4: d007 beq.n 80033c6 <HAL_RCC_OscConfig+0x286>
|
|
80033b6: 69bb ldr r3, [r7, #24]
|
|
80033b8: 2b18 cmp r3, #24
|
|
80033ba: d11b bne.n 80033f4 <HAL_RCC_OscConfig+0x2b4>
|
|
80033bc: 697b ldr r3, [r7, #20]
|
|
80033be: f003 0303 and.w r3, r3, #3
|
|
80033c2: 2b01 cmp r3, #1
|
|
80033c4: d116 bne.n 80033f4 <HAL_RCC_OscConfig+0x2b4>
|
|
{
|
|
/* When CSI is used as system clock it will not disabled */
|
|
if ((__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U) && (RCC_OscInitStruct->CSIState != RCC_CSI_ON))
|
|
80033c6: 4b87 ldr r3, [pc, #540] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80033c8: 681b ldr r3, [r3, #0]
|
|
80033ca: f403 7380 and.w r3, r3, #256 ; 0x100
|
|
80033ce: 2b00 cmp r3, #0
|
|
80033d0: d005 beq.n 80033de <HAL_RCC_OscConfig+0x29e>
|
|
80033d2: 687b ldr r3, [r7, #4]
|
|
80033d4: 69db ldr r3, [r3, #28]
|
|
80033d6: 2b80 cmp r3, #128 ; 0x80
|
|
80033d8: d001 beq.n 80033de <HAL_RCC_OscConfig+0x29e>
|
|
{
|
|
return HAL_ERROR;
|
|
80033da: 2301 movs r3, #1
|
|
80033dc: e282 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
}
|
|
/* Otherwise, just the calibration is allowed */
|
|
else
|
|
{
|
|
/* Adjusts the Internal High Speed oscillator (CSI) calibration value.*/
|
|
__HAL_RCC_CSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->CSICalibrationValue);
|
|
80033de: 4b81 ldr r3, [pc, #516] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80033e0: 68db ldr r3, [r3, #12]
|
|
80033e2: f023 527c bic.w r2, r3, #1056964608 ; 0x3f000000
|
|
80033e6: 687b ldr r3, [r7, #4]
|
|
80033e8: 6a1b ldr r3, [r3, #32]
|
|
80033ea: 061b lsls r3, r3, #24
|
|
80033ec: 497d ldr r1, [pc, #500] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80033ee: 4313 orrs r3, r2
|
|
80033f0: 60cb str r3, [r1, #12]
|
|
if ((__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U) && (RCC_OscInitStruct->CSIState != RCC_CSI_ON))
|
|
80033f2: e040 b.n 8003476 <HAL_RCC_OscConfig+0x336>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Check the CSI State */
|
|
if ((RCC_OscInitStruct->CSIState) != RCC_CSI_OFF)
|
|
80033f4: 687b ldr r3, [r7, #4]
|
|
80033f6: 69db ldr r3, [r3, #28]
|
|
80033f8: 2b00 cmp r3, #0
|
|
80033fa: d023 beq.n 8003444 <HAL_RCC_OscConfig+0x304>
|
|
{
|
|
/* Enable the Internal High Speed oscillator (CSI). */
|
|
__HAL_RCC_CSI_ENABLE();
|
|
80033fc: 4b79 ldr r3, [pc, #484] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80033fe: 681b ldr r3, [r3, #0]
|
|
8003400: 4a78 ldr r2, [pc, #480] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
8003402: f043 0380 orr.w r3, r3, #128 ; 0x80
|
|
8003406: 6013 str r3, [r2, #0]
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
8003408: f7fd fe00 bl 800100c <HAL_GetTick>
|
|
800340c: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till CSI is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) == 0U)
|
|
800340e: e008 b.n 8003422 <HAL_RCC_OscConfig+0x2e2>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > CSI_TIMEOUT_VALUE)
|
|
8003410: f7fd fdfc bl 800100c <HAL_GetTick>
|
|
8003414: 4602 mov r2, r0
|
|
8003416: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8003418: 1ad3 subs r3, r2, r3
|
|
800341a: 2b02 cmp r3, #2
|
|
800341c: d901 bls.n 8003422 <HAL_RCC_OscConfig+0x2e2>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
800341e: 2303 movs r3, #3
|
|
8003420: e260 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) == 0U)
|
|
8003422: 4b70 ldr r3, [pc, #448] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
8003424: 681b ldr r3, [r3, #0]
|
|
8003426: f403 7380 and.w r3, r3, #256 ; 0x100
|
|
800342a: 2b00 cmp r3, #0
|
|
800342c: d0f0 beq.n 8003410 <HAL_RCC_OscConfig+0x2d0>
|
|
}
|
|
}
|
|
|
|
/* Adjusts the Internal High Speed oscillator (CSI) calibration value.*/
|
|
__HAL_RCC_CSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->CSICalibrationValue);
|
|
800342e: 4b6d ldr r3, [pc, #436] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
8003430: 68db ldr r3, [r3, #12]
|
|
8003432: f023 527c bic.w r2, r3, #1056964608 ; 0x3f000000
|
|
8003436: 687b ldr r3, [r7, #4]
|
|
8003438: 6a1b ldr r3, [r3, #32]
|
|
800343a: 061b lsls r3, r3, #24
|
|
800343c: 4969 ldr r1, [pc, #420] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
800343e: 4313 orrs r3, r2
|
|
8003440: 60cb str r3, [r1, #12]
|
|
8003442: e018 b.n 8003476 <HAL_RCC_OscConfig+0x336>
|
|
}
|
|
else
|
|
{
|
|
/* Disable the Internal High Speed oscillator (CSI). */
|
|
__HAL_RCC_CSI_DISABLE();
|
|
8003444: 4b67 ldr r3, [pc, #412] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
8003446: 681b ldr r3, [r3, #0]
|
|
8003448: 4a66 ldr r2, [pc, #408] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
800344a: f023 0380 bic.w r3, r3, #128 ; 0x80
|
|
800344e: 6013 str r3, [r2, #0]
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
8003450: f7fd fddc bl 800100c <HAL_GetTick>
|
|
8003454: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till CSI is disabled */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U)
|
|
8003456: e008 b.n 800346a <HAL_RCC_OscConfig+0x32a>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > CSI_TIMEOUT_VALUE)
|
|
8003458: f7fd fdd8 bl 800100c <HAL_GetTick>
|
|
800345c: 4602 mov r2, r0
|
|
800345e: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8003460: 1ad3 subs r3, r2, r3
|
|
8003462: 2b02 cmp r3, #2
|
|
8003464: d901 bls.n 800346a <HAL_RCC_OscConfig+0x32a>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
8003466: 2303 movs r3, #3
|
|
8003468: e23c b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U)
|
|
800346a: 4b5e ldr r3, [pc, #376] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
800346c: 681b ldr r3, [r3, #0]
|
|
800346e: f403 7380 and.w r3, r3, #256 ; 0x100
|
|
8003472: 2b00 cmp r3, #0
|
|
8003474: d1f0 bne.n 8003458 <HAL_RCC_OscConfig+0x318>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/*------------------------------ LSI Configuration -------------------------*/
|
|
if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI)
|
|
8003476: 687b ldr r3, [r7, #4]
|
|
8003478: 681b ldr r3, [r3, #0]
|
|
800347a: f003 0308 and.w r3, r3, #8
|
|
800347e: 2b00 cmp r3, #0
|
|
8003480: d036 beq.n 80034f0 <HAL_RCC_OscConfig+0x3b0>
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState));
|
|
|
|
/* Check the LSI State */
|
|
if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF)
|
|
8003482: 687b ldr r3, [r7, #4]
|
|
8003484: 695b ldr r3, [r3, #20]
|
|
8003486: 2b00 cmp r3, #0
|
|
8003488: d019 beq.n 80034be <HAL_RCC_OscConfig+0x37e>
|
|
{
|
|
/* Enable the Internal Low Speed oscillator (LSI). */
|
|
__HAL_RCC_LSI_ENABLE();
|
|
800348a: 4b56 ldr r3, [pc, #344] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
800348c: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800348e: 4a55 ldr r2, [pc, #340] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
8003490: f043 0301 orr.w r3, r3, #1
|
|
8003494: 6753 str r3, [r2, #116] ; 0x74
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
8003496: f7fd fdb9 bl 800100c <HAL_GetTick>
|
|
800349a: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till LSI is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == 0U)
|
|
800349c: e008 b.n 80034b0 <HAL_RCC_OscConfig+0x370>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)
|
|
800349e: f7fd fdb5 bl 800100c <HAL_GetTick>
|
|
80034a2: 4602 mov r2, r0
|
|
80034a4: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80034a6: 1ad3 subs r3, r2, r3
|
|
80034a8: 2b02 cmp r3, #2
|
|
80034aa: d901 bls.n 80034b0 <HAL_RCC_OscConfig+0x370>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
80034ac: 2303 movs r3, #3
|
|
80034ae: e219 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == 0U)
|
|
80034b0: 4b4c ldr r3, [pc, #304] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80034b2: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
80034b4: f003 0302 and.w r3, r3, #2
|
|
80034b8: 2b00 cmp r3, #0
|
|
80034ba: d0f0 beq.n 800349e <HAL_RCC_OscConfig+0x35e>
|
|
80034bc: e018 b.n 80034f0 <HAL_RCC_OscConfig+0x3b0>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Disable the Internal Low Speed oscillator (LSI). */
|
|
__HAL_RCC_LSI_DISABLE();
|
|
80034be: 4b49 ldr r3, [pc, #292] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80034c0: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
80034c2: 4a48 ldr r2, [pc, #288] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80034c4: f023 0301 bic.w r3, r3, #1
|
|
80034c8: 6753 str r3, [r2, #116] ; 0x74
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
80034ca: f7fd fd9f bl 800100c <HAL_GetTick>
|
|
80034ce: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till LSI is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != 0U)
|
|
80034d0: e008 b.n 80034e4 <HAL_RCC_OscConfig+0x3a4>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)
|
|
80034d2: f7fd fd9b bl 800100c <HAL_GetTick>
|
|
80034d6: 4602 mov r2, r0
|
|
80034d8: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80034da: 1ad3 subs r3, r2, r3
|
|
80034dc: 2b02 cmp r3, #2
|
|
80034de: d901 bls.n 80034e4 <HAL_RCC_OscConfig+0x3a4>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
80034e0: 2303 movs r3, #3
|
|
80034e2: e1ff b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != 0U)
|
|
80034e4: 4b3f ldr r3, [pc, #252] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80034e6: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
80034e8: f003 0302 and.w r3, r3, #2
|
|
80034ec: 2b00 cmp r3, #0
|
|
80034ee: d1f0 bne.n 80034d2 <HAL_RCC_OscConfig+0x392>
|
|
}
|
|
}
|
|
}
|
|
|
|
/*------------------------------ HSI48 Configuration -------------------------*/
|
|
if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI48) == RCC_OSCILLATORTYPE_HSI48)
|
|
80034f0: 687b ldr r3, [r7, #4]
|
|
80034f2: 681b ldr r3, [r3, #0]
|
|
80034f4: f003 0320 and.w r3, r3, #32
|
|
80034f8: 2b00 cmp r3, #0
|
|
80034fa: d036 beq.n 800356a <HAL_RCC_OscConfig+0x42a>
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_RCC_HSI48(RCC_OscInitStruct->HSI48State));
|
|
|
|
/* Check the HSI48 State */
|
|
if ((RCC_OscInitStruct->HSI48State) != RCC_HSI48_OFF)
|
|
80034fc: 687b ldr r3, [r7, #4]
|
|
80034fe: 699b ldr r3, [r3, #24]
|
|
8003500: 2b00 cmp r3, #0
|
|
8003502: d019 beq.n 8003538 <HAL_RCC_OscConfig+0x3f8>
|
|
{
|
|
/* Enable the Internal Low Speed oscillator (HSI48). */
|
|
__HAL_RCC_HSI48_ENABLE();
|
|
8003504: 4b37 ldr r3, [pc, #220] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
8003506: 681b ldr r3, [r3, #0]
|
|
8003508: 4a36 ldr r2, [pc, #216] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
800350a: f443 5380 orr.w r3, r3, #4096 ; 0x1000
|
|
800350e: 6013 str r3, [r2, #0]
|
|
|
|
/* Get time-out */
|
|
tickstart = HAL_GetTick();
|
|
8003510: f7fd fd7c bl 800100c <HAL_GetTick>
|
|
8003514: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till HSI48 is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSI48RDY) == 0U)
|
|
8003516: e008 b.n 800352a <HAL_RCC_OscConfig+0x3ea>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE)
|
|
8003518: f7fd fd78 bl 800100c <HAL_GetTick>
|
|
800351c: 4602 mov r2, r0
|
|
800351e: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8003520: 1ad3 subs r3, r2, r3
|
|
8003522: 2b02 cmp r3, #2
|
|
8003524: d901 bls.n 800352a <HAL_RCC_OscConfig+0x3ea>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
8003526: 2303 movs r3, #3
|
|
8003528: e1dc b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSI48RDY) == 0U)
|
|
800352a: 4b2e ldr r3, [pc, #184] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
800352c: 681b ldr r3, [r3, #0]
|
|
800352e: f403 5300 and.w r3, r3, #8192 ; 0x2000
|
|
8003532: 2b00 cmp r3, #0
|
|
8003534: d0f0 beq.n 8003518 <HAL_RCC_OscConfig+0x3d8>
|
|
8003536: e018 b.n 800356a <HAL_RCC_OscConfig+0x42a>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Disable the Internal Low Speed oscillator (HSI48). */
|
|
__HAL_RCC_HSI48_DISABLE();
|
|
8003538: 4b2a ldr r3, [pc, #168] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
800353a: 681b ldr r3, [r3, #0]
|
|
800353c: 4a29 ldr r2, [pc, #164] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
800353e: f423 5380 bic.w r3, r3, #4096 ; 0x1000
|
|
8003542: 6013 str r3, [r2, #0]
|
|
|
|
/* Get time-out */
|
|
tickstart = HAL_GetTick();
|
|
8003544: f7fd fd62 bl 800100c <HAL_GetTick>
|
|
8003548: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till HSI48 is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSI48RDY) != 0U)
|
|
800354a: e008 b.n 800355e <HAL_RCC_OscConfig+0x41e>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE)
|
|
800354c: f7fd fd5e bl 800100c <HAL_GetTick>
|
|
8003550: 4602 mov r2, r0
|
|
8003552: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8003554: 1ad3 subs r3, r2, r3
|
|
8003556: 2b02 cmp r3, #2
|
|
8003558: d901 bls.n 800355e <HAL_RCC_OscConfig+0x41e>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
800355a: 2303 movs r3, #3
|
|
800355c: e1c2 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSI48RDY) != 0U)
|
|
800355e: 4b21 ldr r3, [pc, #132] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
8003560: 681b ldr r3, [r3, #0]
|
|
8003562: f403 5300 and.w r3, r3, #8192 ; 0x2000
|
|
8003566: 2b00 cmp r3, #0
|
|
8003568: d1f0 bne.n 800354c <HAL_RCC_OscConfig+0x40c>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/*------------------------------ LSE Configuration -------------------------*/
|
|
if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)
|
|
800356a: 687b ldr r3, [r7, #4]
|
|
800356c: 681b ldr r3, [r3, #0]
|
|
800356e: f003 0304 and.w r3, r3, #4
|
|
8003572: 2b00 cmp r3, #0
|
|
8003574: f000 8086 beq.w 8003684 <HAL_RCC_OscConfig+0x544>
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState));
|
|
|
|
/* Enable write access to Backup domain */
|
|
PWR->CR1 |= PWR_CR1_DBP;
|
|
8003578: 4b1b ldr r3, [pc, #108] ; (80035e8 <HAL_RCC_OscConfig+0x4a8>)
|
|
800357a: 681b ldr r3, [r3, #0]
|
|
800357c: 4a1a ldr r2, [pc, #104] ; (80035e8 <HAL_RCC_OscConfig+0x4a8>)
|
|
800357e: f443 7380 orr.w r3, r3, #256 ; 0x100
|
|
8003582: 6013 str r3, [r2, #0]
|
|
|
|
/* Wait for Backup domain Write protection disable */
|
|
tickstart = HAL_GetTick();
|
|
8003584: f7fd fd42 bl 800100c <HAL_GetTick>
|
|
8003588: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
while ((PWR->CR1 & PWR_CR1_DBP) == 0U)
|
|
800358a: e008 b.n 800359e <HAL_RCC_OscConfig+0x45e>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)
|
|
800358c: f7fd fd3e bl 800100c <HAL_GetTick>
|
|
8003590: 4602 mov r2, r0
|
|
8003592: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8003594: 1ad3 subs r3, r2, r3
|
|
8003596: 2b64 cmp r3, #100 ; 0x64
|
|
8003598: d901 bls.n 800359e <HAL_RCC_OscConfig+0x45e>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
800359a: 2303 movs r3, #3
|
|
800359c: e1a2 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while ((PWR->CR1 & PWR_CR1_DBP) == 0U)
|
|
800359e: 4b12 ldr r3, [pc, #72] ; (80035e8 <HAL_RCC_OscConfig+0x4a8>)
|
|
80035a0: 681b ldr r3, [r3, #0]
|
|
80035a2: f403 7380 and.w r3, r3, #256 ; 0x100
|
|
80035a6: 2b00 cmp r3, #0
|
|
80035a8: d0f0 beq.n 800358c <HAL_RCC_OscConfig+0x44c>
|
|
}
|
|
}
|
|
|
|
/* Set the new LSE configuration -----------------------------------------*/
|
|
__HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);
|
|
80035aa: 687b ldr r3, [r7, #4]
|
|
80035ac: 689b ldr r3, [r3, #8]
|
|
80035ae: 2b01 cmp r3, #1
|
|
80035b0: d106 bne.n 80035c0 <HAL_RCC_OscConfig+0x480>
|
|
80035b2: 4b0c ldr r3, [pc, #48] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80035b4: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
80035b6: 4a0b ldr r2, [pc, #44] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80035b8: f043 0301 orr.w r3, r3, #1
|
|
80035bc: 6713 str r3, [r2, #112] ; 0x70
|
|
80035be: e032 b.n 8003626 <HAL_RCC_OscConfig+0x4e6>
|
|
80035c0: 687b ldr r3, [r7, #4]
|
|
80035c2: 689b ldr r3, [r3, #8]
|
|
80035c4: 2b00 cmp r3, #0
|
|
80035c6: d111 bne.n 80035ec <HAL_RCC_OscConfig+0x4ac>
|
|
80035c8: 4b06 ldr r3, [pc, #24] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80035ca: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
80035cc: 4a05 ldr r2, [pc, #20] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80035ce: f023 0301 bic.w r3, r3, #1
|
|
80035d2: 6713 str r3, [r2, #112] ; 0x70
|
|
80035d4: 4b03 ldr r3, [pc, #12] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80035d6: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
80035d8: 4a02 ldr r2, [pc, #8] ; (80035e4 <HAL_RCC_OscConfig+0x4a4>)
|
|
80035da: f023 0304 bic.w r3, r3, #4
|
|
80035de: 6713 str r3, [r2, #112] ; 0x70
|
|
80035e0: e021 b.n 8003626 <HAL_RCC_OscConfig+0x4e6>
|
|
80035e2: bf00 nop
|
|
80035e4: 58024400 .word 0x58024400
|
|
80035e8: 58024800 .word 0x58024800
|
|
80035ec: 687b ldr r3, [r7, #4]
|
|
80035ee: 689b ldr r3, [r3, #8]
|
|
80035f0: 2b05 cmp r3, #5
|
|
80035f2: d10c bne.n 800360e <HAL_RCC_OscConfig+0x4ce>
|
|
80035f4: 4b83 ldr r3, [pc, #524] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80035f6: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
80035f8: 4a82 ldr r2, [pc, #520] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80035fa: f043 0304 orr.w r3, r3, #4
|
|
80035fe: 6713 str r3, [r2, #112] ; 0x70
|
|
8003600: 4b80 ldr r3, [pc, #512] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003602: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8003604: 4a7f ldr r2, [pc, #508] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003606: f043 0301 orr.w r3, r3, #1
|
|
800360a: 6713 str r3, [r2, #112] ; 0x70
|
|
800360c: e00b b.n 8003626 <HAL_RCC_OscConfig+0x4e6>
|
|
800360e: 4b7d ldr r3, [pc, #500] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003610: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8003612: 4a7c ldr r2, [pc, #496] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003614: f023 0301 bic.w r3, r3, #1
|
|
8003618: 6713 str r3, [r2, #112] ; 0x70
|
|
800361a: 4b7a ldr r3, [pc, #488] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800361c: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800361e: 4a79 ldr r2, [pc, #484] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003620: f023 0304 bic.w r3, r3, #4
|
|
8003624: 6713 str r3, [r2, #112] ; 0x70
|
|
/* Check the LSE State */
|
|
if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF)
|
|
8003626: 687b ldr r3, [r7, #4]
|
|
8003628: 689b ldr r3, [r3, #8]
|
|
800362a: 2b00 cmp r3, #0
|
|
800362c: d015 beq.n 800365a <HAL_RCC_OscConfig+0x51a>
|
|
{
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
800362e: f7fd fced bl 800100c <HAL_GetTick>
|
|
8003632: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till LSE is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U)
|
|
8003634: e00a b.n 800364c <HAL_RCC_OscConfig+0x50c>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
|
|
8003636: f7fd fce9 bl 800100c <HAL_GetTick>
|
|
800363a: 4602 mov r2, r0
|
|
800363c: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800363e: 1ad3 subs r3, r2, r3
|
|
8003640: f241 3288 movw r2, #5000 ; 0x1388
|
|
8003644: 4293 cmp r3, r2
|
|
8003646: d901 bls.n 800364c <HAL_RCC_OscConfig+0x50c>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
8003648: 2303 movs r3, #3
|
|
800364a: e14b b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U)
|
|
800364c: 4b6d ldr r3, [pc, #436] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800364e: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8003650: f003 0302 and.w r3, r3, #2
|
|
8003654: 2b00 cmp r3, #0
|
|
8003656: d0ee beq.n 8003636 <HAL_RCC_OscConfig+0x4f6>
|
|
8003658: e014 b.n 8003684 <HAL_RCC_OscConfig+0x544>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
800365a: f7fd fcd7 bl 800100c <HAL_GetTick>
|
|
800365e: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till LSE is disabled */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != 0U)
|
|
8003660: e00a b.n 8003678 <HAL_RCC_OscConfig+0x538>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
|
|
8003662: f7fd fcd3 bl 800100c <HAL_GetTick>
|
|
8003666: 4602 mov r2, r0
|
|
8003668: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800366a: 1ad3 subs r3, r2, r3
|
|
800366c: f241 3288 movw r2, #5000 ; 0x1388
|
|
8003670: 4293 cmp r3, r2
|
|
8003672: d901 bls.n 8003678 <HAL_RCC_OscConfig+0x538>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
8003674: 2303 movs r3, #3
|
|
8003676: e135 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != 0U)
|
|
8003678: 4b62 ldr r3, [pc, #392] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800367a: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800367c: f003 0302 and.w r3, r3, #2
|
|
8003680: 2b00 cmp r3, #0
|
|
8003682: d1ee bne.n 8003662 <HAL_RCC_OscConfig+0x522>
|
|
}
|
|
}
|
|
/*-------------------------------- PLL Configuration -----------------------*/
|
|
/* Check the parameters */
|
|
assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
|
|
if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE)
|
|
8003684: 687b ldr r3, [r7, #4]
|
|
8003686: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
8003688: 2b00 cmp r3, #0
|
|
800368a: f000 812a beq.w 80038e2 <HAL_RCC_OscConfig+0x7a2>
|
|
{
|
|
/* Check if the PLL is used as system clock or not */
|
|
if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL1)
|
|
800368e: 4b5d ldr r3, [pc, #372] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003690: 691b ldr r3, [r3, #16]
|
|
8003692: f003 0338 and.w r3, r3, #56 ; 0x38
|
|
8003696: 2b18 cmp r3, #24
|
|
8003698: f000 80ba beq.w 8003810 <HAL_RCC_OscConfig+0x6d0>
|
|
{
|
|
if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON)
|
|
800369c: 687b ldr r3, [r7, #4]
|
|
800369e: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
80036a0: 2b02 cmp r3, #2
|
|
80036a2: f040 8095 bne.w 80037d0 <HAL_RCC_OscConfig+0x690>
|
|
assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ));
|
|
assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR));
|
|
assert_param(IS_RCC_PLLFRACN_VALUE(RCC_OscInitStruct->PLL.PLLFRACN));
|
|
|
|
/* Disable the main PLL. */
|
|
__HAL_RCC_PLL_DISABLE();
|
|
80036a6: 4b57 ldr r3, [pc, #348] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80036a8: 681b ldr r3, [r3, #0]
|
|
80036aa: 4a56 ldr r2, [pc, #344] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80036ac: f023 7380 bic.w r3, r3, #16777216 ; 0x1000000
|
|
80036b0: 6013 str r3, [r2, #0]
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
80036b2: f7fd fcab bl 800100c <HAL_GetTick>
|
|
80036b6: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till PLL is disabled */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != 0U)
|
|
80036b8: e008 b.n 80036cc <HAL_RCC_OscConfig+0x58c>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
|
|
80036ba: f7fd fca7 bl 800100c <HAL_GetTick>
|
|
80036be: 4602 mov r2, r0
|
|
80036c0: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80036c2: 1ad3 subs r3, r2, r3
|
|
80036c4: 2b02 cmp r3, #2
|
|
80036c6: d901 bls.n 80036cc <HAL_RCC_OscConfig+0x58c>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
80036c8: 2303 movs r3, #3
|
|
80036ca: e10b b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != 0U)
|
|
80036cc: 4b4d ldr r3, [pc, #308] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80036ce: 681b ldr r3, [r3, #0]
|
|
80036d0: f003 7300 and.w r3, r3, #33554432 ; 0x2000000
|
|
80036d4: 2b00 cmp r3, #0
|
|
80036d6: d1f0 bne.n 80036ba <HAL_RCC_OscConfig+0x57a>
|
|
}
|
|
}
|
|
|
|
/* Configure the main PLL clock source, multiplication and division factors. */
|
|
__HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource,
|
|
80036d8: 4b4a ldr r3, [pc, #296] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80036da: 6a9a ldr r2, [r3, #40] ; 0x28
|
|
80036dc: 4b4a ldr r3, [pc, #296] ; (8003808 <HAL_RCC_OscConfig+0x6c8>)
|
|
80036de: 4013 ands r3, r2
|
|
80036e0: 687a ldr r2, [r7, #4]
|
|
80036e2: 6a91 ldr r1, [r2, #40] ; 0x28
|
|
80036e4: 687a ldr r2, [r7, #4]
|
|
80036e6: 6ad2 ldr r2, [r2, #44] ; 0x2c
|
|
80036e8: 0112 lsls r2, r2, #4
|
|
80036ea: 430a orrs r2, r1
|
|
80036ec: 4945 ldr r1, [pc, #276] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80036ee: 4313 orrs r3, r2
|
|
80036f0: 628b str r3, [r1, #40] ; 0x28
|
|
80036f2: 687b ldr r3, [r7, #4]
|
|
80036f4: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
80036f6: 3b01 subs r3, #1
|
|
80036f8: f3c3 0208 ubfx r2, r3, #0, #9
|
|
80036fc: 687b ldr r3, [r7, #4]
|
|
80036fe: 6b5b ldr r3, [r3, #52] ; 0x34
|
|
8003700: 3b01 subs r3, #1
|
|
8003702: 025b lsls r3, r3, #9
|
|
8003704: b29b uxth r3, r3
|
|
8003706: 431a orrs r2, r3
|
|
8003708: 687b ldr r3, [r7, #4]
|
|
800370a: 6b9b ldr r3, [r3, #56] ; 0x38
|
|
800370c: 3b01 subs r3, #1
|
|
800370e: 041b lsls r3, r3, #16
|
|
8003710: f403 03fe and.w r3, r3, #8323072 ; 0x7f0000
|
|
8003714: 431a orrs r2, r3
|
|
8003716: 687b ldr r3, [r7, #4]
|
|
8003718: 6bdb ldr r3, [r3, #60] ; 0x3c
|
|
800371a: 3b01 subs r3, #1
|
|
800371c: 061b lsls r3, r3, #24
|
|
800371e: f003 43fe and.w r3, r3, #2130706432 ; 0x7f000000
|
|
8003722: 4938 ldr r1, [pc, #224] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003724: 4313 orrs r3, r2
|
|
8003726: 630b str r3, [r1, #48] ; 0x30
|
|
RCC_OscInitStruct->PLL.PLLP,
|
|
RCC_OscInitStruct->PLL.PLLQ,
|
|
RCC_OscInitStruct->PLL.PLLR);
|
|
|
|
/* Disable PLLFRACN . */
|
|
__HAL_RCC_PLLFRACN_DISABLE();
|
|
8003728: 4b36 ldr r3, [pc, #216] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800372a: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
800372c: 4a35 ldr r2, [pc, #212] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800372e: f023 0301 bic.w r3, r3, #1
|
|
8003732: 62d3 str r3, [r2, #44] ; 0x2c
|
|
|
|
/* Configure PLL PLL1FRACN */
|
|
__HAL_RCC_PLLFRACN_CONFIG(RCC_OscInitStruct->PLL.PLLFRACN);
|
|
8003734: 4b33 ldr r3, [pc, #204] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003736: 6b5a ldr r2, [r3, #52] ; 0x34
|
|
8003738: 4b34 ldr r3, [pc, #208] ; (800380c <HAL_RCC_OscConfig+0x6cc>)
|
|
800373a: 4013 ands r3, r2
|
|
800373c: 687a ldr r2, [r7, #4]
|
|
800373e: 6c92 ldr r2, [r2, #72] ; 0x48
|
|
8003740: 00d2 lsls r2, r2, #3
|
|
8003742: 4930 ldr r1, [pc, #192] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003744: 4313 orrs r3, r2
|
|
8003746: 634b str r3, [r1, #52] ; 0x34
|
|
|
|
/* Select PLL1 input reference frequency range: VCI */
|
|
__HAL_RCC_PLL_VCIRANGE(RCC_OscInitStruct->PLL.PLLRGE) ;
|
|
8003748: 4b2e ldr r3, [pc, #184] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800374a: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
800374c: f023 020c bic.w r2, r3, #12
|
|
8003750: 687b ldr r3, [r7, #4]
|
|
8003752: 6c1b ldr r3, [r3, #64] ; 0x40
|
|
8003754: 492b ldr r1, [pc, #172] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003756: 4313 orrs r3, r2
|
|
8003758: 62cb str r3, [r1, #44] ; 0x2c
|
|
|
|
/* Select PLL1 output frequency range : VCO */
|
|
__HAL_RCC_PLL_VCORANGE(RCC_OscInitStruct->PLL.PLLVCOSEL) ;
|
|
800375a: 4b2a ldr r3, [pc, #168] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800375c: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
800375e: f023 0202 bic.w r2, r3, #2
|
|
8003762: 687b ldr r3, [r7, #4]
|
|
8003764: 6c5b ldr r3, [r3, #68] ; 0x44
|
|
8003766: 4927 ldr r1, [pc, #156] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003768: 4313 orrs r3, r2
|
|
800376a: 62cb str r3, [r1, #44] ; 0x2c
|
|
|
|
/* Enable PLL System Clock output. */
|
|
__HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVP);
|
|
800376c: 4b25 ldr r3, [pc, #148] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800376e: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8003770: 4a24 ldr r2, [pc, #144] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003772: f443 3380 orr.w r3, r3, #65536 ; 0x10000
|
|
8003776: 62d3 str r3, [r2, #44] ; 0x2c
|
|
|
|
/* Enable PLL1Q Clock output. */
|
|
__HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
|
|
8003778: 4b22 ldr r3, [pc, #136] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800377a: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
800377c: 4a21 ldr r2, [pc, #132] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800377e: f443 3300 orr.w r3, r3, #131072 ; 0x20000
|
|
8003782: 62d3 str r3, [r2, #44] ; 0x2c
|
|
|
|
/* Enable PLL1R Clock output. */
|
|
__HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVR);
|
|
8003784: 4b1f ldr r3, [pc, #124] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003786: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8003788: 4a1e ldr r2, [pc, #120] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800378a: f443 2380 orr.w r3, r3, #262144 ; 0x40000
|
|
800378e: 62d3 str r3, [r2, #44] ; 0x2c
|
|
|
|
/* Enable PLL1FRACN . */
|
|
__HAL_RCC_PLLFRACN_ENABLE();
|
|
8003790: 4b1c ldr r3, [pc, #112] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003792: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8003794: 4a1b ldr r2, [pc, #108] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
8003796: f043 0301 orr.w r3, r3, #1
|
|
800379a: 62d3 str r3, [r2, #44] ; 0x2c
|
|
|
|
/* Enable the main PLL. */
|
|
__HAL_RCC_PLL_ENABLE();
|
|
800379c: 4b19 ldr r3, [pc, #100] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
800379e: 681b ldr r3, [r3, #0]
|
|
80037a0: 4a18 ldr r2, [pc, #96] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80037a2: f043 7380 orr.w r3, r3, #16777216 ; 0x1000000
|
|
80037a6: 6013 str r3, [r2, #0]
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
80037a8: f7fd fc30 bl 800100c <HAL_GetTick>
|
|
80037ac: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till PLL is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == 0U)
|
|
80037ae: e008 b.n 80037c2 <HAL_RCC_OscConfig+0x682>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
|
|
80037b0: f7fd fc2c bl 800100c <HAL_GetTick>
|
|
80037b4: 4602 mov r2, r0
|
|
80037b6: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80037b8: 1ad3 subs r3, r2, r3
|
|
80037ba: 2b02 cmp r3, #2
|
|
80037bc: d901 bls.n 80037c2 <HAL_RCC_OscConfig+0x682>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
80037be: 2303 movs r3, #3
|
|
80037c0: e090 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == 0U)
|
|
80037c2: 4b10 ldr r3, [pc, #64] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80037c4: 681b ldr r3, [r3, #0]
|
|
80037c6: f003 7300 and.w r3, r3, #33554432 ; 0x2000000
|
|
80037ca: 2b00 cmp r3, #0
|
|
80037cc: d0f0 beq.n 80037b0 <HAL_RCC_OscConfig+0x670>
|
|
80037ce: e088 b.n 80038e2 <HAL_RCC_OscConfig+0x7a2>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Disable the main PLL. */
|
|
__HAL_RCC_PLL_DISABLE();
|
|
80037d0: 4b0c ldr r3, [pc, #48] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80037d2: 681b ldr r3, [r3, #0]
|
|
80037d4: 4a0b ldr r2, [pc, #44] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80037d6: f023 7380 bic.w r3, r3, #16777216 ; 0x1000000
|
|
80037da: 6013 str r3, [r2, #0]
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
80037dc: f7fd fc16 bl 800100c <HAL_GetTick>
|
|
80037e0: 6278 str r0, [r7, #36] ; 0x24
|
|
|
|
/* Wait till PLL is disabled */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != 0U)
|
|
80037e2: e008 b.n 80037f6 <HAL_RCC_OscConfig+0x6b6>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
|
|
80037e4: f7fd fc12 bl 800100c <HAL_GetTick>
|
|
80037e8: 4602 mov r2, r0
|
|
80037ea: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80037ec: 1ad3 subs r3, r2, r3
|
|
80037ee: 2b02 cmp r3, #2
|
|
80037f0: d901 bls.n 80037f6 <HAL_RCC_OscConfig+0x6b6>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
80037f2: 2303 movs r3, #3
|
|
80037f4: e076 b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != 0U)
|
|
80037f6: 4b03 ldr r3, [pc, #12] ; (8003804 <HAL_RCC_OscConfig+0x6c4>)
|
|
80037f8: 681b ldr r3, [r3, #0]
|
|
80037fa: f003 7300 and.w r3, r3, #33554432 ; 0x2000000
|
|
80037fe: 2b00 cmp r3, #0
|
|
8003800: d1f0 bne.n 80037e4 <HAL_RCC_OscConfig+0x6a4>
|
|
8003802: e06e b.n 80038e2 <HAL_RCC_OscConfig+0x7a2>
|
|
8003804: 58024400 .word 0x58024400
|
|
8003808: fffffc0c .word 0xfffffc0c
|
|
800380c: ffff0007 .word 0xffff0007
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Do not return HAL_ERROR if request repeats the current configuration */
|
|
temp1_pllckcfg = RCC->PLLCKSELR;
|
|
8003810: 4b36 ldr r3, [pc, #216] ; (80038ec <HAL_RCC_OscConfig+0x7ac>)
|
|
8003812: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
8003814: 613b str r3, [r7, #16]
|
|
temp2_pllckcfg = RCC->PLL1DIVR;
|
|
8003816: 4b35 ldr r3, [pc, #212] ; (80038ec <HAL_RCC_OscConfig+0x7ac>)
|
|
8003818: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
800381a: 60fb str r3, [r7, #12]
|
|
if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) ||
|
|
800381c: 687b ldr r3, [r7, #4]
|
|
800381e: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
8003820: 2b01 cmp r3, #1
|
|
8003822: d031 beq.n 8003888 <HAL_RCC_OscConfig+0x748>
|
|
(READ_BIT(temp1_pllckcfg, RCC_PLLCKSELR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) ||
|
|
8003824: 693b ldr r3, [r7, #16]
|
|
8003826: f003 0203 and.w r2, r3, #3
|
|
800382a: 687b ldr r3, [r7, #4]
|
|
800382c: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) ||
|
|
800382e: 429a cmp r2, r3
|
|
8003830: d12a bne.n 8003888 <HAL_RCC_OscConfig+0x748>
|
|
((READ_BIT(temp1_pllckcfg, RCC_PLLCKSELR_DIVM1) >> RCC_PLLCKSELR_DIVM1_Pos) != RCC_OscInitStruct->PLL.PLLM) ||
|
|
8003832: 693b ldr r3, [r7, #16]
|
|
8003834: 091b lsrs r3, r3, #4
|
|
8003836: f003 023f and.w r2, r3, #63 ; 0x3f
|
|
800383a: 687b ldr r3, [r7, #4]
|
|
800383c: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
(READ_BIT(temp1_pllckcfg, RCC_PLLCKSELR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) ||
|
|
800383e: 429a cmp r2, r3
|
|
8003840: d122 bne.n 8003888 <HAL_RCC_OscConfig+0x748>
|
|
(READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_N1) != (RCC_OscInitStruct->PLL.PLLN - 1U)) ||
|
|
8003842: 68fb ldr r3, [r7, #12]
|
|
8003844: f3c3 0208 ubfx r2, r3, #0, #9
|
|
8003848: 687b ldr r3, [r7, #4]
|
|
800384a: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
800384c: 3b01 subs r3, #1
|
|
((READ_BIT(temp1_pllckcfg, RCC_PLLCKSELR_DIVM1) >> RCC_PLLCKSELR_DIVM1_Pos) != RCC_OscInitStruct->PLL.PLLM) ||
|
|
800384e: 429a cmp r2, r3
|
|
8003850: d11a bne.n 8003888 <HAL_RCC_OscConfig+0x748>
|
|
((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_P1) >> RCC_PLL1DIVR_P1_Pos) != (RCC_OscInitStruct->PLL.PLLP - 1U)) ||
|
|
8003852: 68fb ldr r3, [r7, #12]
|
|
8003854: 0a5b lsrs r3, r3, #9
|
|
8003856: f003 027f and.w r2, r3, #127 ; 0x7f
|
|
800385a: 687b ldr r3, [r7, #4]
|
|
800385c: 6b5b ldr r3, [r3, #52] ; 0x34
|
|
800385e: 3b01 subs r3, #1
|
|
(READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_N1) != (RCC_OscInitStruct->PLL.PLLN - 1U)) ||
|
|
8003860: 429a cmp r2, r3
|
|
8003862: d111 bne.n 8003888 <HAL_RCC_OscConfig+0x748>
|
|
((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_Q1) >> RCC_PLL1DIVR_Q1_Pos) != (RCC_OscInitStruct->PLL.PLLQ - 1U)) ||
|
|
8003864: 68fb ldr r3, [r7, #12]
|
|
8003866: 0c1b lsrs r3, r3, #16
|
|
8003868: f003 027f and.w r2, r3, #127 ; 0x7f
|
|
800386c: 687b ldr r3, [r7, #4]
|
|
800386e: 6b9b ldr r3, [r3, #56] ; 0x38
|
|
8003870: 3b01 subs r3, #1
|
|
((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_P1) >> RCC_PLL1DIVR_P1_Pos) != (RCC_OscInitStruct->PLL.PLLP - 1U)) ||
|
|
8003872: 429a cmp r2, r3
|
|
8003874: d108 bne.n 8003888 <HAL_RCC_OscConfig+0x748>
|
|
((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_R1) >> RCC_PLL1DIVR_R1_Pos) != (RCC_OscInitStruct->PLL.PLLR - 1U)))
|
|
8003876: 68fb ldr r3, [r7, #12]
|
|
8003878: 0e1b lsrs r3, r3, #24
|
|
800387a: f003 027f and.w r2, r3, #127 ; 0x7f
|
|
800387e: 687b ldr r3, [r7, #4]
|
|
8003880: 6bdb ldr r3, [r3, #60] ; 0x3c
|
|
8003882: 3b01 subs r3, #1
|
|
((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_Q1) >> RCC_PLL1DIVR_Q1_Pos) != (RCC_OscInitStruct->PLL.PLLQ - 1U)) ||
|
|
8003884: 429a cmp r2, r3
|
|
8003886: d001 beq.n 800388c <HAL_RCC_OscConfig+0x74c>
|
|
{
|
|
return HAL_ERROR;
|
|
8003888: 2301 movs r3, #1
|
|
800388a: e02b b.n 80038e4 <HAL_RCC_OscConfig+0x7a4>
|
|
}
|
|
else
|
|
{
|
|
/* Check if only fractional part needs to be updated */
|
|
temp1_pllckcfg = ((RCC->PLL1FRACR & RCC_PLL1FRACR_FRACN1) >> RCC_PLL1FRACR_FRACN1_Pos);
|
|
800388c: 4b17 ldr r3, [pc, #92] ; (80038ec <HAL_RCC_OscConfig+0x7ac>)
|
|
800388e: 6b5b ldr r3, [r3, #52] ; 0x34
|
|
8003890: 08db lsrs r3, r3, #3
|
|
8003892: f3c3 030c ubfx r3, r3, #0, #13
|
|
8003896: 613b str r3, [r7, #16]
|
|
if (RCC_OscInitStruct->PLL.PLLFRACN != temp1_pllckcfg)
|
|
8003898: 687b ldr r3, [r7, #4]
|
|
800389a: 6c9b ldr r3, [r3, #72] ; 0x48
|
|
800389c: 693a ldr r2, [r7, #16]
|
|
800389e: 429a cmp r2, r3
|
|
80038a0: d01f beq.n 80038e2 <HAL_RCC_OscConfig+0x7a2>
|
|
{
|
|
assert_param(IS_RCC_PLLFRACN_VALUE(RCC_OscInitStruct->PLL.PLLFRACN));
|
|
/* Disable PLL1FRACEN */
|
|
__HAL_RCC_PLLFRACN_DISABLE();
|
|
80038a2: 4b12 ldr r3, [pc, #72] ; (80038ec <HAL_RCC_OscConfig+0x7ac>)
|
|
80038a4: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
80038a6: 4a11 ldr r2, [pc, #68] ; (80038ec <HAL_RCC_OscConfig+0x7ac>)
|
|
80038a8: f023 0301 bic.w r3, r3, #1
|
|
80038ac: 62d3 str r3, [r2, #44] ; 0x2c
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
80038ae: f7fd fbad bl 800100c <HAL_GetTick>
|
|
80038b2: 6278 str r0, [r7, #36] ; 0x24
|
|
/* Wait at least 2 CK_REF (PLL input source divided by M) period to make sure next latched value will be taken into account. */
|
|
while ((HAL_GetTick() - tickstart) < PLL_FRAC_TIMEOUT_VALUE)
|
|
80038b4: bf00 nop
|
|
80038b6: f7fd fba9 bl 800100c <HAL_GetTick>
|
|
80038ba: 4602 mov r2, r0
|
|
80038bc: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80038be: 4293 cmp r3, r2
|
|
80038c0: d0f9 beq.n 80038b6 <HAL_RCC_OscConfig+0x776>
|
|
{
|
|
}
|
|
/* Configure PLL1 PLL1FRACN */
|
|
__HAL_RCC_PLLFRACN_CONFIG(RCC_OscInitStruct->PLL.PLLFRACN);
|
|
80038c2: 4b0a ldr r3, [pc, #40] ; (80038ec <HAL_RCC_OscConfig+0x7ac>)
|
|
80038c4: 6b5a ldr r2, [r3, #52] ; 0x34
|
|
80038c6: 4b0a ldr r3, [pc, #40] ; (80038f0 <HAL_RCC_OscConfig+0x7b0>)
|
|
80038c8: 4013 ands r3, r2
|
|
80038ca: 687a ldr r2, [r7, #4]
|
|
80038cc: 6c92 ldr r2, [r2, #72] ; 0x48
|
|
80038ce: 00d2 lsls r2, r2, #3
|
|
80038d0: 4906 ldr r1, [pc, #24] ; (80038ec <HAL_RCC_OscConfig+0x7ac>)
|
|
80038d2: 4313 orrs r3, r2
|
|
80038d4: 634b str r3, [r1, #52] ; 0x34
|
|
/* Enable PLL1FRACEN to latch new value. */
|
|
__HAL_RCC_PLLFRACN_ENABLE();
|
|
80038d6: 4b05 ldr r3, [pc, #20] ; (80038ec <HAL_RCC_OscConfig+0x7ac>)
|
|
80038d8: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
80038da: 4a04 ldr r2, [pc, #16] ; (80038ec <HAL_RCC_OscConfig+0x7ac>)
|
|
80038dc: f043 0301 orr.w r3, r3, #1
|
|
80038e0: 62d3 str r3, [r2, #44] ; 0x2c
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return HAL_OK;
|
|
80038e2: 2300 movs r3, #0
|
|
}
|
|
80038e4: 4618 mov r0, r3
|
|
80038e6: 3730 adds r7, #48 ; 0x30
|
|
80038e8: 46bd mov sp, r7
|
|
80038ea: bd80 pop {r7, pc}
|
|
80038ec: 58024400 .word 0x58024400
|
|
80038f0: ffff0007 .word 0xffff0007
|
|
|
|
080038f4 <HAL_RCC_ClockConfig>:
|
|
* D1CPRE[3:0] bits to ensure that Domain1 core clock not exceed the maximum allowed frequency
|
|
* (for more details refer to section above "Initialization/de-initialization functions")
|
|
* @retval None
|
|
*/
|
|
HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
|
|
{
|
|
80038f4: b580 push {r7, lr}
|
|
80038f6: b086 sub sp, #24
|
|
80038f8: af00 add r7, sp, #0
|
|
80038fa: 6078 str r0, [r7, #4]
|
|
80038fc: 6039 str r1, [r7, #0]
|
|
HAL_StatusTypeDef halstatus;
|
|
uint32_t tickstart;
|
|
uint32_t common_system_clock;
|
|
|
|
/* Check Null pointer */
|
|
if (RCC_ClkInitStruct == NULL)
|
|
80038fe: 687b ldr r3, [r7, #4]
|
|
8003900: 2b00 cmp r3, #0
|
|
8003902: d101 bne.n 8003908 <HAL_RCC_ClockConfig+0x14>
|
|
{
|
|
return HAL_ERROR;
|
|
8003904: 2301 movs r3, #1
|
|
8003906: e19c b.n 8003c42 <HAL_RCC_ClockConfig+0x34e>
|
|
/* To correctly read data from FLASH memory, the number of wait states (LATENCY)
|
|
must be correctly programmed according to the frequency of the CPU clock
|
|
(HCLK) and the supply voltage of the device. */
|
|
|
|
/* Increasing the CPU frequency */
|
|
if (FLatency > __HAL_FLASH_GET_LATENCY())
|
|
8003908: 4b8a ldr r3, [pc, #552] ; (8003b34 <HAL_RCC_ClockConfig+0x240>)
|
|
800390a: 681b ldr r3, [r3, #0]
|
|
800390c: f003 030f and.w r3, r3, #15
|
|
8003910: 683a ldr r2, [r7, #0]
|
|
8003912: 429a cmp r2, r3
|
|
8003914: d910 bls.n 8003938 <HAL_RCC_ClockConfig+0x44>
|
|
{
|
|
/* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
|
|
__HAL_FLASH_SET_LATENCY(FLatency);
|
|
8003916: 4b87 ldr r3, [pc, #540] ; (8003b34 <HAL_RCC_ClockConfig+0x240>)
|
|
8003918: 681b ldr r3, [r3, #0]
|
|
800391a: f023 020f bic.w r2, r3, #15
|
|
800391e: 4985 ldr r1, [pc, #532] ; (8003b34 <HAL_RCC_ClockConfig+0x240>)
|
|
8003920: 683b ldr r3, [r7, #0]
|
|
8003922: 4313 orrs r3, r2
|
|
8003924: 600b str r3, [r1, #0]
|
|
|
|
/* Check that the new number of wait states is taken into account to access the Flash
|
|
memory by reading the FLASH_ACR register */
|
|
if (__HAL_FLASH_GET_LATENCY() != FLatency)
|
|
8003926: 4b83 ldr r3, [pc, #524] ; (8003b34 <HAL_RCC_ClockConfig+0x240>)
|
|
8003928: 681b ldr r3, [r3, #0]
|
|
800392a: f003 030f and.w r3, r3, #15
|
|
800392e: 683a ldr r2, [r7, #0]
|
|
8003930: 429a cmp r2, r3
|
|
8003932: d001 beq.n 8003938 <HAL_RCC_ClockConfig+0x44>
|
|
{
|
|
return HAL_ERROR;
|
|
8003934: 2301 movs r3, #1
|
|
8003936: e184 b.n 8003c42 <HAL_RCC_ClockConfig+0x34e>
|
|
|
|
}
|
|
|
|
/* Increasing the BUS frequency divider */
|
|
/*-------------------------- D1PCLK1/CDPCLK1 Configuration ---------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_D1PCLK1) == RCC_CLOCKTYPE_D1PCLK1)
|
|
8003938: 687b ldr r3, [r7, #4]
|
|
800393a: 681b ldr r3, [r3, #0]
|
|
800393c: f003 0304 and.w r3, r3, #4
|
|
8003940: 2b00 cmp r3, #0
|
|
8003942: d010 beq.n 8003966 <HAL_RCC_ClockConfig+0x72>
|
|
{
|
|
#if defined (RCC_D1CFGR_D1PPRE)
|
|
if ((RCC_ClkInitStruct->APB3CLKDivider) > (RCC->D1CFGR & RCC_D1CFGR_D1PPRE))
|
|
8003944: 687b ldr r3, [r7, #4]
|
|
8003946: 691a ldr r2, [r3, #16]
|
|
8003948: 4b7b ldr r3, [pc, #492] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
800394a: 699b ldr r3, [r3, #24]
|
|
800394c: f003 0370 and.w r3, r3, #112 ; 0x70
|
|
8003950: 429a cmp r2, r3
|
|
8003952: d908 bls.n 8003966 <HAL_RCC_ClockConfig+0x72>
|
|
{
|
|
assert_param(IS_RCC_D1PCLK1(RCC_ClkInitStruct->APB3CLKDivider));
|
|
MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1PPRE, RCC_ClkInitStruct->APB3CLKDivider);
|
|
8003954: 4b78 ldr r3, [pc, #480] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003956: 699b ldr r3, [r3, #24]
|
|
8003958: f023 0270 bic.w r2, r3, #112 ; 0x70
|
|
800395c: 687b ldr r3, [r7, #4]
|
|
800395e: 691b ldr r3, [r3, #16]
|
|
8003960: 4975 ldr r1, [pc, #468] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003962: 4313 orrs r3, r2
|
|
8003964: 618b str r3, [r1, #24]
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------- PCLK1 Configuration ---------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1)
|
|
8003966: 687b ldr r3, [r7, #4]
|
|
8003968: 681b ldr r3, [r3, #0]
|
|
800396a: f003 0308 and.w r3, r3, #8
|
|
800396e: 2b00 cmp r3, #0
|
|
8003970: d010 beq.n 8003994 <HAL_RCC_ClockConfig+0xa0>
|
|
{
|
|
#if defined (RCC_D2CFGR_D2PPRE1)
|
|
if ((RCC_ClkInitStruct->APB1CLKDivider) > (RCC->D2CFGR & RCC_D2CFGR_D2PPRE1))
|
|
8003972: 687b ldr r3, [r7, #4]
|
|
8003974: 695a ldr r2, [r3, #20]
|
|
8003976: 4b70 ldr r3, [pc, #448] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003978: 69db ldr r3, [r3, #28]
|
|
800397a: f003 0370 and.w r3, r3, #112 ; 0x70
|
|
800397e: 429a cmp r2, r3
|
|
8003980: d908 bls.n 8003994 <HAL_RCC_ClockConfig+0xa0>
|
|
{
|
|
assert_param(IS_RCC_PCLK1(RCC_ClkInitStruct->APB1CLKDivider));
|
|
MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE1, (RCC_ClkInitStruct->APB1CLKDivider));
|
|
8003982: 4b6d ldr r3, [pc, #436] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003984: 69db ldr r3, [r3, #28]
|
|
8003986: f023 0270 bic.w r2, r3, #112 ; 0x70
|
|
800398a: 687b ldr r3, [r7, #4]
|
|
800398c: 695b ldr r3, [r3, #20]
|
|
800398e: 496a ldr r1, [pc, #424] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003990: 4313 orrs r3, r2
|
|
8003992: 61cb str r3, [r1, #28]
|
|
MODIFY_REG(RCC->CDCFGR2, RCC_CDCFGR2_CDPPRE1, (RCC_ClkInitStruct->APB1CLKDivider));
|
|
}
|
|
#endif
|
|
}
|
|
/*-------------------------- PCLK2 Configuration ---------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)
|
|
8003994: 687b ldr r3, [r7, #4]
|
|
8003996: 681b ldr r3, [r3, #0]
|
|
8003998: f003 0310 and.w r3, r3, #16
|
|
800399c: 2b00 cmp r3, #0
|
|
800399e: d010 beq.n 80039c2 <HAL_RCC_ClockConfig+0xce>
|
|
{
|
|
#if defined(RCC_D2CFGR_D2PPRE2)
|
|
if ((RCC_ClkInitStruct->APB2CLKDivider) > (RCC->D2CFGR & RCC_D2CFGR_D2PPRE2))
|
|
80039a0: 687b ldr r3, [r7, #4]
|
|
80039a2: 699a ldr r2, [r3, #24]
|
|
80039a4: 4b64 ldr r3, [pc, #400] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
80039a6: 69db ldr r3, [r3, #28]
|
|
80039a8: f403 63e0 and.w r3, r3, #1792 ; 0x700
|
|
80039ac: 429a cmp r2, r3
|
|
80039ae: d908 bls.n 80039c2 <HAL_RCC_ClockConfig+0xce>
|
|
{
|
|
assert_param(IS_RCC_PCLK2(RCC_ClkInitStruct->APB2CLKDivider));
|
|
MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE2, (RCC_ClkInitStruct->APB2CLKDivider));
|
|
80039b0: 4b61 ldr r3, [pc, #388] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
80039b2: 69db ldr r3, [r3, #28]
|
|
80039b4: f423 62e0 bic.w r2, r3, #1792 ; 0x700
|
|
80039b8: 687b ldr r3, [r7, #4]
|
|
80039ba: 699b ldr r3, [r3, #24]
|
|
80039bc: 495e ldr r1, [pc, #376] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
80039be: 4313 orrs r3, r2
|
|
80039c0: 61cb str r3, [r1, #28]
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------- D3PCLK1 Configuration ---------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_D3PCLK1) == RCC_CLOCKTYPE_D3PCLK1)
|
|
80039c2: 687b ldr r3, [r7, #4]
|
|
80039c4: 681b ldr r3, [r3, #0]
|
|
80039c6: f003 0320 and.w r3, r3, #32
|
|
80039ca: 2b00 cmp r3, #0
|
|
80039cc: d010 beq.n 80039f0 <HAL_RCC_ClockConfig+0xfc>
|
|
{
|
|
#if defined(RCC_D3CFGR_D3PPRE)
|
|
if ((RCC_ClkInitStruct->APB4CLKDivider) > (RCC->D3CFGR & RCC_D3CFGR_D3PPRE))
|
|
80039ce: 687b ldr r3, [r7, #4]
|
|
80039d0: 69da ldr r2, [r3, #28]
|
|
80039d2: 4b59 ldr r3, [pc, #356] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
80039d4: 6a1b ldr r3, [r3, #32]
|
|
80039d6: f003 0370 and.w r3, r3, #112 ; 0x70
|
|
80039da: 429a cmp r2, r3
|
|
80039dc: d908 bls.n 80039f0 <HAL_RCC_ClockConfig+0xfc>
|
|
{
|
|
assert_param(IS_RCC_D3PCLK1(RCC_ClkInitStruct->APB4CLKDivider));
|
|
MODIFY_REG(RCC->D3CFGR, RCC_D3CFGR_D3PPRE, (RCC_ClkInitStruct->APB4CLKDivider));
|
|
80039de: 4b56 ldr r3, [pc, #344] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
80039e0: 6a1b ldr r3, [r3, #32]
|
|
80039e2: f023 0270 bic.w r2, r3, #112 ; 0x70
|
|
80039e6: 687b ldr r3, [r7, #4]
|
|
80039e8: 69db ldr r3, [r3, #28]
|
|
80039ea: 4953 ldr r1, [pc, #332] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
80039ec: 4313 orrs r3, r2
|
|
80039ee: 620b str r3, [r1, #32]
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------- HCLK Configuration --------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK)
|
|
80039f0: 687b ldr r3, [r7, #4]
|
|
80039f2: 681b ldr r3, [r3, #0]
|
|
80039f4: f003 0302 and.w r3, r3, #2
|
|
80039f8: 2b00 cmp r3, #0
|
|
80039fa: d010 beq.n 8003a1e <HAL_RCC_ClockConfig+0x12a>
|
|
{
|
|
#if defined (RCC_D1CFGR_HPRE)
|
|
if ((RCC_ClkInitStruct->AHBCLKDivider) > (RCC->D1CFGR & RCC_D1CFGR_HPRE))
|
|
80039fc: 687b ldr r3, [r7, #4]
|
|
80039fe: 68da ldr r2, [r3, #12]
|
|
8003a00: 4b4d ldr r3, [pc, #308] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a02: 699b ldr r3, [r3, #24]
|
|
8003a04: f003 030f and.w r3, r3, #15
|
|
8003a08: 429a cmp r2, r3
|
|
8003a0a: d908 bls.n 8003a1e <HAL_RCC_ClockConfig+0x12a>
|
|
{
|
|
/* Set the new HCLK clock divider */
|
|
assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider));
|
|
MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider);
|
|
8003a0c: 4b4a ldr r3, [pc, #296] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a0e: 699b ldr r3, [r3, #24]
|
|
8003a10: f023 020f bic.w r2, r3, #15
|
|
8003a14: 687b ldr r3, [r7, #4]
|
|
8003a16: 68db ldr r3, [r3, #12]
|
|
8003a18: 4947 ldr r1, [pc, #284] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a1a: 4313 orrs r3, r2
|
|
8003a1c: 618b str r3, [r1, #24]
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*------------------------- SYSCLK Configuration -------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK)
|
|
8003a1e: 687b ldr r3, [r7, #4]
|
|
8003a20: 681b ldr r3, [r3, #0]
|
|
8003a22: f003 0301 and.w r3, r3, #1
|
|
8003a26: 2b00 cmp r3, #0
|
|
8003a28: d055 beq.n 8003ad6 <HAL_RCC_ClockConfig+0x1e2>
|
|
{
|
|
assert_param(IS_RCC_SYSCLK(RCC_ClkInitStruct->SYSCLKDivider));
|
|
assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource));
|
|
#if defined(RCC_D1CFGR_D1CPRE)
|
|
MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1CPRE, RCC_ClkInitStruct->SYSCLKDivider);
|
|
8003a2a: 4b43 ldr r3, [pc, #268] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a2c: 699b ldr r3, [r3, #24]
|
|
8003a2e: f423 6270 bic.w r2, r3, #3840 ; 0xf00
|
|
8003a32: 687b ldr r3, [r7, #4]
|
|
8003a34: 689b ldr r3, [r3, #8]
|
|
8003a36: 4940 ldr r1, [pc, #256] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a38: 4313 orrs r3, r2
|
|
8003a3a: 618b str r3, [r1, #24]
|
|
#else
|
|
MODIFY_REG(RCC->CDCFGR1, RCC_CDCFGR1_CDCPRE, RCC_ClkInitStruct->SYSCLKDivider);
|
|
#endif
|
|
/* HSE is selected as System Clock Source */
|
|
if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE)
|
|
8003a3c: 687b ldr r3, [r7, #4]
|
|
8003a3e: 685b ldr r3, [r3, #4]
|
|
8003a40: 2b02 cmp r3, #2
|
|
8003a42: d107 bne.n 8003a54 <HAL_RCC_ClockConfig+0x160>
|
|
{
|
|
/* Check the HSE ready flag */
|
|
if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == 0U)
|
|
8003a44: 4b3c ldr r3, [pc, #240] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a46: 681b ldr r3, [r3, #0]
|
|
8003a48: f403 3300 and.w r3, r3, #131072 ; 0x20000
|
|
8003a4c: 2b00 cmp r3, #0
|
|
8003a4e: d121 bne.n 8003a94 <HAL_RCC_ClockConfig+0x1a0>
|
|
{
|
|
return HAL_ERROR;
|
|
8003a50: 2301 movs r3, #1
|
|
8003a52: e0f6 b.n 8003c42 <HAL_RCC_ClockConfig+0x34e>
|
|
}
|
|
}
|
|
/* PLL is selected as System Clock Source */
|
|
else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK)
|
|
8003a54: 687b ldr r3, [r7, #4]
|
|
8003a56: 685b ldr r3, [r3, #4]
|
|
8003a58: 2b03 cmp r3, #3
|
|
8003a5a: d107 bne.n 8003a6c <HAL_RCC_ClockConfig+0x178>
|
|
{
|
|
/* Check the PLL ready flag */
|
|
if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == 0U)
|
|
8003a5c: 4b36 ldr r3, [pc, #216] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a5e: 681b ldr r3, [r3, #0]
|
|
8003a60: f003 7300 and.w r3, r3, #33554432 ; 0x2000000
|
|
8003a64: 2b00 cmp r3, #0
|
|
8003a66: d115 bne.n 8003a94 <HAL_RCC_ClockConfig+0x1a0>
|
|
{
|
|
return HAL_ERROR;
|
|
8003a68: 2301 movs r3, #1
|
|
8003a6a: e0ea b.n 8003c42 <HAL_RCC_ClockConfig+0x34e>
|
|
}
|
|
}
|
|
/* CSI is selected as System Clock Source */
|
|
else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_CSI)
|
|
8003a6c: 687b ldr r3, [r7, #4]
|
|
8003a6e: 685b ldr r3, [r3, #4]
|
|
8003a70: 2b01 cmp r3, #1
|
|
8003a72: d107 bne.n 8003a84 <HAL_RCC_ClockConfig+0x190>
|
|
{
|
|
/* Check the PLL ready flag */
|
|
if (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) == 0U)
|
|
8003a74: 4b30 ldr r3, [pc, #192] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a76: 681b ldr r3, [r3, #0]
|
|
8003a78: f403 7380 and.w r3, r3, #256 ; 0x100
|
|
8003a7c: 2b00 cmp r3, #0
|
|
8003a7e: d109 bne.n 8003a94 <HAL_RCC_ClockConfig+0x1a0>
|
|
{
|
|
return HAL_ERROR;
|
|
8003a80: 2301 movs r3, #1
|
|
8003a82: e0de b.n 8003c42 <HAL_RCC_ClockConfig+0x34e>
|
|
}
|
|
/* HSI is selected as System Clock Source */
|
|
else
|
|
{
|
|
/* Check the HSI ready flag */
|
|
if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
|
|
8003a84: 4b2c ldr r3, [pc, #176] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a86: 681b ldr r3, [r3, #0]
|
|
8003a88: f003 0304 and.w r3, r3, #4
|
|
8003a8c: 2b00 cmp r3, #0
|
|
8003a8e: d101 bne.n 8003a94 <HAL_RCC_ClockConfig+0x1a0>
|
|
{
|
|
return HAL_ERROR;
|
|
8003a90: 2301 movs r3, #1
|
|
8003a92: e0d6 b.n 8003c42 <HAL_RCC_ClockConfig+0x34e>
|
|
}
|
|
}
|
|
MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_ClkInitStruct->SYSCLKSource);
|
|
8003a94: 4b28 ldr r3, [pc, #160] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003a96: 691b ldr r3, [r3, #16]
|
|
8003a98: f023 0207 bic.w r2, r3, #7
|
|
8003a9c: 687b ldr r3, [r7, #4]
|
|
8003a9e: 685b ldr r3, [r3, #4]
|
|
8003aa0: 4925 ldr r1, [pc, #148] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003aa2: 4313 orrs r3, r2
|
|
8003aa4: 610b str r3, [r1, #16]
|
|
|
|
/* Get Start Tick*/
|
|
tickstart = HAL_GetTick();
|
|
8003aa6: f7fd fab1 bl 800100c <HAL_GetTick>
|
|
8003aaa: 6178 str r0, [r7, #20]
|
|
|
|
while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos))
|
|
8003aac: e00a b.n 8003ac4 <HAL_RCC_ClockConfig+0x1d0>
|
|
{
|
|
if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE)
|
|
8003aae: f7fd faad bl 800100c <HAL_GetTick>
|
|
8003ab2: 4602 mov r2, r0
|
|
8003ab4: 697b ldr r3, [r7, #20]
|
|
8003ab6: 1ad3 subs r3, r2, r3
|
|
8003ab8: f241 3288 movw r2, #5000 ; 0x1388
|
|
8003abc: 4293 cmp r3, r2
|
|
8003abe: d901 bls.n 8003ac4 <HAL_RCC_ClockConfig+0x1d0>
|
|
{
|
|
return HAL_TIMEOUT;
|
|
8003ac0: 2303 movs r3, #3
|
|
8003ac2: e0be b.n 8003c42 <HAL_RCC_ClockConfig+0x34e>
|
|
while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos))
|
|
8003ac4: 4b1c ldr r3, [pc, #112] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003ac6: 691b ldr r3, [r3, #16]
|
|
8003ac8: f003 0238 and.w r2, r3, #56 ; 0x38
|
|
8003acc: 687b ldr r3, [r7, #4]
|
|
8003ace: 685b ldr r3, [r3, #4]
|
|
8003ad0: 00db lsls r3, r3, #3
|
|
8003ad2: 429a cmp r2, r3
|
|
8003ad4: d1eb bne.n 8003aae <HAL_RCC_ClockConfig+0x1ba>
|
|
|
|
}
|
|
|
|
/* Decreasing the BUS frequency divider */
|
|
/*-------------------------- HCLK Configuration --------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK)
|
|
8003ad6: 687b ldr r3, [r7, #4]
|
|
8003ad8: 681b ldr r3, [r3, #0]
|
|
8003ada: f003 0302 and.w r3, r3, #2
|
|
8003ade: 2b00 cmp r3, #0
|
|
8003ae0: d010 beq.n 8003b04 <HAL_RCC_ClockConfig+0x210>
|
|
{
|
|
#if defined(RCC_D1CFGR_HPRE)
|
|
if ((RCC_ClkInitStruct->AHBCLKDivider) < (RCC->D1CFGR & RCC_D1CFGR_HPRE))
|
|
8003ae2: 687b ldr r3, [r7, #4]
|
|
8003ae4: 68da ldr r2, [r3, #12]
|
|
8003ae6: 4b14 ldr r3, [pc, #80] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003ae8: 699b ldr r3, [r3, #24]
|
|
8003aea: f003 030f and.w r3, r3, #15
|
|
8003aee: 429a cmp r2, r3
|
|
8003af0: d208 bcs.n 8003b04 <HAL_RCC_ClockConfig+0x210>
|
|
{
|
|
/* Set the new HCLK clock divider */
|
|
assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider));
|
|
MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider);
|
|
8003af2: 4b11 ldr r3, [pc, #68] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003af4: 699b ldr r3, [r3, #24]
|
|
8003af6: f023 020f bic.w r2, r3, #15
|
|
8003afa: 687b ldr r3, [r7, #4]
|
|
8003afc: 68db ldr r3, [r3, #12]
|
|
8003afe: 490e ldr r1, [pc, #56] ; (8003b38 <HAL_RCC_ClockConfig+0x244>)
|
|
8003b00: 4313 orrs r3, r2
|
|
8003b02: 618b str r3, [r1, #24]
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/* Decreasing the number of wait states because of lower CPU frequency */
|
|
if (FLatency < __HAL_FLASH_GET_LATENCY())
|
|
8003b04: 4b0b ldr r3, [pc, #44] ; (8003b34 <HAL_RCC_ClockConfig+0x240>)
|
|
8003b06: 681b ldr r3, [r3, #0]
|
|
8003b08: f003 030f and.w r3, r3, #15
|
|
8003b0c: 683a ldr r2, [r7, #0]
|
|
8003b0e: 429a cmp r2, r3
|
|
8003b10: d214 bcs.n 8003b3c <HAL_RCC_ClockConfig+0x248>
|
|
{
|
|
/* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
|
|
__HAL_FLASH_SET_LATENCY(FLatency);
|
|
8003b12: 4b08 ldr r3, [pc, #32] ; (8003b34 <HAL_RCC_ClockConfig+0x240>)
|
|
8003b14: 681b ldr r3, [r3, #0]
|
|
8003b16: f023 020f bic.w r2, r3, #15
|
|
8003b1a: 4906 ldr r1, [pc, #24] ; (8003b34 <HAL_RCC_ClockConfig+0x240>)
|
|
8003b1c: 683b ldr r3, [r7, #0]
|
|
8003b1e: 4313 orrs r3, r2
|
|
8003b20: 600b str r3, [r1, #0]
|
|
|
|
/* Check that the new number of wait states is taken into account to access the Flash
|
|
memory by reading the FLASH_ACR register */
|
|
if (__HAL_FLASH_GET_LATENCY() != FLatency)
|
|
8003b22: 4b04 ldr r3, [pc, #16] ; (8003b34 <HAL_RCC_ClockConfig+0x240>)
|
|
8003b24: 681b ldr r3, [r3, #0]
|
|
8003b26: f003 030f and.w r3, r3, #15
|
|
8003b2a: 683a ldr r2, [r7, #0]
|
|
8003b2c: 429a cmp r2, r3
|
|
8003b2e: d005 beq.n 8003b3c <HAL_RCC_ClockConfig+0x248>
|
|
{
|
|
return HAL_ERROR;
|
|
8003b30: 2301 movs r3, #1
|
|
8003b32: e086 b.n 8003c42 <HAL_RCC_ClockConfig+0x34e>
|
|
8003b34: 52002000 .word 0x52002000
|
|
8003b38: 58024400 .word 0x58024400
|
|
}
|
|
}
|
|
|
|
/*-------------------------- D1PCLK1/CDPCLK Configuration ---------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_D1PCLK1) == RCC_CLOCKTYPE_D1PCLK1)
|
|
8003b3c: 687b ldr r3, [r7, #4]
|
|
8003b3e: 681b ldr r3, [r3, #0]
|
|
8003b40: f003 0304 and.w r3, r3, #4
|
|
8003b44: 2b00 cmp r3, #0
|
|
8003b46: d010 beq.n 8003b6a <HAL_RCC_ClockConfig+0x276>
|
|
{
|
|
#if defined(RCC_D1CFGR_D1PPRE)
|
|
if ((RCC_ClkInitStruct->APB3CLKDivider) < (RCC->D1CFGR & RCC_D1CFGR_D1PPRE))
|
|
8003b48: 687b ldr r3, [r7, #4]
|
|
8003b4a: 691a ldr r2, [r3, #16]
|
|
8003b4c: 4b3f ldr r3, [pc, #252] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003b4e: 699b ldr r3, [r3, #24]
|
|
8003b50: f003 0370 and.w r3, r3, #112 ; 0x70
|
|
8003b54: 429a cmp r2, r3
|
|
8003b56: d208 bcs.n 8003b6a <HAL_RCC_ClockConfig+0x276>
|
|
{
|
|
assert_param(IS_RCC_D1PCLK1(RCC_ClkInitStruct->APB3CLKDivider));
|
|
MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1PPRE, RCC_ClkInitStruct->APB3CLKDivider);
|
|
8003b58: 4b3c ldr r3, [pc, #240] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003b5a: 699b ldr r3, [r3, #24]
|
|
8003b5c: f023 0270 bic.w r2, r3, #112 ; 0x70
|
|
8003b60: 687b ldr r3, [r7, #4]
|
|
8003b62: 691b ldr r3, [r3, #16]
|
|
8003b64: 4939 ldr r1, [pc, #228] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003b66: 4313 orrs r3, r2
|
|
8003b68: 618b str r3, [r1, #24]
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------- PCLK1 Configuration ---------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1)
|
|
8003b6a: 687b ldr r3, [r7, #4]
|
|
8003b6c: 681b ldr r3, [r3, #0]
|
|
8003b6e: f003 0308 and.w r3, r3, #8
|
|
8003b72: 2b00 cmp r3, #0
|
|
8003b74: d010 beq.n 8003b98 <HAL_RCC_ClockConfig+0x2a4>
|
|
{
|
|
#if defined(RCC_D2CFGR_D2PPRE1)
|
|
if ((RCC_ClkInitStruct->APB1CLKDivider) < (RCC->D2CFGR & RCC_D2CFGR_D2PPRE1))
|
|
8003b76: 687b ldr r3, [r7, #4]
|
|
8003b78: 695a ldr r2, [r3, #20]
|
|
8003b7a: 4b34 ldr r3, [pc, #208] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003b7c: 69db ldr r3, [r3, #28]
|
|
8003b7e: f003 0370 and.w r3, r3, #112 ; 0x70
|
|
8003b82: 429a cmp r2, r3
|
|
8003b84: d208 bcs.n 8003b98 <HAL_RCC_ClockConfig+0x2a4>
|
|
{
|
|
assert_param(IS_RCC_PCLK1(RCC_ClkInitStruct->APB1CLKDivider));
|
|
MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE1, (RCC_ClkInitStruct->APB1CLKDivider));
|
|
8003b86: 4b31 ldr r3, [pc, #196] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003b88: 69db ldr r3, [r3, #28]
|
|
8003b8a: f023 0270 bic.w r2, r3, #112 ; 0x70
|
|
8003b8e: 687b ldr r3, [r7, #4]
|
|
8003b90: 695b ldr r3, [r3, #20]
|
|
8003b92: 492e ldr r1, [pc, #184] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003b94: 4313 orrs r3, r2
|
|
8003b96: 61cb str r3, [r1, #28]
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------- PCLK2 Configuration ---------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)
|
|
8003b98: 687b ldr r3, [r7, #4]
|
|
8003b9a: 681b ldr r3, [r3, #0]
|
|
8003b9c: f003 0310 and.w r3, r3, #16
|
|
8003ba0: 2b00 cmp r3, #0
|
|
8003ba2: d010 beq.n 8003bc6 <HAL_RCC_ClockConfig+0x2d2>
|
|
{
|
|
#if defined (RCC_D2CFGR_D2PPRE2)
|
|
if ((RCC_ClkInitStruct->APB2CLKDivider) < (RCC->D2CFGR & RCC_D2CFGR_D2PPRE2))
|
|
8003ba4: 687b ldr r3, [r7, #4]
|
|
8003ba6: 699a ldr r2, [r3, #24]
|
|
8003ba8: 4b28 ldr r3, [pc, #160] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003baa: 69db ldr r3, [r3, #28]
|
|
8003bac: f403 63e0 and.w r3, r3, #1792 ; 0x700
|
|
8003bb0: 429a cmp r2, r3
|
|
8003bb2: d208 bcs.n 8003bc6 <HAL_RCC_ClockConfig+0x2d2>
|
|
{
|
|
assert_param(IS_RCC_PCLK2(RCC_ClkInitStruct->APB2CLKDivider));
|
|
MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE2, (RCC_ClkInitStruct->APB2CLKDivider));
|
|
8003bb4: 4b25 ldr r3, [pc, #148] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003bb6: 69db ldr r3, [r3, #28]
|
|
8003bb8: f423 62e0 bic.w r2, r3, #1792 ; 0x700
|
|
8003bbc: 687b ldr r3, [r7, #4]
|
|
8003bbe: 699b ldr r3, [r3, #24]
|
|
8003bc0: 4922 ldr r1, [pc, #136] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003bc2: 4313 orrs r3, r2
|
|
8003bc4: 61cb str r3, [r1, #28]
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------- D3PCLK1/SRDPCLK1 Configuration ---------------------------*/
|
|
if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_D3PCLK1) == RCC_CLOCKTYPE_D3PCLK1)
|
|
8003bc6: 687b ldr r3, [r7, #4]
|
|
8003bc8: 681b ldr r3, [r3, #0]
|
|
8003bca: f003 0320 and.w r3, r3, #32
|
|
8003bce: 2b00 cmp r3, #0
|
|
8003bd0: d010 beq.n 8003bf4 <HAL_RCC_ClockConfig+0x300>
|
|
{
|
|
#if defined(RCC_D3CFGR_D3PPRE)
|
|
if ((RCC_ClkInitStruct->APB4CLKDivider) < (RCC->D3CFGR & RCC_D3CFGR_D3PPRE))
|
|
8003bd2: 687b ldr r3, [r7, #4]
|
|
8003bd4: 69da ldr r2, [r3, #28]
|
|
8003bd6: 4b1d ldr r3, [pc, #116] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003bd8: 6a1b ldr r3, [r3, #32]
|
|
8003bda: f003 0370 and.w r3, r3, #112 ; 0x70
|
|
8003bde: 429a cmp r2, r3
|
|
8003be0: d208 bcs.n 8003bf4 <HAL_RCC_ClockConfig+0x300>
|
|
{
|
|
assert_param(IS_RCC_D3PCLK1(RCC_ClkInitStruct->APB4CLKDivider));
|
|
MODIFY_REG(RCC->D3CFGR, RCC_D3CFGR_D3PPRE, (RCC_ClkInitStruct->APB4CLKDivider));
|
|
8003be2: 4b1a ldr r3, [pc, #104] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003be4: 6a1b ldr r3, [r3, #32]
|
|
8003be6: f023 0270 bic.w r2, r3, #112 ; 0x70
|
|
8003bea: 687b ldr r3, [r7, #4]
|
|
8003bec: 69db ldr r3, [r3, #28]
|
|
8003bee: 4917 ldr r1, [pc, #92] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003bf0: 4313 orrs r3, r2
|
|
8003bf2: 620b str r3, [r1, #32]
|
|
#endif
|
|
}
|
|
|
|
/* Update the SystemCoreClock global variable */
|
|
#if defined(RCC_D1CFGR_D1CPRE)
|
|
common_system_clock = HAL_RCC_GetSysClockFreq() >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_D1CPRE) >> RCC_D1CFGR_D1CPRE_Pos]) & 0x1FU);
|
|
8003bf4: f000 f834 bl 8003c60 <HAL_RCC_GetSysClockFreq>
|
|
8003bf8: 4602 mov r2, r0
|
|
8003bfa: 4b14 ldr r3, [pc, #80] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003bfc: 699b ldr r3, [r3, #24]
|
|
8003bfe: 0a1b lsrs r3, r3, #8
|
|
8003c00: f003 030f and.w r3, r3, #15
|
|
8003c04: 4912 ldr r1, [pc, #72] ; (8003c50 <HAL_RCC_ClockConfig+0x35c>)
|
|
8003c06: 5ccb ldrb r3, [r1, r3]
|
|
8003c08: f003 031f and.w r3, r3, #31
|
|
8003c0c: fa22 f303 lsr.w r3, r2, r3
|
|
8003c10: 613b str r3, [r7, #16]
|
|
#else
|
|
common_system_clock = HAL_RCC_GetSysClockFreq() >> ((D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_CDCPRE) >> RCC_CDCFGR1_CDCPRE_Pos]) & 0x1FU);
|
|
#endif
|
|
|
|
#if defined(RCC_D1CFGR_HPRE)
|
|
SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_HPRE) >> RCC_D1CFGR_HPRE_Pos]) & 0x1FU));
|
|
8003c12: 4b0e ldr r3, [pc, #56] ; (8003c4c <HAL_RCC_ClockConfig+0x358>)
|
|
8003c14: 699b ldr r3, [r3, #24]
|
|
8003c16: f003 030f and.w r3, r3, #15
|
|
8003c1a: 4a0d ldr r2, [pc, #52] ; (8003c50 <HAL_RCC_ClockConfig+0x35c>)
|
|
8003c1c: 5cd3 ldrb r3, [r2, r3]
|
|
8003c1e: f003 031f and.w r3, r3, #31
|
|
8003c22: 693a ldr r2, [r7, #16]
|
|
8003c24: fa22 f303 lsr.w r3, r2, r3
|
|
8003c28: 4a0a ldr r2, [pc, #40] ; (8003c54 <HAL_RCC_ClockConfig+0x360>)
|
|
8003c2a: 6013 str r3, [r2, #0]
|
|
#endif
|
|
|
|
#if defined(DUAL_CORE) && defined(CORE_CM4)
|
|
SystemCoreClock = SystemD2Clock;
|
|
#else
|
|
SystemCoreClock = common_system_clock;
|
|
8003c2c: 4a0a ldr r2, [pc, #40] ; (8003c58 <HAL_RCC_ClockConfig+0x364>)
|
|
8003c2e: 693b ldr r3, [r7, #16]
|
|
8003c30: 6013 str r3, [r2, #0]
|
|
#endif /* DUAL_CORE && CORE_CM4 */
|
|
|
|
/* Configure the source of time base considering new system clocks settings*/
|
|
halstatus = HAL_InitTick(uwTickPrio);
|
|
8003c32: 4b0a ldr r3, [pc, #40] ; (8003c5c <HAL_RCC_ClockConfig+0x368>)
|
|
8003c34: 681b ldr r3, [r3, #0]
|
|
8003c36: 4618 mov r0, r3
|
|
8003c38: f7fd f99e bl 8000f78 <HAL_InitTick>
|
|
8003c3c: 4603 mov r3, r0
|
|
8003c3e: 73fb strb r3, [r7, #15]
|
|
|
|
return halstatus;
|
|
8003c40: 7bfb ldrb r3, [r7, #15]
|
|
}
|
|
8003c42: 4618 mov r0, r3
|
|
8003c44: 3718 adds r7, #24
|
|
8003c46: 46bd mov sp, r7
|
|
8003c48: bd80 pop {r7, pc}
|
|
8003c4a: bf00 nop
|
|
8003c4c: 58024400 .word 0x58024400
|
|
8003c50: 08014c80 .word 0x08014c80
|
|
8003c54: 24000004 .word 0x24000004
|
|
8003c58: 24000000 .word 0x24000000
|
|
8003c5c: 24000008 .word 0x24000008
|
|
|
|
08003c60 <HAL_RCC_GetSysClockFreq>:
|
|
*
|
|
*
|
|
* @retval SYSCLK frequency
|
|
*/
|
|
uint32_t HAL_RCC_GetSysClockFreq(void)
|
|
{
|
|
8003c60: b480 push {r7}
|
|
8003c62: b089 sub sp, #36 ; 0x24
|
|
8003c64: af00 add r7, sp, #0
|
|
float_t fracn1, pllvco;
|
|
uint32_t sysclockfreq;
|
|
|
|
/* Get SYSCLK source -------------------------------------------------------*/
|
|
|
|
switch (RCC->CFGR & RCC_CFGR_SWS)
|
|
8003c66: 4bb3 ldr r3, [pc, #716] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003c68: 691b ldr r3, [r3, #16]
|
|
8003c6a: f003 0338 and.w r3, r3, #56 ; 0x38
|
|
8003c6e: 2b18 cmp r3, #24
|
|
8003c70: f200 8155 bhi.w 8003f1e <HAL_RCC_GetSysClockFreq+0x2be>
|
|
8003c74: a201 add r2, pc, #4 ; (adr r2, 8003c7c <HAL_RCC_GetSysClockFreq+0x1c>)
|
|
8003c76: f852 f023 ldr.w pc, [r2, r3, lsl #2]
|
|
8003c7a: bf00 nop
|
|
8003c7c: 08003ce1 .word 0x08003ce1
|
|
8003c80: 08003f1f .word 0x08003f1f
|
|
8003c84: 08003f1f .word 0x08003f1f
|
|
8003c88: 08003f1f .word 0x08003f1f
|
|
8003c8c: 08003f1f .word 0x08003f1f
|
|
8003c90: 08003f1f .word 0x08003f1f
|
|
8003c94: 08003f1f .word 0x08003f1f
|
|
8003c98: 08003f1f .word 0x08003f1f
|
|
8003c9c: 08003d07 .word 0x08003d07
|
|
8003ca0: 08003f1f .word 0x08003f1f
|
|
8003ca4: 08003f1f .word 0x08003f1f
|
|
8003ca8: 08003f1f .word 0x08003f1f
|
|
8003cac: 08003f1f .word 0x08003f1f
|
|
8003cb0: 08003f1f .word 0x08003f1f
|
|
8003cb4: 08003f1f .word 0x08003f1f
|
|
8003cb8: 08003f1f .word 0x08003f1f
|
|
8003cbc: 08003d0d .word 0x08003d0d
|
|
8003cc0: 08003f1f .word 0x08003f1f
|
|
8003cc4: 08003f1f .word 0x08003f1f
|
|
8003cc8: 08003f1f .word 0x08003f1f
|
|
8003ccc: 08003f1f .word 0x08003f1f
|
|
8003cd0: 08003f1f .word 0x08003f1f
|
|
8003cd4: 08003f1f .word 0x08003f1f
|
|
8003cd8: 08003f1f .word 0x08003f1f
|
|
8003cdc: 08003d13 .word 0x08003d13
|
|
{
|
|
case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */
|
|
|
|
if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
|
|
8003ce0: 4b94 ldr r3, [pc, #592] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003ce2: 681b ldr r3, [r3, #0]
|
|
8003ce4: f003 0320 and.w r3, r3, #32
|
|
8003ce8: 2b00 cmp r3, #0
|
|
8003cea: d009 beq.n 8003d00 <HAL_RCC_GetSysClockFreq+0xa0>
|
|
{
|
|
sysclockfreq = (uint32_t)(HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3));
|
|
8003cec: 4b91 ldr r3, [pc, #580] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003cee: 681b ldr r3, [r3, #0]
|
|
8003cf0: 08db lsrs r3, r3, #3
|
|
8003cf2: f003 0303 and.w r3, r3, #3
|
|
8003cf6: 4a90 ldr r2, [pc, #576] ; (8003f38 <HAL_RCC_GetSysClockFreq+0x2d8>)
|
|
8003cf8: fa22 f303 lsr.w r3, r2, r3
|
|
8003cfc: 61bb str r3, [r7, #24]
|
|
else
|
|
{
|
|
sysclockfreq = (uint32_t) HSI_VALUE;
|
|
}
|
|
|
|
break;
|
|
8003cfe: e111 b.n 8003f24 <HAL_RCC_GetSysClockFreq+0x2c4>
|
|
sysclockfreq = (uint32_t) HSI_VALUE;
|
|
8003d00: 4b8d ldr r3, [pc, #564] ; (8003f38 <HAL_RCC_GetSysClockFreq+0x2d8>)
|
|
8003d02: 61bb str r3, [r7, #24]
|
|
break;
|
|
8003d04: e10e b.n 8003f24 <HAL_RCC_GetSysClockFreq+0x2c4>
|
|
|
|
case RCC_CFGR_SWS_CSI: /* CSI used as system clock source */
|
|
sysclockfreq = CSI_VALUE;
|
|
8003d06: 4b8d ldr r3, [pc, #564] ; (8003f3c <HAL_RCC_GetSysClockFreq+0x2dc>)
|
|
8003d08: 61bb str r3, [r7, #24]
|
|
break;
|
|
8003d0a: e10b b.n 8003f24 <HAL_RCC_GetSysClockFreq+0x2c4>
|
|
|
|
case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */
|
|
sysclockfreq = HSE_VALUE;
|
|
8003d0c: 4b8c ldr r3, [pc, #560] ; (8003f40 <HAL_RCC_GetSysClockFreq+0x2e0>)
|
|
8003d0e: 61bb str r3, [r7, #24]
|
|
break;
|
|
8003d10: e108 b.n 8003f24 <HAL_RCC_GetSysClockFreq+0x2c4>
|
|
case RCC_CFGR_SWS_PLL1: /* PLL1 used as system clock source */
|
|
|
|
/* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLLM) * PLLN
|
|
SYSCLK = PLL_VCO / PLLR
|
|
*/
|
|
pllsource = (RCC->PLLCKSELR & RCC_PLLCKSELR_PLLSRC);
|
|
8003d12: 4b88 ldr r3, [pc, #544] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003d14: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
8003d16: f003 0303 and.w r3, r3, #3
|
|
8003d1a: 617b str r3, [r7, #20]
|
|
pllm = ((RCC->PLLCKSELR & RCC_PLLCKSELR_DIVM1) >> 4) ;
|
|
8003d1c: 4b85 ldr r3, [pc, #532] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003d1e: 6a9b ldr r3, [r3, #40] ; 0x28
|
|
8003d20: 091b lsrs r3, r3, #4
|
|
8003d22: f003 033f and.w r3, r3, #63 ; 0x3f
|
|
8003d26: 613b str r3, [r7, #16]
|
|
pllfracen = ((RCC-> PLLCFGR & RCC_PLLCFGR_PLL1FRACEN) >> RCC_PLLCFGR_PLL1FRACEN_Pos);
|
|
8003d28: 4b82 ldr r3, [pc, #520] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003d2a: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8003d2c: f003 0301 and.w r3, r3, #1
|
|
8003d30: 60fb str r3, [r7, #12]
|
|
fracn1 = (float_t)(uint32_t)(pllfracen * ((RCC->PLL1FRACR & RCC_PLL1FRACR_FRACN1) >> 3));
|
|
8003d32: 4b80 ldr r3, [pc, #512] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003d34: 6b5b ldr r3, [r3, #52] ; 0x34
|
|
8003d36: 08db lsrs r3, r3, #3
|
|
8003d38: f3c3 030c ubfx r3, r3, #0, #13
|
|
8003d3c: 68fa ldr r2, [r7, #12]
|
|
8003d3e: fb02 f303 mul.w r3, r2, r3
|
|
8003d42: ee07 3a90 vmov s15, r3
|
|
8003d46: eef8 7a67 vcvt.f32.u32 s15, s15
|
|
8003d4a: edc7 7a02 vstr s15, [r7, #8]
|
|
|
|
if (pllm != 0U)
|
|
8003d4e: 693b ldr r3, [r7, #16]
|
|
8003d50: 2b00 cmp r3, #0
|
|
8003d52: f000 80e1 beq.w 8003f18 <HAL_RCC_GetSysClockFreq+0x2b8>
|
|
8003d56: 697b ldr r3, [r7, #20]
|
|
8003d58: 2b02 cmp r3, #2
|
|
8003d5a: f000 8083 beq.w 8003e64 <HAL_RCC_GetSysClockFreq+0x204>
|
|
8003d5e: 697b ldr r3, [r7, #20]
|
|
8003d60: 2b02 cmp r3, #2
|
|
8003d62: f200 80a1 bhi.w 8003ea8 <HAL_RCC_GetSysClockFreq+0x248>
|
|
8003d66: 697b ldr r3, [r7, #20]
|
|
8003d68: 2b00 cmp r3, #0
|
|
8003d6a: d003 beq.n 8003d74 <HAL_RCC_GetSysClockFreq+0x114>
|
|
8003d6c: 697b ldr r3, [r7, #20]
|
|
8003d6e: 2b01 cmp r3, #1
|
|
8003d70: d056 beq.n 8003e20 <HAL_RCC_GetSysClockFreq+0x1c0>
|
|
8003d72: e099 b.n 8003ea8 <HAL_RCC_GetSysClockFreq+0x248>
|
|
{
|
|
switch (pllsource)
|
|
{
|
|
case RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
|
|
|
|
if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
|
|
8003d74: 4b6f ldr r3, [pc, #444] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003d76: 681b ldr r3, [r3, #0]
|
|
8003d78: f003 0320 and.w r3, r3, #32
|
|
8003d7c: 2b00 cmp r3, #0
|
|
8003d7e: d02d beq.n 8003ddc <HAL_RCC_GetSysClockFreq+0x17c>
|
|
{
|
|
hsivalue = (HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3));
|
|
8003d80: 4b6c ldr r3, [pc, #432] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003d82: 681b ldr r3, [r3, #0]
|
|
8003d84: 08db lsrs r3, r3, #3
|
|
8003d86: f003 0303 and.w r3, r3, #3
|
|
8003d8a: 4a6b ldr r2, [pc, #428] ; (8003f38 <HAL_RCC_GetSysClockFreq+0x2d8>)
|
|
8003d8c: fa22 f303 lsr.w r3, r2, r3
|
|
8003d90: 607b str r3, [r7, #4]
|
|
pllvco = ((float_t)hsivalue / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
|
|
8003d92: 687b ldr r3, [r7, #4]
|
|
8003d94: ee07 3a90 vmov s15, r3
|
|
8003d98: eef8 6a67 vcvt.f32.u32 s13, s15
|
|
8003d9c: 693b ldr r3, [r7, #16]
|
|
8003d9e: ee07 3a90 vmov s15, r3
|
|
8003da2: eef8 7a67 vcvt.f32.u32 s15, s15
|
|
8003da6: ee86 7aa7 vdiv.f32 s14, s13, s15
|
|
8003daa: 4b62 ldr r3, [pc, #392] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003dac: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8003dae: f3c3 0308 ubfx r3, r3, #0, #9
|
|
8003db2: ee07 3a90 vmov s15, r3
|
|
8003db6: eef8 6a67 vcvt.f32.u32 s13, s15
|
|
8003dba: ed97 6a02 vldr s12, [r7, #8]
|
|
8003dbe: eddf 5a61 vldr s11, [pc, #388] ; 8003f44 <HAL_RCC_GetSysClockFreq+0x2e4>
|
|
8003dc2: eec6 7a25 vdiv.f32 s15, s12, s11
|
|
8003dc6: ee76 7aa7 vadd.f32 s15, s13, s15
|
|
8003dca: eef7 6a00 vmov.f32 s13, #112 ; 0x3f800000 1.0
|
|
8003dce: ee77 7aa6 vadd.f32 s15, s15, s13
|
|
8003dd2: ee67 7a27 vmul.f32 s15, s14, s15
|
|
8003dd6: edc7 7a07 vstr s15, [r7, #28]
|
|
}
|
|
else
|
|
{
|
|
pllvco = ((float_t)HSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
|
|
}
|
|
break;
|
|
8003dda: e087 b.n 8003eec <HAL_RCC_GetSysClockFreq+0x28c>
|
|
pllvco = ((float_t)HSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
|
|
8003ddc: 693b ldr r3, [r7, #16]
|
|
8003dde: ee07 3a90 vmov s15, r3
|
|
8003de2: eef8 7a67 vcvt.f32.u32 s15, s15
|
|
8003de6: eddf 6a58 vldr s13, [pc, #352] ; 8003f48 <HAL_RCC_GetSysClockFreq+0x2e8>
|
|
8003dea: ee86 7aa7 vdiv.f32 s14, s13, s15
|
|
8003dee: 4b51 ldr r3, [pc, #324] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003df0: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8003df2: f3c3 0308 ubfx r3, r3, #0, #9
|
|
8003df6: ee07 3a90 vmov s15, r3
|
|
8003dfa: eef8 6a67 vcvt.f32.u32 s13, s15
|
|
8003dfe: ed97 6a02 vldr s12, [r7, #8]
|
|
8003e02: eddf 5a50 vldr s11, [pc, #320] ; 8003f44 <HAL_RCC_GetSysClockFreq+0x2e4>
|
|
8003e06: eec6 7a25 vdiv.f32 s15, s12, s11
|
|
8003e0a: ee76 7aa7 vadd.f32 s15, s13, s15
|
|
8003e0e: eef7 6a00 vmov.f32 s13, #112 ; 0x3f800000 1.0
|
|
8003e12: ee77 7aa6 vadd.f32 s15, s15, s13
|
|
8003e16: ee67 7a27 vmul.f32 s15, s14, s15
|
|
8003e1a: edc7 7a07 vstr s15, [r7, #28]
|
|
break;
|
|
8003e1e: e065 b.n 8003eec <HAL_RCC_GetSysClockFreq+0x28c>
|
|
|
|
case RCC_PLLSOURCE_CSI: /* CSI used as PLL clock source */
|
|
pllvco = ((float_t)CSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
|
|
8003e20: 693b ldr r3, [r7, #16]
|
|
8003e22: ee07 3a90 vmov s15, r3
|
|
8003e26: eef8 7a67 vcvt.f32.u32 s15, s15
|
|
8003e2a: eddf 6a48 vldr s13, [pc, #288] ; 8003f4c <HAL_RCC_GetSysClockFreq+0x2ec>
|
|
8003e2e: ee86 7aa7 vdiv.f32 s14, s13, s15
|
|
8003e32: 4b40 ldr r3, [pc, #256] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003e34: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8003e36: f3c3 0308 ubfx r3, r3, #0, #9
|
|
8003e3a: ee07 3a90 vmov s15, r3
|
|
8003e3e: eef8 6a67 vcvt.f32.u32 s13, s15
|
|
8003e42: ed97 6a02 vldr s12, [r7, #8]
|
|
8003e46: eddf 5a3f vldr s11, [pc, #252] ; 8003f44 <HAL_RCC_GetSysClockFreq+0x2e4>
|
|
8003e4a: eec6 7a25 vdiv.f32 s15, s12, s11
|
|
8003e4e: ee76 7aa7 vadd.f32 s15, s13, s15
|
|
8003e52: eef7 6a00 vmov.f32 s13, #112 ; 0x3f800000 1.0
|
|
8003e56: ee77 7aa6 vadd.f32 s15, s15, s13
|
|
8003e5a: ee67 7a27 vmul.f32 s15, s14, s15
|
|
8003e5e: edc7 7a07 vstr s15, [r7, #28]
|
|
break;
|
|
8003e62: e043 b.n 8003eec <HAL_RCC_GetSysClockFreq+0x28c>
|
|
|
|
case RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
|
|
pllvco = ((float_t)HSE_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
|
|
8003e64: 693b ldr r3, [r7, #16]
|
|
8003e66: ee07 3a90 vmov s15, r3
|
|
8003e6a: eef8 7a67 vcvt.f32.u32 s15, s15
|
|
8003e6e: eddf 6a38 vldr s13, [pc, #224] ; 8003f50 <HAL_RCC_GetSysClockFreq+0x2f0>
|
|
8003e72: ee86 7aa7 vdiv.f32 s14, s13, s15
|
|
8003e76: 4b2f ldr r3, [pc, #188] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003e78: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8003e7a: f3c3 0308 ubfx r3, r3, #0, #9
|
|
8003e7e: ee07 3a90 vmov s15, r3
|
|
8003e82: eef8 6a67 vcvt.f32.u32 s13, s15
|
|
8003e86: ed97 6a02 vldr s12, [r7, #8]
|
|
8003e8a: eddf 5a2e vldr s11, [pc, #184] ; 8003f44 <HAL_RCC_GetSysClockFreq+0x2e4>
|
|
8003e8e: eec6 7a25 vdiv.f32 s15, s12, s11
|
|
8003e92: ee76 7aa7 vadd.f32 s15, s13, s15
|
|
8003e96: eef7 6a00 vmov.f32 s13, #112 ; 0x3f800000 1.0
|
|
8003e9a: ee77 7aa6 vadd.f32 s15, s15, s13
|
|
8003e9e: ee67 7a27 vmul.f32 s15, s14, s15
|
|
8003ea2: edc7 7a07 vstr s15, [r7, #28]
|
|
break;
|
|
8003ea6: e021 b.n 8003eec <HAL_RCC_GetSysClockFreq+0x28c>
|
|
|
|
default:
|
|
pllvco = ((float_t)CSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
|
|
8003ea8: 693b ldr r3, [r7, #16]
|
|
8003eaa: ee07 3a90 vmov s15, r3
|
|
8003eae: eef8 7a67 vcvt.f32.u32 s15, s15
|
|
8003eb2: eddf 6a26 vldr s13, [pc, #152] ; 8003f4c <HAL_RCC_GetSysClockFreq+0x2ec>
|
|
8003eb6: ee86 7aa7 vdiv.f32 s14, s13, s15
|
|
8003eba: 4b1e ldr r3, [pc, #120] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003ebc: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8003ebe: f3c3 0308 ubfx r3, r3, #0, #9
|
|
8003ec2: ee07 3a90 vmov s15, r3
|
|
8003ec6: eef8 6a67 vcvt.f32.u32 s13, s15
|
|
8003eca: ed97 6a02 vldr s12, [r7, #8]
|
|
8003ece: eddf 5a1d vldr s11, [pc, #116] ; 8003f44 <HAL_RCC_GetSysClockFreq+0x2e4>
|
|
8003ed2: eec6 7a25 vdiv.f32 s15, s12, s11
|
|
8003ed6: ee76 7aa7 vadd.f32 s15, s13, s15
|
|
8003eda: eef7 6a00 vmov.f32 s13, #112 ; 0x3f800000 1.0
|
|
8003ede: ee77 7aa6 vadd.f32 s15, s15, s13
|
|
8003ee2: ee67 7a27 vmul.f32 s15, s14, s15
|
|
8003ee6: edc7 7a07 vstr s15, [r7, #28]
|
|
break;
|
|
8003eea: bf00 nop
|
|
}
|
|
pllp = (((RCC->PLL1DIVR & RCC_PLL1DIVR_P1) >> 9) + 1U) ;
|
|
8003eec: 4b11 ldr r3, [pc, #68] ; (8003f34 <HAL_RCC_GetSysClockFreq+0x2d4>)
|
|
8003eee: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8003ef0: 0a5b lsrs r3, r3, #9
|
|
8003ef2: f003 037f and.w r3, r3, #127 ; 0x7f
|
|
8003ef6: 3301 adds r3, #1
|
|
8003ef8: 603b str r3, [r7, #0]
|
|
sysclockfreq = (uint32_t)(float_t)(pllvco / (float_t)pllp);
|
|
8003efa: 683b ldr r3, [r7, #0]
|
|
8003efc: ee07 3a90 vmov s15, r3
|
|
8003f00: eeb8 7a67 vcvt.f32.u32 s14, s15
|
|
8003f04: edd7 6a07 vldr s13, [r7, #28]
|
|
8003f08: eec6 7a87 vdiv.f32 s15, s13, s14
|
|
8003f0c: eefc 7ae7 vcvt.u32.f32 s15, s15
|
|
8003f10: ee17 3a90 vmov r3, s15
|
|
8003f14: 61bb str r3, [r7, #24]
|
|
}
|
|
else
|
|
{
|
|
sysclockfreq = 0U;
|
|
}
|
|
break;
|
|
8003f16: e005 b.n 8003f24 <HAL_RCC_GetSysClockFreq+0x2c4>
|
|
sysclockfreq = 0U;
|
|
8003f18: 2300 movs r3, #0
|
|
8003f1a: 61bb str r3, [r7, #24]
|
|
break;
|
|
8003f1c: e002 b.n 8003f24 <HAL_RCC_GetSysClockFreq+0x2c4>
|
|
|
|
default:
|
|
sysclockfreq = CSI_VALUE;
|
|
8003f1e: 4b07 ldr r3, [pc, #28] ; (8003f3c <HAL_RCC_GetSysClockFreq+0x2dc>)
|
|
8003f20: 61bb str r3, [r7, #24]
|
|
break;
|
|
8003f22: bf00 nop
|
|
}
|
|
|
|
return sysclockfreq;
|
|
8003f24: 69bb ldr r3, [r7, #24]
|
|
}
|
|
8003f26: 4618 mov r0, r3
|
|
8003f28: 3724 adds r7, #36 ; 0x24
|
|
8003f2a: 46bd mov sp, r7
|
|
8003f2c: f85d 7b04 ldr.w r7, [sp], #4
|
|
8003f30: 4770 bx lr
|
|
8003f32: bf00 nop
|
|
8003f34: 58024400 .word 0x58024400
|
|
8003f38: 03d09000 .word 0x03d09000
|
|
8003f3c: 003d0900 .word 0x003d0900
|
|
8003f40: 017d7840 .word 0x017d7840
|
|
8003f44: 46000000 .word 0x46000000
|
|
8003f48: 4c742400 .word 0x4c742400
|
|
8003f4c: 4a742400 .word 0x4a742400
|
|
8003f50: 4bbebc20 .word 0x4bbebc20
|
|
|
|
08003f54 <HAL_RCC_GetHCLKFreq>:
|
|
* @note The SystemD2Clock CMSIS variable is used to store System domain2 Clock Frequency
|
|
* and updated within this function
|
|
* @retval HCLK frequency
|
|
*/
|
|
uint32_t HAL_RCC_GetHCLKFreq(void)
|
|
{
|
|
8003f54: b580 push {r7, lr}
|
|
8003f56: b082 sub sp, #8
|
|
8003f58: af00 add r7, sp, #0
|
|
uint32_t common_system_clock;
|
|
|
|
#if defined(RCC_D1CFGR_D1CPRE)
|
|
common_system_clock = HAL_RCC_GetSysClockFreq() >> (D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_D1CPRE) >> RCC_D1CFGR_D1CPRE_Pos] & 0x1FU);
|
|
8003f5a: f7ff fe81 bl 8003c60 <HAL_RCC_GetSysClockFreq>
|
|
8003f5e: 4602 mov r2, r0
|
|
8003f60: 4b10 ldr r3, [pc, #64] ; (8003fa4 <HAL_RCC_GetHCLKFreq+0x50>)
|
|
8003f62: 699b ldr r3, [r3, #24]
|
|
8003f64: 0a1b lsrs r3, r3, #8
|
|
8003f66: f003 030f and.w r3, r3, #15
|
|
8003f6a: 490f ldr r1, [pc, #60] ; (8003fa8 <HAL_RCC_GetHCLKFreq+0x54>)
|
|
8003f6c: 5ccb ldrb r3, [r1, r3]
|
|
8003f6e: f003 031f and.w r3, r3, #31
|
|
8003f72: fa22 f303 lsr.w r3, r2, r3
|
|
8003f76: 607b str r3, [r7, #4]
|
|
#else
|
|
common_system_clock = HAL_RCC_GetSysClockFreq() >> (D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_CDCPRE) >> RCC_CDCFGR1_CDCPRE_Pos] & 0x1FU);
|
|
#endif
|
|
|
|
#if defined(RCC_D1CFGR_HPRE)
|
|
SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_HPRE) >> RCC_D1CFGR_HPRE_Pos]) & 0x1FU));
|
|
8003f78: 4b0a ldr r3, [pc, #40] ; (8003fa4 <HAL_RCC_GetHCLKFreq+0x50>)
|
|
8003f7a: 699b ldr r3, [r3, #24]
|
|
8003f7c: f003 030f and.w r3, r3, #15
|
|
8003f80: 4a09 ldr r2, [pc, #36] ; (8003fa8 <HAL_RCC_GetHCLKFreq+0x54>)
|
|
8003f82: 5cd3 ldrb r3, [r2, r3]
|
|
8003f84: f003 031f and.w r3, r3, #31
|
|
8003f88: 687a ldr r2, [r7, #4]
|
|
8003f8a: fa22 f303 lsr.w r3, r2, r3
|
|
8003f8e: 4a07 ldr r2, [pc, #28] ; (8003fac <HAL_RCC_GetHCLKFreq+0x58>)
|
|
8003f90: 6013 str r3, [r2, #0]
|
|
#endif
|
|
|
|
#if defined(DUAL_CORE) && defined(CORE_CM4)
|
|
SystemCoreClock = SystemD2Clock;
|
|
#else
|
|
SystemCoreClock = common_system_clock;
|
|
8003f92: 4a07 ldr r2, [pc, #28] ; (8003fb0 <HAL_RCC_GetHCLKFreq+0x5c>)
|
|
8003f94: 687b ldr r3, [r7, #4]
|
|
8003f96: 6013 str r3, [r2, #0]
|
|
#endif /* DUAL_CORE && CORE_CM4 */
|
|
|
|
return SystemD2Clock;
|
|
8003f98: 4b04 ldr r3, [pc, #16] ; (8003fac <HAL_RCC_GetHCLKFreq+0x58>)
|
|
8003f9a: 681b ldr r3, [r3, #0]
|
|
}
|
|
8003f9c: 4618 mov r0, r3
|
|
8003f9e: 3708 adds r7, #8
|
|
8003fa0: 46bd mov sp, r7
|
|
8003fa2: bd80 pop {r7, pc}
|
|
8003fa4: 58024400 .word 0x58024400
|
|
8003fa8: 08014c80 .word 0x08014c80
|
|
8003fac: 24000004 .word 0x24000004
|
|
8003fb0: 24000000 .word 0x24000000
|
|
|
|
08003fb4 <lwftp_pcb_close>:
|
|
struct pbuf *p);
|
|
|
|
/** Close control or data pcb
|
|
* @param pointer to lwftp session data
|
|
*/
|
|
static err_t lwftp_pcb_close(struct tcp_pcb *tpcb) {
|
|
8003fb4: b580 push {r7, lr}
|
|
8003fb6: b084 sub sp, #16
|
|
8003fb8: af00 add r7, sp, #0
|
|
8003fba: 6078 str r0, [r7, #4]
|
|
err_t error;
|
|
|
|
tcp_err(tpcb, NULL);
|
|
8003fbc: 2100 movs r1, #0
|
|
8003fbe: 6878 ldr r0, [r7, #4]
|
|
8003fc0: f004 fe24 bl 8008c0c <tcp_err>
|
|
tcp_recv(tpcb, NULL);
|
|
8003fc4: 2100 movs r1, #0
|
|
8003fc6: 6878 ldr r0, [r7, #4]
|
|
8003fc8: f004 fddc bl 8008b84 <tcp_recv>
|
|
tcp_sent(tpcb, NULL);
|
|
8003fcc: 2100 movs r1, #0
|
|
8003fce: 6878 ldr r0, [r7, #4]
|
|
8003fd0: f004 fdfa bl 8008bc8 <tcp_sent>
|
|
error = tcp_close(tpcb);
|
|
8003fd4: 6878 ldr r0, [r7, #4]
|
|
8003fd6: f003 fc9b bl 8007910 <tcp_close>
|
|
8003fda: 4603 mov r3, r0
|
|
8003fdc: 73fb strb r3, [r7, #15]
|
|
if (error != ERR_OK) {
|
|
8003fde: f997 300f ldrsb.w r3, [r7, #15]
|
|
8003fe2: 2b00 cmp r3, #0
|
|
8003fe4: d002 beq.n 8003fec <lwftp_pcb_close+0x38>
|
|
LWIP_DEBUGF(LWFTP_SEVERE, ("lwftp:pcb close failure, not implemented\n"));
|
|
8003fe6: 4804 ldr r0, [pc, #16] ; (8003ff8 <lwftp_pcb_close+0x44>)
|
|
8003fe8: f00c fe5c bl 8010ca4 <puts>
|
|
}
|
|
return ERR_OK;
|
|
8003fec: 2300 movs r3, #0
|
|
}
|
|
8003fee: 4618 mov r0, r3
|
|
8003ff0: 3710 adds r7, #16
|
|
8003ff2: 46bd mov sp, r7
|
|
8003ff4: bd80 pop {r7, pc}
|
|
8003ff6: bf00 nop
|
|
8003ff8: 0801167c .word 0x0801167c
|
|
|
|
08003ffc <lwftp_send_next_data>:
|
|
/** Send data
|
|
* @param pointer to lwftp session data
|
|
* @param pointer to PCB
|
|
* @param number of bytes sent
|
|
*/
|
|
static err_t lwftp_send_next_data(lwftp_session_t *s) {
|
|
8003ffc: b580 push {r7, lr}
|
|
8003ffe: b086 sub sp, #24
|
|
8004000: af00 add r7, sp, #0
|
|
8004002: 6078 str r0, [r7, #4]
|
|
const char *data;
|
|
int len = 0;
|
|
8004004: 2300 movs r3, #0
|
|
8004006: 617b str r3, [r7, #20]
|
|
err_t error = ERR_OK;
|
|
8004008: 2300 movs r3, #0
|
|
800400a: 74fb strb r3, [r7, #19]
|
|
|
|
if (s->data_source) {
|
|
800400c: 687b ldr r3, [r7, #4]
|
|
800400e: 699b ldr r3, [r3, #24]
|
|
8004010: 2b00 cmp r3, #0
|
|
8004012: d026 beq.n 8004062 <lwftp_send_next_data+0x66>
|
|
len = s->data_source(s->handle, &data, s->data_pcb->mss);
|
|
8004014: 687b ldr r3, [r7, #4]
|
|
8004016: 699b ldr r3, [r3, #24]
|
|
8004018: 687a ldr r2, [r7, #4]
|
|
800401a: 6950 ldr r0, [r2, #20]
|
|
800401c: 687a ldr r2, [r7, #4]
|
|
800401e: 6b12 ldr r2, [r2, #48] ; 0x30
|
|
8004020: 8e52 ldrh r2, [r2, #50] ; 0x32
|
|
8004022: f107 010c add.w r1, r7, #12
|
|
8004026: 4798 blx r3
|
|
8004028: 4603 mov r3, r0
|
|
800402a: 617b str r3, [r7, #20]
|
|
if (len) {
|
|
800402c: 697b ldr r3, [r7, #20]
|
|
800402e: 2b00 cmp r3, #0
|
|
8004030: d017 beq.n 8004062 <lwftp_send_next_data+0x66>
|
|
error = tcp_write(s->data_pcb, data, len, 0);
|
|
8004032: 687b ldr r3, [r7, #4]
|
|
8004034: 6b18 ldr r0, [r3, #48] ; 0x30
|
|
8004036: 68f9 ldr r1, [r7, #12]
|
|
8004038: 697b ldr r3, [r7, #20]
|
|
800403a: b29a uxth r2, r3
|
|
800403c: 2300 movs r3, #0
|
|
800403e: f007 fc91 bl 800b964 <tcp_write>
|
|
8004042: 4603 mov r3, r0
|
|
8004044: 74fb strb r3, [r7, #19]
|
|
if (error != ERR_OK) {
|
|
8004046: f997 3013 ldrsb.w r3, [r7, #19]
|
|
800404a: 2b00 cmp r3, #0
|
|
800404c: d009 beq.n 8004062 <lwftp_send_next_data+0x66>
|
|
LWIP_DEBUGF(LWFTP_SEVERE, ("lwftp:write failure (%s), not implemented\n",lwip_strerr(error)));
|
|
800404e: f997 3013 ldrsb.w r3, [r7, #19]
|
|
8004052: 4618 mov r0, r3
|
|
8004054: f001 fa5a bl 800550c <lwip_strerr>
|
|
8004058: 4603 mov r3, r0
|
|
800405a: 4619 mov r1, r3
|
|
800405c: 480a ldr r0, [pc, #40] ; (8004088 <lwftp_send_next_data+0x8c>)
|
|
800405e: f00c fdb3 bl 8010bc8 <iprintf>
|
|
}
|
|
}
|
|
}
|
|
if (!len) {
|
|
8004062: 697b ldr r3, [r7, #20]
|
|
8004064: 2b00 cmp r3, #0
|
|
8004066: d10a bne.n 800407e <lwftp_send_next_data+0x82>
|
|
LWIP_DEBUGF(LWFTP_STATE, ("lwftp:end of file\n"));
|
|
8004068: 4808 ldr r0, [pc, #32] ; (800408c <lwftp_send_next_data+0x90>)
|
|
800406a: f00c fe1b bl 8010ca4 <puts>
|
|
lwftp_pcb_close(s->data_pcb);
|
|
800406e: 687b ldr r3, [r7, #4]
|
|
8004070: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8004072: 4618 mov r0, r3
|
|
8004074: f7ff ff9e bl 8003fb4 <lwftp_pcb_close>
|
|
s->data_pcb = NULL;
|
|
8004078: 687b ldr r3, [r7, #4]
|
|
800407a: 2200 movs r2, #0
|
|
800407c: 631a str r2, [r3, #48] ; 0x30
|
|
}
|
|
return ERR_OK;
|
|
800407e: 2300 movs r3, #0
|
|
}
|
|
8004080: 4618 mov r0, r3
|
|
8004082: 3718 adds r7, #24
|
|
8004084: 46bd mov sp, r7
|
|
8004086: bd80 pop {r7, pc}
|
|
8004088: 080116a8 .word 0x080116a8
|
|
800408c: 080116d4 .word 0x080116d4
|
|
|
|
08004090 <lwftp_data_recv>:
|
|
* @param pointer to PCB
|
|
* @param pointer to incoming pbuf
|
|
* @param state of incoming process
|
|
*/
|
|
static err_t lwftp_data_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p,
|
|
err_t err) {
|
|
8004090: b580 push {r7, lr}
|
|
8004092: b086 sub sp, #24
|
|
8004094: af00 add r7, sp, #0
|
|
8004096: 60f8 str r0, [r7, #12]
|
|
8004098: 60b9 str r1, [r7, #8]
|
|
800409a: 607a str r2, [r7, #4]
|
|
800409c: 70fb strb r3, [r7, #3]
|
|
lwftp_session_t *s = (lwftp_session_t*) arg;
|
|
800409e: 68fb ldr r3, [r7, #12]
|
|
80040a0: 613b str r3, [r7, #16]
|
|
if (p) {
|
|
80040a2: 687b ldr r3, [r7, #4]
|
|
80040a4: 2b00 cmp r3, #0
|
|
80040a6: d026 beq.n 80040f6 <lwftp_data_recv+0x66>
|
|
if (s->data_sink) {
|
|
80040a8: 693b ldr r3, [r7, #16]
|
|
80040aa: 69db ldr r3, [r3, #28]
|
|
80040ac: 2b00 cmp r3, #0
|
|
80040ae: d012 beq.n 80040d6 <lwftp_data_recv+0x46>
|
|
struct pbuf *q;
|
|
for (q = p; q; q = q->next) {
|
|
80040b0: 687b ldr r3, [r7, #4]
|
|
80040b2: 617b str r3, [r7, #20]
|
|
80040b4: e00b b.n 80040ce <lwftp_data_recv+0x3e>
|
|
s->data_sink(s->handle, q->payload, q->len);
|
|
80040b6: 693b ldr r3, [r7, #16]
|
|
80040b8: 69db ldr r3, [r3, #28]
|
|
80040ba: 693a ldr r2, [r7, #16]
|
|
80040bc: 6950 ldr r0, [r2, #20]
|
|
80040be: 697a ldr r2, [r7, #20]
|
|
80040c0: 6851 ldr r1, [r2, #4]
|
|
80040c2: 697a ldr r2, [r7, #20]
|
|
80040c4: 8952 ldrh r2, [r2, #10]
|
|
80040c6: 4798 blx r3
|
|
for (q = p; q; q = q->next) {
|
|
80040c8: 697b ldr r3, [r7, #20]
|
|
80040ca: 681b ldr r3, [r3, #0]
|
|
80040cc: 617b str r3, [r7, #20]
|
|
80040ce: 697b ldr r3, [r7, #20]
|
|
80040d0: 2b00 cmp r3, #0
|
|
80040d2: d1f0 bne.n 80040b6 <lwftp_data_recv+0x26>
|
|
80040d4: e005 b.n 80040e2 <lwftp_data_recv+0x52>
|
|
}
|
|
} else {
|
|
LWIP_DEBUGF(LWFTP_SEVERE, ("lwftp: sinking %d bytes\n",p->tot_len));
|
|
80040d6: 687b ldr r3, [r7, #4]
|
|
80040d8: 891b ldrh r3, [r3, #8]
|
|
80040da: 4619 mov r1, r3
|
|
80040dc: 480e ldr r0, [pc, #56] ; (8004118 <lwftp_data_recv+0x88>)
|
|
80040de: f00c fd73 bl 8010bc8 <iprintf>
|
|
}
|
|
tcp_recved(tpcb, p->tot_len);
|
|
80040e2: 687b ldr r3, [r7, #4]
|
|
80040e4: 891b ldrh r3, [r3, #8]
|
|
80040e6: 4619 mov r1, r3
|
|
80040e8: 68b8 ldr r0, [r7, #8]
|
|
80040ea: f003 fd61 bl 8007bb0 <tcp_recved>
|
|
pbuf_free(p);
|
|
80040ee: 6878 ldr r0, [r7, #4]
|
|
80040f0: f002 ff70 bl 8006fd4 <pbuf_free>
|
|
80040f4: e00a b.n 800410c <lwftp_data_recv+0x7c>
|
|
} else {
|
|
// NULL pbuf shall lead to close the pcb. Close is postponed after
|
|
// the session state machine updates. No need to close right here.
|
|
// Instead we kindly tell data sink we are done
|
|
if (s->data_sink) {
|
|
80040f6: 693b ldr r3, [r7, #16]
|
|
80040f8: 69db ldr r3, [r3, #28]
|
|
80040fa: 2b00 cmp r3, #0
|
|
80040fc: d006 beq.n 800410c <lwftp_data_recv+0x7c>
|
|
s->data_sink(s->handle, NULL, 0);
|
|
80040fe: 693b ldr r3, [r7, #16]
|
|
8004100: 69db ldr r3, [r3, #28]
|
|
8004102: 693a ldr r2, [r7, #16]
|
|
8004104: 6950 ldr r0, [r2, #20]
|
|
8004106: 2200 movs r2, #0
|
|
8004108: 2100 movs r1, #0
|
|
800410a: 4798 blx r3
|
|
}
|
|
}
|
|
return ERR_OK;
|
|
800410c: 2300 movs r3, #0
|
|
}
|
|
800410e: 4618 mov r0, r3
|
|
8004110: 3718 adds r7, #24
|
|
8004112: 46bd mov sp, r7
|
|
8004114: bd80 pop {r7, pc}
|
|
8004116: bf00 nop
|
|
8004118: 080116e8 .word 0x080116e8
|
|
|
|
0800411c <lwftp_data_sent>:
|
|
/** Handle data connection acknowledge of sent data
|
|
* @param pointer to lwftp session data
|
|
* @param pointer to PCB
|
|
* @param number of bytes sent
|
|
*/
|
|
static err_t lwftp_data_sent(void *arg, struct tcp_pcb *tpcb, u16_t len) {
|
|
800411c: b580 push {r7, lr}
|
|
800411e: b086 sub sp, #24
|
|
8004120: af00 add r7, sp, #0
|
|
8004122: 60f8 str r0, [r7, #12]
|
|
8004124: 60b9 str r1, [r7, #8]
|
|
8004126: 4613 mov r3, r2
|
|
8004128: 80fb strh r3, [r7, #6]
|
|
lwftp_session_t *s = (lwftp_session_t*) arg;
|
|
800412a: 68fb ldr r3, [r7, #12]
|
|
800412c: 617b str r3, [r7, #20]
|
|
|
|
if (s->data_source) {
|
|
800412e: 697b ldr r3, [r7, #20]
|
|
8004130: 699b ldr r3, [r3, #24]
|
|
8004132: 2b00 cmp r3, #0
|
|
8004134: d006 beq.n 8004144 <lwftp_data_sent+0x28>
|
|
s->data_source(s->handle, NULL, len);
|
|
8004136: 697b ldr r3, [r7, #20]
|
|
8004138: 699b ldr r3, [r3, #24]
|
|
800413a: 697a ldr r2, [r7, #20]
|
|
800413c: 6950 ldr r0, [r2, #20]
|
|
800413e: 88fa ldrh r2, [r7, #6]
|
|
8004140: 2100 movs r1, #0
|
|
8004142: 4798 blx r3
|
|
}
|
|
return lwftp_send_next_data(s);
|
|
8004144: 6978 ldr r0, [r7, #20]
|
|
8004146: f7ff ff59 bl 8003ffc <lwftp_send_next_data>
|
|
800414a: 4603 mov r3, r0
|
|
}
|
|
800414c: 4618 mov r0, r3
|
|
800414e: 3718 adds r7, #24
|
|
8004150: 46bd mov sp, r7
|
|
8004152: bd80 pop {r7, pc}
|
|
|
|
08004154 <lwftp_data_err>:
|
|
|
|
/** Handle data connection error
|
|
* @param pointer to lwftp session data
|
|
* @param state of connection
|
|
*/
|
|
static void lwftp_data_err(void *arg, err_t err) {
|
|
8004154: b580 push {r7, lr}
|
|
8004156: b084 sub sp, #16
|
|
8004158: af00 add r7, sp, #0
|
|
800415a: 6078 str r0, [r7, #4]
|
|
800415c: 460b mov r3, r1
|
|
800415e: 70fb strb r3, [r7, #3]
|
|
LWIP_UNUSED_ARG(err);
|
|
if (arg != NULL) {
|
|
8004160: 687b ldr r3, [r7, #4]
|
|
8004162: 2b00 cmp r3, #0
|
|
8004164: d01c beq.n 80041a0 <lwftp_data_err+0x4c>
|
|
lwftp_session_t *s = (lwftp_session_t*) arg;
|
|
8004166: 687b ldr r3, [r7, #4]
|
|
8004168: 60fb str r3, [r7, #12]
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:failed/error connecting for data to server (%s)\n",lwip_strerr(err)));
|
|
800416a: f997 3003 ldrsb.w r3, [r7, #3]
|
|
800416e: 4618 mov r0, r3
|
|
8004170: f001 f9cc bl 800550c <lwip_strerr>
|
|
8004174: 4603 mov r3, r0
|
|
8004176: 4619 mov r1, r3
|
|
8004178: 480b ldr r0, [pc, #44] ; (80041a8 <lwftp_data_err+0x54>)
|
|
800417a: f00c fd25 bl 8010bc8 <iprintf>
|
|
s->data_pcb = NULL; // No need to de-allocate PCB
|
|
800417e: 68fb ldr r3, [r7, #12]
|
|
8004180: 2200 movs r2, #0
|
|
8004182: 631a str r2, [r3, #48] ; 0x30
|
|
if (s->control_state == LWFTP_XFERING) { // gracefully move control session ahead
|
|
8004184: 68fb ldr r3, [r7, #12]
|
|
8004186: f893 3028 ldrb.w r3, [r3, #40] ; 0x28
|
|
800418a: 2b09 cmp r3, #9
|
|
800418c: d108 bne.n 80041a0 <lwftp_data_err+0x4c>
|
|
s->control_state = LWFTP_DATAEND;
|
|
800418e: 68fb ldr r3, [r7, #12]
|
|
8004190: 220a movs r2, #10
|
|
8004192: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
lwftp_control_process(s, NULL, NULL);
|
|
8004196: 2200 movs r2, #0
|
|
8004198: 2100 movs r1, #0
|
|
800419a: 68f8 ldr r0, [r7, #12]
|
|
800419c: f000 f97c bl 8004498 <lwftp_control_process>
|
|
}
|
|
}
|
|
}
|
|
80041a0: bf00 nop
|
|
80041a2: 3710 adds r7, #16
|
|
80041a4: 46bd mov sp, r7
|
|
80041a6: bd80 pop {r7, pc}
|
|
80041a8: 08011704 .word 0x08011704
|
|
|
|
080041ac <lwftp_data_connected>:
|
|
/** Process newly connected PCB
|
|
* @param pointer to lwftp session data
|
|
* @param pointer to PCB
|
|
* @param state of connection
|
|
*/
|
|
static err_t lwftp_data_connected(void *arg, struct tcp_pcb *tpcb, err_t err) {
|
|
80041ac: b580 push {r7, lr}
|
|
80041ae: b086 sub sp, #24
|
|
80041b0: af00 add r7, sp, #0
|
|
80041b2: 60f8 str r0, [r7, #12]
|
|
80041b4: 60b9 str r1, [r7, #8]
|
|
80041b6: 4613 mov r3, r2
|
|
80041b8: 71fb strb r3, [r7, #7]
|
|
lwftp_session_t *s = (lwftp_session_t*) arg;
|
|
80041ba: 68fb ldr r3, [r7, #12]
|
|
80041bc: 617b str r3, [r7, #20]
|
|
|
|
if (err == ERR_OK) {
|
|
80041be: f997 3007 ldrsb.w r3, [r7, #7]
|
|
80041c2: 2b00 cmp r3, #0
|
|
80041c4: d107 bne.n 80041d6 <lwftp_data_connected+0x2a>
|
|
LWIP_DEBUGF(LWFTP_STATE, ("lwftp:connected for data to server\n"));
|
|
80041c6: 480c ldr r0, [pc, #48] ; (80041f8 <lwftp_data_connected+0x4c>)
|
|
80041c8: f00c fd6c bl 8010ca4 <puts>
|
|
s->data_state = LWFTP_CONNECTED;
|
|
80041cc: 697b ldr r3, [r7, #20]
|
|
80041ce: 2201 movs r2, #1
|
|
80041d0: f883 202a strb.w r2, [r3, #42] ; 0x2a
|
|
80041d4: e009 b.n 80041ea <lwftp_data_connected+0x3e>
|
|
} else {
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:err in data_connected (%s)\n",lwip_strerr(err)));
|
|
80041d6: f997 3007 ldrsb.w r3, [r7, #7]
|
|
80041da: 4618 mov r0, r3
|
|
80041dc: f001 f996 bl 800550c <lwip_strerr>
|
|
80041e0: 4603 mov r3, r0
|
|
80041e2: 4619 mov r1, r3
|
|
80041e4: 4805 ldr r0, [pc, #20] ; (80041fc <lwftp_data_connected+0x50>)
|
|
80041e6: f00c fcef bl 8010bc8 <iprintf>
|
|
}
|
|
return err;
|
|
80041ea: f997 3007 ldrsb.w r3, [r7, #7]
|
|
}
|
|
80041ee: 4618 mov r0, r3
|
|
80041f0: 3718 adds r7, #24
|
|
80041f2: 46bd mov sp, r7
|
|
80041f4: bd80 pop {r7, pc}
|
|
80041f6: bf00 nop
|
|
80041f8: 0801173c .word 0x0801173c
|
|
80041fc: 08011760 .word 0x08011760
|
|
|
|
08004200 <lwftp_data_open>:
|
|
|
|
/** Open data connection for passive transfer
|
|
* @param pointer to lwftp session data
|
|
* @param pointer to incoming PASV response
|
|
*/
|
|
static err_t lwftp_data_open(lwftp_session_t *s, struct pbuf *p) {
|
|
8004200: b580 push {r7, lr}
|
|
8004202: b08a sub sp, #40 ; 0x28
|
|
8004204: af00 add r7, sp, #0
|
|
8004206: 6078 str r0, [r7, #4]
|
|
8004208: 6039 str r1, [r7, #0]
|
|
char *ptr;
|
|
ip_addr_t data_server;
|
|
u16_t data_port;
|
|
|
|
// Find server connection parameter
|
|
ptr = strchr(p->payload, '(');
|
|
800420a: 683b ldr r3, [r7, #0]
|
|
800420c: 685b ldr r3, [r3, #4]
|
|
800420e: 2128 movs r1, #40 ; 0x28
|
|
8004210: 4618 mov r0, r3
|
|
8004212: f00c fe3f bl 8010e94 <strchr>
|
|
8004216: 4603 mov r3, r0
|
|
8004218: 613b str r3, [r7, #16]
|
|
if (!ptr)
|
|
800421a: 693b ldr r3, [r7, #16]
|
|
800421c: 2b00 cmp r3, #0
|
|
800421e: d102 bne.n 8004226 <lwftp_data_open+0x26>
|
|
return ERR_BUF;
|
|
8004220: f06f 0301 mvn.w r3, #1
|
|
8004224: e0ac b.n 8004380 <lwftp_data_open+0x180>
|
|
do {
|
|
unsigned int a = strtoul(ptr + 1, &ptr, 10);
|
|
8004226: 693b ldr r3, [r7, #16]
|
|
8004228: 3301 adds r3, #1
|
|
800422a: f107 0110 add.w r1, r7, #16
|
|
800422e: 220a movs r2, #10
|
|
8004230: 4618 mov r0, r3
|
|
8004232: f00c f8c5 bl 80103c0 <strtoul>
|
|
8004236: 6278 str r0, [r7, #36] ; 0x24
|
|
unsigned int b = strtoul(ptr + 1, &ptr, 10);
|
|
8004238: 693b ldr r3, [r7, #16]
|
|
800423a: 3301 adds r3, #1
|
|
800423c: f107 0110 add.w r1, r7, #16
|
|
8004240: 220a movs r2, #10
|
|
8004242: 4618 mov r0, r3
|
|
8004244: f00c f8bc bl 80103c0 <strtoul>
|
|
8004248: 6238 str r0, [r7, #32]
|
|
unsigned int c = strtoul(ptr + 1, &ptr, 10);
|
|
800424a: 693b ldr r3, [r7, #16]
|
|
800424c: 3301 adds r3, #1
|
|
800424e: f107 0110 add.w r1, r7, #16
|
|
8004252: 220a movs r2, #10
|
|
8004254: 4618 mov r0, r3
|
|
8004256: f00c f8b3 bl 80103c0 <strtoul>
|
|
800425a: 61f8 str r0, [r7, #28]
|
|
unsigned int d = strtoul(ptr + 1, &ptr, 10);
|
|
800425c: 693b ldr r3, [r7, #16]
|
|
800425e: 3301 adds r3, #1
|
|
8004260: f107 0110 add.w r1, r7, #16
|
|
8004264: 220a movs r2, #10
|
|
8004266: 4618 mov r0, r3
|
|
8004268: f00c f8aa bl 80103c0 <strtoul>
|
|
800426c: 61b8 str r0, [r7, #24]
|
|
IP4_ADDR(&data_server, a, b, c, d);
|
|
800426e: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8004270: 061a lsls r2, r3, #24
|
|
8004272: 6a3b ldr r3, [r7, #32]
|
|
8004274: 041b lsls r3, r3, #16
|
|
8004276: f403 037f and.w r3, r3, #16711680 ; 0xff0000
|
|
800427a: 431a orrs r2, r3
|
|
800427c: 69fb ldr r3, [r7, #28]
|
|
800427e: 021b lsls r3, r3, #8
|
|
8004280: b29b uxth r3, r3
|
|
8004282: 431a orrs r2, r3
|
|
8004284: 69bb ldr r3, [r7, #24]
|
|
8004286: b2db uxtb r3, r3
|
|
8004288: 4313 orrs r3, r2
|
|
800428a: 061a lsls r2, r3, #24
|
|
800428c: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800428e: 0619 lsls r1, r3, #24
|
|
8004290: 6a3b ldr r3, [r7, #32]
|
|
8004292: 041b lsls r3, r3, #16
|
|
8004294: f403 037f and.w r3, r3, #16711680 ; 0xff0000
|
|
8004298: 4319 orrs r1, r3
|
|
800429a: 69fb ldr r3, [r7, #28]
|
|
800429c: 021b lsls r3, r3, #8
|
|
800429e: b29b uxth r3, r3
|
|
80042a0: 4319 orrs r1, r3
|
|
80042a2: 69bb ldr r3, [r7, #24]
|
|
80042a4: b2db uxtb r3, r3
|
|
80042a6: 430b orrs r3, r1
|
|
80042a8: 021b lsls r3, r3, #8
|
|
80042aa: f403 037f and.w r3, r3, #16711680 ; 0xff0000
|
|
80042ae: 431a orrs r2, r3
|
|
80042b0: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80042b2: 0619 lsls r1, r3, #24
|
|
80042b4: 6a3b ldr r3, [r7, #32]
|
|
80042b6: 041b lsls r3, r3, #16
|
|
80042b8: f403 037f and.w r3, r3, #16711680 ; 0xff0000
|
|
80042bc: 4319 orrs r1, r3
|
|
80042be: 69fb ldr r3, [r7, #28]
|
|
80042c0: 021b lsls r3, r3, #8
|
|
80042c2: b29b uxth r3, r3
|
|
80042c4: 4319 orrs r1, r3
|
|
80042c6: 69bb ldr r3, [r7, #24]
|
|
80042c8: b2db uxtb r3, r3
|
|
80042ca: 430b orrs r3, r1
|
|
80042cc: 0a1b lsrs r3, r3, #8
|
|
80042ce: f403 437f and.w r3, r3, #65280 ; 0xff00
|
|
80042d2: 431a orrs r2, r3
|
|
80042d4: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
80042d6: 0619 lsls r1, r3, #24
|
|
80042d8: 6a3b ldr r3, [r7, #32]
|
|
80042da: 041b lsls r3, r3, #16
|
|
80042dc: f403 037f and.w r3, r3, #16711680 ; 0xff0000
|
|
80042e0: 4319 orrs r1, r3
|
|
80042e2: 69fb ldr r3, [r7, #28]
|
|
80042e4: 021b lsls r3, r3, #8
|
|
80042e6: b29b uxth r3, r3
|
|
80042e8: 4319 orrs r1, r3
|
|
80042ea: 69bb ldr r3, [r7, #24]
|
|
80042ec: b2db uxtb r3, r3
|
|
80042ee: 430b orrs r3, r1
|
|
80042f0: 0e1b lsrs r3, r3, #24
|
|
80042f2: 4313 orrs r3, r2
|
|
80042f4: 60fb str r3, [r7, #12]
|
|
} while (0);
|
|
data_port = strtoul(ptr + 1, &ptr, 10) << 8;
|
|
80042f6: 693b ldr r3, [r7, #16]
|
|
80042f8: 3301 adds r3, #1
|
|
80042fa: f107 0110 add.w r1, r7, #16
|
|
80042fe: 220a movs r2, #10
|
|
8004300: 4618 mov r0, r3
|
|
8004302: f00c f85d bl 80103c0 <strtoul>
|
|
8004306: 4603 mov r3, r0
|
|
8004308: b29b uxth r3, r3
|
|
800430a: 021b lsls r3, r3, #8
|
|
800430c: 82fb strh r3, [r7, #22]
|
|
data_port |= strtoul(ptr + 1, &ptr, 10) & 255;
|
|
800430e: 693b ldr r3, [r7, #16]
|
|
8004310: 3301 adds r3, #1
|
|
8004312: f107 0110 add.w r1, r7, #16
|
|
8004316: 220a movs r2, #10
|
|
8004318: 4618 mov r0, r3
|
|
800431a: f00c f851 bl 80103c0 <strtoul>
|
|
800431e: 4603 mov r3, r0
|
|
8004320: b2db uxtb r3, r3
|
|
8004322: b29a uxth r2, r3
|
|
8004324: 8afb ldrh r3, [r7, #22]
|
|
8004326: 4313 orrs r3, r2
|
|
8004328: 82fb strh r3, [r7, #22]
|
|
if (*ptr != ')')
|
|
800432a: 693b ldr r3, [r7, #16]
|
|
800432c: 781b ldrb r3, [r3, #0]
|
|
800432e: 2b29 cmp r3, #41 ; 0x29
|
|
8004330: d002 beq.n 8004338 <lwftp_data_open+0x138>
|
|
return ERR_BUF;
|
|
8004332: f06f 0301 mvn.w r3, #1
|
|
8004336: e023 b.n 8004380 <lwftp_data_open+0x180>
|
|
|
|
// Open data session
|
|
tcp_arg(s->data_pcb, s);
|
|
8004338: 687b ldr r3, [r7, #4]
|
|
800433a: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
800433c: 6879 ldr r1, [r7, #4]
|
|
800433e: 4618 mov r0, r3
|
|
8004340: f004 fc0e bl 8008b60 <tcp_arg>
|
|
tcp_err(s->data_pcb, lwftp_data_err);
|
|
8004344: 687b ldr r3, [r7, #4]
|
|
8004346: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8004348: 490f ldr r1, [pc, #60] ; (8004388 <lwftp_data_open+0x188>)
|
|
800434a: 4618 mov r0, r3
|
|
800434c: f004 fc5e bl 8008c0c <tcp_err>
|
|
tcp_recv(s->data_pcb, lwftp_data_recv);
|
|
8004350: 687b ldr r3, [r7, #4]
|
|
8004352: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8004354: 490d ldr r1, [pc, #52] ; (800438c <lwftp_data_open+0x18c>)
|
|
8004356: 4618 mov r0, r3
|
|
8004358: f004 fc14 bl 8008b84 <tcp_recv>
|
|
tcp_sent(s->data_pcb, lwftp_data_sent);
|
|
800435c: 687b ldr r3, [r7, #4]
|
|
800435e: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8004360: 490b ldr r1, [pc, #44] ; (8004390 <lwftp_data_open+0x190>)
|
|
8004362: 4618 mov r0, r3
|
|
8004364: f004 fc30 bl 8008bc8 <tcp_sent>
|
|
error = tcp_connect(s->data_pcb, &data_server, data_port,
|
|
8004368: 687b ldr r3, [r7, #4]
|
|
800436a: 6b18 ldr r0, [r3, #48] ; 0x30
|
|
800436c: 8afa ldrh r2, [r7, #22]
|
|
800436e: f107 010c add.w r1, r7, #12
|
|
8004372: 4b08 ldr r3, [pc, #32] ; (8004394 <lwftp_data_open+0x194>)
|
|
8004374: f003 fcb2 bl 8007cdc <tcp_connect>
|
|
8004378: 4603 mov r3, r0
|
|
800437a: 757b strb r3, [r7, #21]
|
|
lwftp_data_connected);
|
|
return error;
|
|
800437c: f997 3015 ldrsb.w r3, [r7, #21]
|
|
}
|
|
8004380: 4618 mov r0, r3
|
|
8004382: 3728 adds r7, #40 ; 0x28
|
|
8004384: 46bd mov sp, r7
|
|
8004386: bd80 pop {r7, pc}
|
|
8004388: 08004155 .word 0x08004155
|
|
800438c: 08004091 .word 0x08004091
|
|
8004390: 0800411d .word 0x0800411d
|
|
8004394: 080041ad .word 0x080041ad
|
|
|
|
08004398 <lwftp_send_msg>:
|
|
|
|
/** Send a message to control connection
|
|
* @param pointer to lwftp session data
|
|
* @param pointer to message string
|
|
*/
|
|
static err_t lwftp_send_msg(lwftp_session_t *s, const char *msg, size_t len) {
|
|
8004398: b580 push {r7, lr}
|
|
800439a: b086 sub sp, #24
|
|
800439c: af00 add r7, sp, #0
|
|
800439e: 60f8 str r0, [r7, #12]
|
|
80043a0: 60b9 str r1, [r7, #8]
|
|
80043a2: 607a str r2, [r7, #4]
|
|
err_t error;
|
|
|
|
LWIP_DEBUGF(LWFTP_TRACE,("lwftp:sending %s",msg));
|
|
80043a4: 68b9 ldr r1, [r7, #8]
|
|
80043a6: 4810 ldr r0, [pc, #64] ; (80043e8 <lwftp_send_msg+0x50>)
|
|
80043a8: f00c fc0e bl 8010bc8 <iprintf>
|
|
error = tcp_write(s->control_pcb, msg, len, 0);
|
|
80043ac: 68fb ldr r3, [r7, #12]
|
|
80043ae: 6ad8 ldr r0, [r3, #44] ; 0x2c
|
|
80043b0: 687b ldr r3, [r7, #4]
|
|
80043b2: b29a uxth r2, r3
|
|
80043b4: 2300 movs r3, #0
|
|
80043b6: 68b9 ldr r1, [r7, #8]
|
|
80043b8: f007 fad4 bl 800b964 <tcp_write>
|
|
80043bc: 4603 mov r3, r0
|
|
80043be: 75fb strb r3, [r7, #23]
|
|
if (error != ERR_OK) {
|
|
80043c0: f997 3017 ldrsb.w r3, [r7, #23]
|
|
80043c4: 2b00 cmp r3, #0
|
|
80043c6: d009 beq.n 80043dc <lwftp_send_msg+0x44>
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:cannot write (%s)\n",lwip_strerr(error)));
|
|
80043c8: f997 3017 ldrsb.w r3, [r7, #23]
|
|
80043cc: 4618 mov r0, r3
|
|
80043ce: f001 f89d bl 800550c <lwip_strerr>
|
|
80043d2: 4603 mov r3, r0
|
|
80043d4: 4619 mov r1, r3
|
|
80043d6: 4805 ldr r0, [pc, #20] ; (80043ec <lwftp_send_msg+0x54>)
|
|
80043d8: f00c fbf6 bl 8010bc8 <iprintf>
|
|
}
|
|
return error;
|
|
80043dc: f997 3017 ldrsb.w r3, [r7, #23]
|
|
}
|
|
80043e0: 4618 mov r0, r3
|
|
80043e2: 3718 adds r7, #24
|
|
80043e4: 46bd mov sp, r7
|
|
80043e6: bd80 pop {r7, pc}
|
|
80043e8: 08011784 .word 0x08011784
|
|
80043ec: 08011798 .word 0x08011798
|
|
|
|
080043f0 <lwftp_data_close>:
|
|
|
|
/** Close data connection
|
|
* @param pointer to lwftp session data
|
|
* @param result to pass to callback fn (if called)
|
|
*/
|
|
static void lwftp_data_close(lwftp_session_t *s, int result) {
|
|
80043f0: b580 push {r7, lr}
|
|
80043f2: b082 sub sp, #8
|
|
80043f4: af00 add r7, sp, #0
|
|
80043f6: 6078 str r0, [r7, #4]
|
|
80043f8: 6039 str r1, [r7, #0]
|
|
if (s->data_pcb) {
|
|
80043fa: 687b ldr r3, [r7, #4]
|
|
80043fc: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
80043fe: 2b00 cmp r3, #0
|
|
8004400: d007 beq.n 8004412 <lwftp_data_close+0x22>
|
|
lwftp_pcb_close(s->data_pcb);
|
|
8004402: 687b ldr r3, [r7, #4]
|
|
8004404: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8004406: 4618 mov r0, r3
|
|
8004408: f7ff fdd4 bl 8003fb4 <lwftp_pcb_close>
|
|
s->data_pcb = NULL;
|
|
800440c: 687b ldr r3, [r7, #4]
|
|
800440e: 2200 movs r2, #0
|
|
8004410: 631a str r2, [r3, #48] ; 0x30
|
|
}
|
|
if (s->done_fn) {
|
|
8004412: 687b ldr r3, [r7, #4]
|
|
8004414: 6a1b ldr r3, [r3, #32]
|
|
8004416: 2b00 cmp r3, #0
|
|
8004418: d006 beq.n 8004428 <lwftp_data_close+0x38>
|
|
s->done_fn(s->handle, result);
|
|
800441a: 687b ldr r3, [r7, #4]
|
|
800441c: 6a1b ldr r3, [r3, #32]
|
|
800441e: 687a ldr r2, [r7, #4]
|
|
8004420: 6952 ldr r2, [r2, #20]
|
|
8004422: 6839 ldr r1, [r7, #0]
|
|
8004424: 4610 mov r0, r2
|
|
8004426: 4798 blx r3
|
|
}
|
|
}
|
|
8004428: bf00 nop
|
|
800442a: 3708 adds r7, #8
|
|
800442c: 46bd mov sp, r7
|
|
800442e: bd80 pop {r7, pc}
|
|
|
|
08004430 <lwftp_control_close>:
|
|
|
|
/** Close control connection
|
|
* @param pointer to lwftp session data
|
|
* @param result to pass to callback fn (if called)
|
|
*/
|
|
static void lwftp_control_close(lwftp_session_t *s, int result) {
|
|
8004430: b580 push {r7, lr}
|
|
8004432: b082 sub sp, #8
|
|
8004434: af00 add r7, sp, #0
|
|
8004436: 6078 str r0, [r7, #4]
|
|
8004438: 6039 str r1, [r7, #0]
|
|
if (s->data_pcb) {
|
|
800443a: 687b ldr r3, [r7, #4]
|
|
800443c: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
800443e: 2b00 cmp r3, #0
|
|
8004440: d007 beq.n 8004452 <lwftp_control_close+0x22>
|
|
lwftp_pcb_close(s->data_pcb);
|
|
8004442: 687b ldr r3, [r7, #4]
|
|
8004444: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
8004446: 4618 mov r0, r3
|
|
8004448: f7ff fdb4 bl 8003fb4 <lwftp_pcb_close>
|
|
s->data_pcb = NULL;
|
|
800444c: 687b ldr r3, [r7, #4]
|
|
800444e: 2200 movs r2, #0
|
|
8004450: 631a str r2, [r3, #48] ; 0x30
|
|
}
|
|
if (s->control_pcb) {
|
|
8004452: 687b ldr r3, [r7, #4]
|
|
8004454: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8004456: 2b00 cmp r3, #0
|
|
8004458: d007 beq.n 800446a <lwftp_control_close+0x3a>
|
|
lwftp_pcb_close(s->control_pcb);
|
|
800445a: 687b ldr r3, [r7, #4]
|
|
800445c: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
800445e: 4618 mov r0, r3
|
|
8004460: f7ff fda8 bl 8003fb4 <lwftp_pcb_close>
|
|
s->control_pcb = NULL;
|
|
8004464: 687b ldr r3, [r7, #4]
|
|
8004466: 2200 movs r2, #0
|
|
8004468: 62da str r2, [r3, #44] ; 0x2c
|
|
}
|
|
s->control_state = LWFTP_CLOSED;
|
|
800446a: 687b ldr r3, [r7, #4]
|
|
800446c: 2200 movs r2, #0
|
|
800446e: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
if ((result >= 0) && s->done_fn) {
|
|
8004472: 683b ldr r3, [r7, #0]
|
|
8004474: 2b00 cmp r3, #0
|
|
8004476: db0a blt.n 800448e <lwftp_control_close+0x5e>
|
|
8004478: 687b ldr r3, [r7, #4]
|
|
800447a: 6a1b ldr r3, [r3, #32]
|
|
800447c: 2b00 cmp r3, #0
|
|
800447e: d006 beq.n 800448e <lwftp_control_close+0x5e>
|
|
s->done_fn(s->handle, result);
|
|
8004480: 687b ldr r3, [r7, #4]
|
|
8004482: 6a1b ldr r3, [r3, #32]
|
|
8004484: 687a ldr r2, [r7, #4]
|
|
8004486: 6952 ldr r2, [r2, #20]
|
|
8004488: 6839 ldr r1, [r7, #0]
|
|
800448a: 4610 mov r0, r2
|
|
800448c: 4798 blx r3
|
|
}
|
|
}
|
|
800448e: bf00 nop
|
|
8004490: 3708 adds r7, #8
|
|
8004492: 46bd mov sp, r7
|
|
8004494: bd80 pop {r7, pc}
|
|
...
|
|
|
|
08004498 <lwftp_control_process>:
|
|
* @param pointer to lwftp session data
|
|
* @param pointer to PCB
|
|
* @param pointer to incoming data
|
|
*/
|
|
static void lwftp_control_process(lwftp_session_t *s, struct tcp_pcb *tpcb,
|
|
struct pbuf *p) {
|
|
8004498: b590 push {r4, r7, lr}
|
|
800449a: b087 sub sp, #28
|
|
800449c: af00 add r7, sp, #0
|
|
800449e: 60f8 str r0, [r7, #12]
|
|
80044a0: 60b9 str r1, [r7, #8]
|
|
80044a2: 607a str r2, [r7, #4]
|
|
uint response = 0;
|
|
80044a4: 2300 movs r3, #0
|
|
80044a6: 617b str r3, [r7, #20]
|
|
int result = LWFTP_RESULT_ERR_SRVR_RESP;
|
|
80044a8: 230a movs r3, #10
|
|
80044aa: 613b str r3, [r7, #16]
|
|
|
|
// Try to get response number
|
|
if (p) {
|
|
80044ac: 687b ldr r3, [r7, #4]
|
|
80044ae: 2b00 cmp r3, #0
|
|
80044b0: d00b beq.n 80044ca <lwftp_control_process+0x32>
|
|
response = strtoul(p->payload, NULL, 10);
|
|
80044b2: 687b ldr r3, [r7, #4]
|
|
80044b4: 685b ldr r3, [r3, #4]
|
|
80044b6: 220a movs r2, #10
|
|
80044b8: 2100 movs r1, #0
|
|
80044ba: 4618 mov r0, r3
|
|
80044bc: f00b ff80 bl 80103c0 <strtoul>
|
|
80044c0: 6178 str r0, [r7, #20]
|
|
LWIP_DEBUGF(LWFTP_TRACE, ("lwftp:got response %d\n",response));
|
|
80044c2: 6979 ldr r1, [r7, #20]
|
|
80044c4: 48a8 ldr r0, [pc, #672] ; (8004768 <lwftp_control_process+0x2d0>)
|
|
80044c6: f00c fb7f bl 8010bc8 <iprintf>
|
|
}
|
|
|
|
switch (s->control_state) {
|
|
80044ca: 68fb ldr r3, [r7, #12]
|
|
80044cc: f893 3028 ldrb.w r3, [r3, #40] ; 0x28
|
|
80044d0: 3b01 subs r3, #1
|
|
80044d2: 2b0b cmp r3, #11
|
|
80044d4: f200 816d bhi.w 80047b2 <lwftp_control_process+0x31a>
|
|
80044d8: a201 add r2, pc, #4 ; (adr r2, 80044e0 <lwftp_control_process+0x48>)
|
|
80044da: f852 f023 ldr.w pc, [r2, r3, lsl #2]
|
|
80044de: bf00 nop
|
|
80044e0: 08004511 .word 0x08004511
|
|
80044e4: 08004561 .word 0x08004561
|
|
80044e8: 080045b5 .word 0x080045b5
|
|
80044ec: 080047b3 .word 0x080047b3
|
|
80044f0: 080045f5 .word 0x080045f5
|
|
80044f4: 08004621 .word 0x08004621
|
|
80044f8: 080046a7 .word 0x080046a7
|
|
80044fc: 080046f5 .word 0x080046f5
|
|
8004500: 08004727 .word 0x08004727
|
|
8004504: 0800474f .word 0x0800474f
|
|
8004508: 080047b3 .word 0x080047b3
|
|
800450c: 08004757 .word 0x08004757
|
|
case LWFTP_CONNECTED:
|
|
if (response > 0) {
|
|
8004510: 697b ldr r3, [r7, #20]
|
|
8004512: 2b00 cmp r3, #0
|
|
8004514: f000 8155 beq.w 80047c2 <lwftp_control_process+0x32a>
|
|
if (response == 220) {
|
|
8004518: 697b ldr r3, [r7, #20]
|
|
800451a: 2bdc cmp r3, #220 ; 0xdc
|
|
800451c: d11b bne.n 8004556 <lwftp_control_process+0xbe>
|
|
lwftp_send_msg(s, PTRNLEN("USER "));
|
|
800451e: 2205 movs r2, #5
|
|
8004520: 4992 ldr r1, [pc, #584] ; (800476c <lwftp_control_process+0x2d4>)
|
|
8004522: 68f8 ldr r0, [r7, #12]
|
|
8004524: f7ff ff38 bl 8004398 <lwftp_send_msg>
|
|
lwftp_send_msg(s, s->user, strlen(s->user));
|
|
8004528: 68fb ldr r3, [r7, #12]
|
|
800452a: 68dc ldr r4, [r3, #12]
|
|
800452c: 68fb ldr r3, [r7, #12]
|
|
800452e: 68db ldr r3, [r3, #12]
|
|
8004530: 4618 mov r0, r3
|
|
8004532: f7fb ff3d bl 80003b0 <strlen>
|
|
8004536: 4603 mov r3, r0
|
|
8004538: 461a mov r2, r3
|
|
800453a: 4621 mov r1, r4
|
|
800453c: 68f8 ldr r0, [r7, #12]
|
|
800453e: f7ff ff2b bl 8004398 <lwftp_send_msg>
|
|
lwftp_send_msg(s, PTRNLEN("\r\n"));
|
|
8004542: 2202 movs r2, #2
|
|
8004544: 498a ldr r1, [pc, #552] ; (8004770 <lwftp_control_process+0x2d8>)
|
|
8004546: 68f8 ldr r0, [r7, #12]
|
|
8004548: f7ff ff26 bl 8004398 <lwftp_send_msg>
|
|
s->control_state = LWFTP_USER_SENT;
|
|
800454c: 68fb ldr r3, [r7, #12]
|
|
800454e: 2202 movs r2, #2
|
|
8004550: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
} else {
|
|
s->control_state = LWFTP_QUIT;
|
|
}
|
|
}
|
|
break;
|
|
8004554: e135 b.n 80047c2 <lwftp_control_process+0x32a>
|
|
s->control_state = LWFTP_QUIT;
|
|
8004556: 68fb ldr r3, [r7, #12]
|
|
8004558: 220b movs r2, #11
|
|
800455a: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
break;
|
|
800455e: e130 b.n 80047c2 <lwftp_control_process+0x32a>
|
|
case LWFTP_USER_SENT:
|
|
if (response > 0) {
|
|
8004560: 697b ldr r3, [r7, #20]
|
|
8004562: 2b00 cmp r3, #0
|
|
8004564: f000 812f beq.w 80047c6 <lwftp_control_process+0x32e>
|
|
if (response == 331) {
|
|
8004568: 697b ldr r3, [r7, #20]
|
|
800456a: f240 124b movw r2, #331 ; 0x14b
|
|
800456e: 4293 cmp r3, r2
|
|
8004570: d11b bne.n 80045aa <lwftp_control_process+0x112>
|
|
lwftp_send_msg(s, PTRNLEN("PASS "));
|
|
8004572: 2205 movs r2, #5
|
|
8004574: 497f ldr r1, [pc, #508] ; (8004774 <lwftp_control_process+0x2dc>)
|
|
8004576: 68f8 ldr r0, [r7, #12]
|
|
8004578: f7ff ff0e bl 8004398 <lwftp_send_msg>
|
|
lwftp_send_msg(s, s->pass, strlen(s->pass));
|
|
800457c: 68fb ldr r3, [r7, #12]
|
|
800457e: 691c ldr r4, [r3, #16]
|
|
8004580: 68fb ldr r3, [r7, #12]
|
|
8004582: 691b ldr r3, [r3, #16]
|
|
8004584: 4618 mov r0, r3
|
|
8004586: f7fb ff13 bl 80003b0 <strlen>
|
|
800458a: 4603 mov r3, r0
|
|
800458c: 461a mov r2, r3
|
|
800458e: 4621 mov r1, r4
|
|
8004590: 68f8 ldr r0, [r7, #12]
|
|
8004592: f7ff ff01 bl 8004398 <lwftp_send_msg>
|
|
lwftp_send_msg(s, PTRNLEN("\r\n"));
|
|
8004596: 2202 movs r2, #2
|
|
8004598: 4975 ldr r1, [pc, #468] ; (8004770 <lwftp_control_process+0x2d8>)
|
|
800459a: 68f8 ldr r0, [r7, #12]
|
|
800459c: f7ff fefc bl 8004398 <lwftp_send_msg>
|
|
s->control_state = LWFTP_PASS_SENT;
|
|
80045a0: 68fb ldr r3, [r7, #12]
|
|
80045a2: 2203 movs r2, #3
|
|
80045a4: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
} else {
|
|
s->control_state = LWFTP_QUIT;
|
|
}
|
|
}
|
|
break;
|
|
80045a8: e10d b.n 80047c6 <lwftp_control_process+0x32e>
|
|
s->control_state = LWFTP_QUIT;
|
|
80045aa: 68fb ldr r3, [r7, #12]
|
|
80045ac: 220b movs r2, #11
|
|
80045ae: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
break;
|
|
80045b2: e108 b.n 80047c6 <lwftp_control_process+0x32e>
|
|
case LWFTP_PASS_SENT:
|
|
if (response > 0) {
|
|
80045b4: 697b ldr r3, [r7, #20]
|
|
80045b6: 2b00 cmp r3, #0
|
|
80045b8: f000 8107 beq.w 80047ca <lwftp_control_process+0x332>
|
|
if (response == 230) {
|
|
80045bc: 697b ldr r3, [r7, #20]
|
|
80045be: 2be6 cmp r3, #230 ; 0xe6
|
|
80045c0: d113 bne.n 80045ea <lwftp_control_process+0x152>
|
|
s->control_state = LWFTP_LOGGED;
|
|
80045c2: 68fb ldr r3, [r7, #12]
|
|
80045c4: 2204 movs r2, #4
|
|
80045c6: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
LWIP_DEBUGF(LWFTP_STATE, ("lwftp: now logged in\n"));
|
|
80045ca: 486b ldr r0, [pc, #428] ; (8004778 <lwftp_control_process+0x2e0>)
|
|
80045cc: f00c fb6a bl 8010ca4 <puts>
|
|
if (s->done_fn) {
|
|
80045d0: 68fb ldr r3, [r7, #12]
|
|
80045d2: 6a1b ldr r3, [r3, #32]
|
|
80045d4: 2b00 cmp r3, #0
|
|
80045d6: f000 80f8 beq.w 80047ca <lwftp_control_process+0x332>
|
|
s->done_fn(s->handle, LWFTP_RESULT_LOGGED);
|
|
80045da: 68fb ldr r3, [r7, #12]
|
|
80045dc: 6a1b ldr r3, [r3, #32]
|
|
80045de: 68fa ldr r2, [r7, #12]
|
|
80045e0: 6952 ldr r2, [r2, #20]
|
|
80045e2: 2102 movs r1, #2
|
|
80045e4: 4610 mov r0, r2
|
|
80045e6: 4798 blx r3
|
|
}
|
|
} else {
|
|
s->control_state = LWFTP_QUIT;
|
|
}
|
|
}
|
|
break;
|
|
80045e8: e0ef b.n 80047ca <lwftp_control_process+0x332>
|
|
s->control_state = LWFTP_QUIT;
|
|
80045ea: 68fb ldr r3, [r7, #12]
|
|
80045ec: 220b movs r2, #11
|
|
80045ee: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
break;
|
|
80045f2: e0ea b.n 80047ca <lwftp_control_process+0x332>
|
|
case LWFTP_TYPE_SENT:
|
|
if (response > 0) {
|
|
80045f4: 697b ldr r3, [r7, #20]
|
|
80045f6: 2b00 cmp r3, #0
|
|
80045f8: f000 80e9 beq.w 80047ce <lwftp_control_process+0x336>
|
|
if (response == 200) {
|
|
80045fc: 697b ldr r3, [r7, #20]
|
|
80045fe: 2bc8 cmp r3, #200 ; 0xc8
|
|
8004600: d109 bne.n 8004616 <lwftp_control_process+0x17e>
|
|
lwftp_send_msg(s, PTRNLEN("PASV\r\n"));
|
|
8004602: 2206 movs r2, #6
|
|
8004604: 495d ldr r1, [pc, #372] ; (800477c <lwftp_control_process+0x2e4>)
|
|
8004606: 68f8 ldr r0, [r7, #12]
|
|
8004608: f7ff fec6 bl 8004398 <lwftp_send_msg>
|
|
s->control_state = LWFTP_PASV_SENT;
|
|
800460c: 68fb ldr r3, [r7, #12]
|
|
800460e: 2206 movs r2, #6
|
|
8004610: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
} else {
|
|
s->control_state = LWFTP_QUIT;
|
|
}
|
|
}
|
|
break;
|
|
8004614: e0db b.n 80047ce <lwftp_control_process+0x336>
|
|
s->control_state = LWFTP_QUIT;
|
|
8004616: 68fb ldr r3, [r7, #12]
|
|
8004618: 220b movs r2, #11
|
|
800461a: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
break;
|
|
800461e: e0d6 b.n 80047ce <lwftp_control_process+0x336>
|
|
case LWFTP_PASV_SENT:
|
|
if (response > 0) {
|
|
8004620: 697b ldr r3, [r7, #20]
|
|
8004622: 2b00 cmp r3, #0
|
|
8004624: f000 80d5 beq.w 80047d2 <lwftp_control_process+0x33a>
|
|
if (response == 227) {
|
|
8004628: 697b ldr r3, [r7, #20]
|
|
800462a: 2be3 cmp r3, #227 ; 0xe3
|
|
800462c: d136 bne.n 800469c <lwftp_control_process+0x204>
|
|
lwftp_data_open(s, p);
|
|
800462e: 6879 ldr r1, [r7, #4]
|
|
8004630: 68f8 ldr r0, [r7, #12]
|
|
8004632: f7ff fde5 bl 8004200 <lwftp_data_open>
|
|
switch (s->target_state) {
|
|
8004636: 68fb ldr r3, [r7, #12]
|
|
8004638: f893 3029 ldrb.w r3, [r3, #41] ; 0x29
|
|
800463c: 2b07 cmp r3, #7
|
|
800463e: d007 beq.n 8004650 <lwftp_control_process+0x1b8>
|
|
8004640: 2b08 cmp r3, #8
|
|
8004642: d10b bne.n 800465c <lwftp_control_process+0x1c4>
|
|
case LWFTP_STOR_SENT:
|
|
lwftp_send_msg(s, PTRNLEN("STOR "));
|
|
8004644: 2205 movs r2, #5
|
|
8004646: 494e ldr r1, [pc, #312] ; (8004780 <lwftp_control_process+0x2e8>)
|
|
8004648: 68f8 ldr r0, [r7, #12]
|
|
800464a: f7ff fea5 bl 8004398 <lwftp_send_msg>
|
|
break;
|
|
800464e: e00c b.n 800466a <lwftp_control_process+0x1d2>
|
|
case LWFTP_RETR_SENT:
|
|
lwftp_send_msg(s, PTRNLEN("RETR "));
|
|
8004650: 2205 movs r2, #5
|
|
8004652: 494c ldr r1, [pc, #304] ; (8004784 <lwftp_control_process+0x2ec>)
|
|
8004654: 68f8 ldr r0, [r7, #12]
|
|
8004656: f7ff fe9f bl 8004398 <lwftp_send_msg>
|
|
break;
|
|
800465a: e006 b.n 800466a <lwftp_control_process+0x1d2>
|
|
default:
|
|
LOG_ERROR("Unexpected internal state");
|
|
800465c: 484a ldr r0, [pc, #296] ; (8004788 <lwftp_control_process+0x2f0>)
|
|
800465e: f7fb fef3 bl 8000448 <LOG_ERROR>
|
|
s->target_state = LWFTP_QUIT;
|
|
8004662: 68fb ldr r3, [r7, #12]
|
|
8004664: 220b movs r2, #11
|
|
8004666: f883 2029 strb.w r2, [r3, #41] ; 0x29
|
|
}
|
|
lwftp_send_msg(s, s->remote_path, strlen(s->remote_path));
|
|
800466a: 68fb ldr r3, [r7, #12]
|
|
800466c: 689c ldr r4, [r3, #8]
|
|
800466e: 68fb ldr r3, [r7, #12]
|
|
8004670: 689b ldr r3, [r3, #8]
|
|
8004672: 4618 mov r0, r3
|
|
8004674: f7fb fe9c bl 80003b0 <strlen>
|
|
8004678: 4603 mov r3, r0
|
|
800467a: 461a mov r2, r3
|
|
800467c: 4621 mov r1, r4
|
|
800467e: 68f8 ldr r0, [r7, #12]
|
|
8004680: f7ff fe8a bl 8004398 <lwftp_send_msg>
|
|
lwftp_send_msg(s, PTRNLEN("\r\n"));
|
|
8004684: 2202 movs r2, #2
|
|
8004686: 493a ldr r1, [pc, #232] ; (8004770 <lwftp_control_process+0x2d8>)
|
|
8004688: 68f8 ldr r0, [r7, #12]
|
|
800468a: f7ff fe85 bl 8004398 <lwftp_send_msg>
|
|
s->control_state = s->target_state;
|
|
800468e: 68fb ldr r3, [r7, #12]
|
|
8004690: f893 2029 ldrb.w r2, [r3, #41] ; 0x29
|
|
8004694: 68fb ldr r3, [r7, #12]
|
|
8004696: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
} else {
|
|
s->control_state = LWFTP_QUIT;
|
|
}
|
|
}
|
|
break;
|
|
800469a: e09a b.n 80047d2 <lwftp_control_process+0x33a>
|
|
s->control_state = LWFTP_QUIT;
|
|
800469c: 68fb ldr r3, [r7, #12]
|
|
800469e: 220b movs r2, #11
|
|
80046a0: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
break;
|
|
80046a4: e095 b.n 80047d2 <lwftp_control_process+0x33a>
|
|
case LWFTP_RETR_SENT:
|
|
if (response > 0) {
|
|
80046a6: 697b ldr r3, [r7, #20]
|
|
80046a8: 2b00 cmp r3, #0
|
|
80046aa: f000 8094 beq.w 80047d6 <lwftp_control_process+0x33e>
|
|
if (response == 150) {
|
|
80046ae: 697b ldr r3, [r7, #20]
|
|
80046b0: 2b96 cmp r3, #150 ; 0x96
|
|
80046b2: d104 bne.n 80046be <lwftp_control_process+0x226>
|
|
s->control_state = LWFTP_XFERING;
|
|
80046b4: 68fb ldr r3, [r7, #12]
|
|
80046b6: 2209 movs r2, #9
|
|
80046b8: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
} else {
|
|
s->control_state = LWFTP_DATAEND;
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:expected 150, received %d\n",response));
|
|
}
|
|
}
|
|
break;
|
|
80046bc: e08b b.n 80047d6 <lwftp_control_process+0x33e>
|
|
} else if (response == 550) {
|
|
80046be: 697b ldr r3, [r7, #20]
|
|
80046c0: f240 2226 movw r2, #550 ; 0x226
|
|
80046c4: 4293 cmp r3, r2
|
|
80046c6: d10c bne.n 80046e2 <lwftp_control_process+0x24a>
|
|
s->control_state = LWFTP_DATAEND;
|
|
80046c8: 68fb ldr r3, [r7, #12]
|
|
80046ca: 220a movs r2, #10
|
|
80046cc: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
result = LWFTP_RESULT_ERR_FILENAME;
|
|
80046d0: 230d movs r3, #13
|
|
80046d2: 613b str r3, [r7, #16]
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp: Failed to open file '%s'\n", s->remote_path));
|
|
80046d4: 68fb ldr r3, [r7, #12]
|
|
80046d6: 689b ldr r3, [r3, #8]
|
|
80046d8: 4619 mov r1, r3
|
|
80046da: 482c ldr r0, [pc, #176] ; (800478c <lwftp_control_process+0x2f4>)
|
|
80046dc: f00c fa74 bl 8010bc8 <iprintf>
|
|
break;
|
|
80046e0: e079 b.n 80047d6 <lwftp_control_process+0x33e>
|
|
s->control_state = LWFTP_DATAEND;
|
|
80046e2: 68fb ldr r3, [r7, #12]
|
|
80046e4: 220a movs r2, #10
|
|
80046e6: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:expected 150, received %d\n",response));
|
|
80046ea: 6979 ldr r1, [r7, #20]
|
|
80046ec: 4828 ldr r0, [pc, #160] ; (8004790 <lwftp_control_process+0x2f8>)
|
|
80046ee: f00c fa6b bl 8010bc8 <iprintf>
|
|
break;
|
|
80046f2: e070 b.n 80047d6 <lwftp_control_process+0x33e>
|
|
case LWFTP_STOR_SENT:
|
|
if (response > 0) {
|
|
80046f4: 697b ldr r3, [r7, #20]
|
|
80046f6: 2b00 cmp r3, #0
|
|
80046f8: d06f beq.n 80047da <lwftp_control_process+0x342>
|
|
if (response == 150) {
|
|
80046fa: 697b ldr r3, [r7, #20]
|
|
80046fc: 2b96 cmp r3, #150 ; 0x96
|
|
80046fe: d109 bne.n 8004714 <lwftp_control_process+0x27c>
|
|
s->control_state = LWFTP_XFERING;
|
|
8004700: 68fb ldr r3, [r7, #12]
|
|
8004702: 2209 movs r2, #9
|
|
8004704: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
lwftp_data_sent(s, NULL, 0);
|
|
8004708: 2200 movs r2, #0
|
|
800470a: 2100 movs r1, #0
|
|
800470c: 68f8 ldr r0, [r7, #12]
|
|
800470e: f7ff fd05 bl 800411c <lwftp_data_sent>
|
|
} else {
|
|
s->control_state = LWFTP_DATAEND;
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:expected 150, received %d\n",response));
|
|
}
|
|
}
|
|
break;
|
|
8004712: e062 b.n 80047da <lwftp_control_process+0x342>
|
|
s->control_state = LWFTP_DATAEND;
|
|
8004714: 68fb ldr r3, [r7, #12]
|
|
8004716: 220a movs r2, #10
|
|
8004718: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:expected 150, received %d\n",response));
|
|
800471c: 6979 ldr r1, [r7, #20]
|
|
800471e: 481c ldr r0, [pc, #112] ; (8004790 <lwftp_control_process+0x2f8>)
|
|
8004720: f00c fa52 bl 8010bc8 <iprintf>
|
|
break;
|
|
8004724: e059 b.n 80047da <lwftp_control_process+0x342>
|
|
case LWFTP_XFERING:
|
|
if (response > 0) {
|
|
8004726: 697b ldr r3, [r7, #20]
|
|
8004728: 2b00 cmp r3, #0
|
|
800472a: d058 beq.n 80047de <lwftp_control_process+0x346>
|
|
if (response == 226) {
|
|
800472c: 697b ldr r3, [r7, #20]
|
|
800472e: 2be2 cmp r3, #226 ; 0xe2
|
|
8004730: d102 bne.n 8004738 <lwftp_control_process+0x2a0>
|
|
result = LWFTP_RESULT_OK;
|
|
8004732: 2300 movs r3, #0
|
|
8004734: 613b str r3, [r7, #16]
|
|
8004736: e005 b.n 8004744 <lwftp_control_process+0x2ac>
|
|
} else {
|
|
result = LWFTP_RESULT_ERR_CLOSED;
|
|
8004738: 2308 movs r3, #8
|
|
800473a: 613b str r3, [r7, #16]
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:expected 226, received %d\n",response));
|
|
800473c: 6979 ldr r1, [r7, #20]
|
|
800473e: 4815 ldr r0, [pc, #84] ; (8004794 <lwftp_control_process+0x2fc>)
|
|
8004740: f00c fa42 bl 8010bc8 <iprintf>
|
|
}
|
|
s->control_state = LWFTP_DATAEND;
|
|
8004744: 68fb ldr r3, [r7, #12]
|
|
8004746: 220a movs r2, #10
|
|
8004748: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
}
|
|
break;
|
|
800474c: e047 b.n 80047de <lwftp_control_process+0x346>
|
|
case LWFTP_DATAEND:
|
|
LOG_TRACE("forced end of data session");
|
|
800474e: 4812 ldr r0, [pc, #72] ; (8004798 <lwftp_control_process+0x300>)
|
|
8004750: f7fb fea6 bl 80004a0 <LOG_TRACE>
|
|
break;
|
|
8004754: e046 b.n 80047e4 <lwftp_control_process+0x34c>
|
|
case LWFTP_QUIT_SENT:
|
|
if (response > 0) {
|
|
8004756: 697b ldr r3, [r7, #20]
|
|
8004758: 2b00 cmp r3, #0
|
|
800475a: d042 beq.n 80047e2 <lwftp_control_process+0x34a>
|
|
if (response == 221) {
|
|
800475c: 697b ldr r3, [r7, #20]
|
|
800475e: 2bdd cmp r3, #221 ; 0xdd
|
|
8004760: d11c bne.n 800479c <lwftp_control_process+0x304>
|
|
result = LWFTP_RESULT_OK;
|
|
8004762: 2300 movs r3, #0
|
|
8004764: 613b str r3, [r7, #16]
|
|
8004766: e01f b.n 80047a8 <lwftp_control_process+0x310>
|
|
8004768: 080117b4 .word 0x080117b4
|
|
800476c: 080117cc .word 0x080117cc
|
|
8004770: 080117d4 .word 0x080117d4
|
|
8004774: 080117d8 .word 0x080117d8
|
|
8004778: 080117e0 .word 0x080117e0
|
|
800477c: 080117f8 .word 0x080117f8
|
|
8004780: 08011800 .word 0x08011800
|
|
8004784: 08011808 .word 0x08011808
|
|
8004788: 08011810 .word 0x08011810
|
|
800478c: 0801182c .word 0x0801182c
|
|
8004790: 08011850 .word 0x08011850
|
|
8004794: 08011874 .word 0x08011874
|
|
8004798: 08011898 .word 0x08011898
|
|
} else {
|
|
result = LWFTP_RESULT_ERR_UNKNOWN;
|
|
800479c: 2303 movs r3, #3
|
|
800479e: 613b str r3, [r7, #16]
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:expected 221, received %d\n",response));
|
|
80047a0: 6979 ldr r1, [r7, #20]
|
|
80047a2: 482a ldr r0, [pc, #168] ; (800484c <lwftp_control_process+0x3b4>)
|
|
80047a4: f00c fa10 bl 8010bc8 <iprintf>
|
|
}
|
|
s->control_state = LWFTP_CLOSING;
|
|
80047a8: 68fb ldr r3, [r7, #12]
|
|
80047aa: 220d movs r2, #13
|
|
80047ac: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
}
|
|
break;
|
|
80047b0: e017 b.n 80047e2 <lwftp_control_process+0x34a>
|
|
default:
|
|
LWIP_DEBUGF(LWFTP_SEVERE, ("lwftp:unhandled state (%d)\n",s->control_state));
|
|
80047b2: 68fb ldr r3, [r7, #12]
|
|
80047b4: f893 3028 ldrb.w r3, [r3, #40] ; 0x28
|
|
80047b8: 4619 mov r1, r3
|
|
80047ba: 4825 ldr r0, [pc, #148] ; (8004850 <lwftp_control_process+0x3b8>)
|
|
80047bc: f00c fa04 bl 8010bc8 <iprintf>
|
|
80047c0: e010 b.n 80047e4 <lwftp_control_process+0x34c>
|
|
break;
|
|
80047c2: bf00 nop
|
|
80047c4: e00e b.n 80047e4 <lwftp_control_process+0x34c>
|
|
break;
|
|
80047c6: bf00 nop
|
|
80047c8: e00c b.n 80047e4 <lwftp_control_process+0x34c>
|
|
break;
|
|
80047ca: bf00 nop
|
|
80047cc: e00a b.n 80047e4 <lwftp_control_process+0x34c>
|
|
break;
|
|
80047ce: bf00 nop
|
|
80047d0: e008 b.n 80047e4 <lwftp_control_process+0x34c>
|
|
break;
|
|
80047d2: bf00 nop
|
|
80047d4: e006 b.n 80047e4 <lwftp_control_process+0x34c>
|
|
break;
|
|
80047d6: bf00 nop
|
|
80047d8: e004 b.n 80047e4 <lwftp_control_process+0x34c>
|
|
break;
|
|
80047da: bf00 nop
|
|
80047dc: e002 b.n 80047e4 <lwftp_control_process+0x34c>
|
|
break;
|
|
80047de: bf00 nop
|
|
80047e0: e000 b.n 80047e4 <lwftp_control_process+0x34c>
|
|
break;
|
|
80047e2: bf00 nop
|
|
}
|
|
|
|
// Free receiving pbuf if any
|
|
if (p) {
|
|
80047e4: 687b ldr r3, [r7, #4]
|
|
80047e6: 2b00 cmp r3, #0
|
|
80047e8: d002 beq.n 80047f0 <lwftp_control_process+0x358>
|
|
pbuf_free(p);
|
|
80047ea: 6878 ldr r0, [r7, #4]
|
|
80047ec: f002 fbf2 bl 8006fd4 <pbuf_free>
|
|
}
|
|
|
|
// Handle second step in state machine
|
|
switch (s->control_state) {
|
|
80047f0: 68fb ldr r3, [r7, #12]
|
|
80047f2: f893 3028 ldrb.w r3, [r3, #40] ; 0x28
|
|
80047f6: 2b0d cmp r3, #13
|
|
80047f8: d01e beq.n 8004838 <lwftp_control_process+0x3a0>
|
|
80047fa: 2b0d cmp r3, #13
|
|
80047fc: dc21 bgt.n 8004842 <lwftp_control_process+0x3aa>
|
|
80047fe: 2b0a cmp r3, #10
|
|
8004800: d002 beq.n 8004808 <lwftp_control_process+0x370>
|
|
8004802: 2b0b cmp r3, #11
|
|
8004804: d009 beq.n 800481a <lwftp_control_process+0x382>
|
|
lwftp_control_close(s, result);
|
|
break;
|
|
default:
|
|
;
|
|
}
|
|
}
|
|
8004806: e01c b.n 8004842 <lwftp_control_process+0x3aa>
|
|
lwftp_data_close(s, result);
|
|
8004808: 6939 ldr r1, [r7, #16]
|
|
800480a: 68f8 ldr r0, [r7, #12]
|
|
800480c: f7ff fdf0 bl 80043f0 <lwftp_data_close>
|
|
s->control_state = LWFTP_LOGGED;
|
|
8004810: 68fb ldr r3, [r7, #12]
|
|
8004812: 2204 movs r2, #4
|
|
8004814: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
break;
|
|
8004818: e013 b.n 8004842 <lwftp_control_process+0x3aa>
|
|
lwftp_send_msg(s, PTRNLEN("QUIT\r\n"));
|
|
800481a: 2206 movs r2, #6
|
|
800481c: 490d ldr r1, [pc, #52] ; (8004854 <lwftp_control_process+0x3bc>)
|
|
800481e: 68f8 ldr r0, [r7, #12]
|
|
8004820: f7ff fdba bl 8004398 <lwftp_send_msg>
|
|
tcp_output(s->control_pcb);
|
|
8004824: 68fb ldr r3, [r7, #12]
|
|
8004826: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8004828: 4618 mov r0, r3
|
|
800482a: f007 fee3 bl 800c5f4 <tcp_output>
|
|
s->control_state = LWFTP_QUIT_SENT;
|
|
800482e: 68fb ldr r3, [r7, #12]
|
|
8004830: 220c movs r2, #12
|
|
8004832: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
break;
|
|
8004836: e004 b.n 8004842 <lwftp_control_process+0x3aa>
|
|
lwftp_control_close(s, result);
|
|
8004838: 6939 ldr r1, [r7, #16]
|
|
800483a: 68f8 ldr r0, [r7, #12]
|
|
800483c: f7ff fdf8 bl 8004430 <lwftp_control_close>
|
|
break;
|
|
8004840: bf00 nop
|
|
}
|
|
8004842: bf00 nop
|
|
8004844: 371c adds r7, #28
|
|
8004846: 46bd mov sp, r7
|
|
8004848: bd90 pop {r4, r7, pc}
|
|
800484a: bf00 nop
|
|
800484c: 080118b4 .word 0x080118b4
|
|
8004850: 080118d8 .word 0x080118d8
|
|
8004854: 080118f4 .word 0x080118f4
|
|
|
|
08004858 <lwftp_control_recv>:
|
|
* @param pointer to PCB
|
|
* @param pointer to incoming pbuf
|
|
* @param state of incoming process
|
|
*/
|
|
static err_t lwftp_control_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p,
|
|
err_t err) {
|
|
8004858: b580 push {r7, lr}
|
|
800485a: b086 sub sp, #24
|
|
800485c: af00 add r7, sp, #0
|
|
800485e: 60f8 str r0, [r7, #12]
|
|
8004860: 60b9 str r1, [r7, #8]
|
|
8004862: 607a str r2, [r7, #4]
|
|
8004864: 70fb strb r3, [r7, #3]
|
|
lwftp_session_t *s = (lwftp_session_t*) arg;
|
|
8004866: 68fb ldr r3, [r7, #12]
|
|
8004868: 617b str r3, [r7, #20]
|
|
|
|
if (err == ERR_OK) {
|
|
800486a: f997 3003 ldrsb.w r3, [r7, #3]
|
|
800486e: 2b00 cmp r3, #0
|
|
8004870: d116 bne.n 80048a0 <lwftp_control_recv+0x48>
|
|
if (p) {
|
|
8004872: 687b ldr r3, [r7, #4]
|
|
8004874: 2b00 cmp r3, #0
|
|
8004876: d00b beq.n 8004890 <lwftp_control_recv+0x38>
|
|
tcp_recved(tpcb, p->tot_len);
|
|
8004878: 687b ldr r3, [r7, #4]
|
|
800487a: 891b ldrh r3, [r3, #8]
|
|
800487c: 4619 mov r1, r3
|
|
800487e: 68b8 ldr r0, [r7, #8]
|
|
8004880: f003 f996 bl 8007bb0 <tcp_recved>
|
|
lwftp_control_process(s, tpcb, p);
|
|
8004884: 687a ldr r2, [r7, #4]
|
|
8004886: 68b9 ldr r1, [r7, #8]
|
|
8004888: 6978 ldr r0, [r7, #20]
|
|
800488a: f7ff fe05 bl 8004498 <lwftp_control_process>
|
|
800488e: e015 b.n 80048bc <lwftp_control_recv+0x64>
|
|
} else {
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:connection closed by remote host\n"));
|
|
8004890: 480d ldr r0, [pc, #52] ; (80048c8 <lwftp_control_recv+0x70>)
|
|
8004892: f00c fa07 bl 8010ca4 <puts>
|
|
lwftp_control_close(s, LWFTP_RESULT_ERR_CLOSED);
|
|
8004896: 2108 movs r1, #8
|
|
8004898: 6978 ldr r0, [r7, #20]
|
|
800489a: f7ff fdc9 bl 8004430 <lwftp_control_close>
|
|
800489e: e00d b.n 80048bc <lwftp_control_recv+0x64>
|
|
}
|
|
} else {
|
|
LWIP_DEBUGF(LWFTP_SERIOUS, ("lwftp:failed to receive (%s)\n",lwip_strerr(err)));
|
|
80048a0: f997 3003 ldrsb.w r3, [r7, #3]
|
|
80048a4: 4618 mov r0, r3
|
|
80048a6: f000 fe31 bl 800550c <lwip_strerr>
|
|
80048aa: 4603 mov r3, r0
|
|
80048ac: 4619 mov r1, r3
|
|
80048ae: 4807 ldr r0, [pc, #28] ; (80048cc <lwftp_control_recv+0x74>)
|
|
80048b0: f00c f98a bl 8010bc8 <iprintf>
|
|
lwftp_control_close(s, LWFTP_RESULT_ERR_UNKNOWN);
|
|
80048b4: 2103 movs r1, #3
|
|
80048b6: 6978 ldr r0, [r7, #20]
|
|
80048b8: f7ff fdba bl 8004430 <lwftp_control_close>
|
|
}
|
|
return err;
|
|
80048bc: f997 3003 ldrsb.w r3, [r7, #3]
|
|
}
|
|
80048c0: 4618 mov r0, r3
|
|
80048c2: 3718 adds r7, #24
|
|
80048c4: 46bd mov sp, r7
|
|
80048c6: bd80 pop {r7, pc}
|
|
80048c8: 08011920 .word 0x08011920
|
|
80048cc: 08011948 .word 0x08011948
|
|
|
|
080048d0 <lwftp_control_sent>:
|
|
/** Handle control connection acknowledge of sent data
|
|
* @param pointer to lwftp session data
|
|
* @param pointer to PCB
|
|
* @param number of bytes sent
|
|
*/
|
|
static err_t lwftp_control_sent(void *arg, struct tcp_pcb *tpcb, u16_t len) {
|
|
80048d0: b580 push {r7, lr}
|
|
80048d2: b084 sub sp, #16
|
|
80048d4: af00 add r7, sp, #0
|
|
80048d6: 60f8 str r0, [r7, #12]
|
|
80048d8: 60b9 str r1, [r7, #8]
|
|
80048da: 4613 mov r3, r2
|
|
80048dc: 80fb strh r3, [r7, #6]
|
|
LWIP_DEBUGF(LWFTP_TRACE, ("lwftp:successfully sent %d bytes\n",len));
|
|
80048de: 88fb ldrh r3, [r7, #6]
|
|
80048e0: 4619 mov r1, r3
|
|
80048e2: 4804 ldr r0, [pc, #16] ; (80048f4 <lwftp_control_sent+0x24>)
|
|
80048e4: f00c f970 bl 8010bc8 <iprintf>
|
|
return ERR_OK;
|
|
80048e8: 2300 movs r3, #0
|
|
}
|
|
80048ea: 4618 mov r0, r3
|
|
80048ec: 3710 adds r7, #16
|
|
80048ee: 46bd mov sp, r7
|
|
80048f0: bd80 pop {r7, pc}
|
|
80048f2: bf00 nop
|
|
80048f4: 08011968 .word 0x08011968
|
|
|
|
080048f8 <lwftp_control_err>:
|
|
|
|
/** Handle control connection error
|
|
* @param pointer to lwftp session data
|
|
* @param state of connection
|
|
*/
|
|
static void lwftp_control_err(void *arg, err_t err) {
|
|
80048f8: b580 push {r7, lr}
|
|
80048fa: b084 sub sp, #16
|
|
80048fc: af00 add r7, sp, #0
|
|
80048fe: 6078 str r0, [r7, #4]
|
|
8004900: 460b mov r3, r1
|
|
8004902: 70fb strb r3, [r7, #3]
|
|
LWIP_UNUSED_ARG(err);
|
|
if (arg != NULL) {
|
|
8004904: 687b ldr r3, [r7, #4]
|
|
8004906: 2b00 cmp r3, #0
|
|
8004908: d01f beq.n 800494a <lwftp_control_err+0x52>
|
|
lwftp_session_t *s = (lwftp_session_t*) arg;
|
|
800490a: 687b ldr r3, [r7, #4]
|
|
800490c: 60bb str r3, [r7, #8]
|
|
int result;
|
|
if (s->control_state == LWFTP_CLOSED) {
|
|
800490e: 68bb ldr r3, [r7, #8]
|
|
8004910: f893 3028 ldrb.w r3, [r3, #40] ; 0x28
|
|
8004914: 2b00 cmp r3, #0
|
|
8004916: d10c bne.n 8004932 <lwftp_control_err+0x3a>
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:failed to connect to server (%s)\n",lwip_strerr(err)));
|
|
8004918: f997 3003 ldrsb.w r3, [r7, #3]
|
|
800491c: 4618 mov r0, r3
|
|
800491e: f000 fdf5 bl 800550c <lwip_strerr>
|
|
8004922: 4603 mov r3, r0
|
|
8004924: 4619 mov r1, r3
|
|
8004926: 480b ldr r0, [pc, #44] ; (8004954 <lwftp_control_err+0x5c>)
|
|
8004928: f00c f94e bl 8010bc8 <iprintf>
|
|
result = LWFTP_RESULT_ERR_CONNECT;
|
|
800492c: 2306 movs r3, #6
|
|
800492e: 60fb str r3, [r7, #12]
|
|
8004930: e004 b.n 800493c <lwftp_control_err+0x44>
|
|
} else {
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:connection closed by remote host\n"));
|
|
8004932: 4809 ldr r0, [pc, #36] ; (8004958 <lwftp_control_err+0x60>)
|
|
8004934: f00c f9b6 bl 8010ca4 <puts>
|
|
result = LWFTP_RESULT_ERR_CLOSED;
|
|
8004938: 2308 movs r3, #8
|
|
800493a: 60fb str r3, [r7, #12]
|
|
}
|
|
s->control_pcb = NULL; // No need to de-allocate PCB
|
|
800493c: 68bb ldr r3, [r7, #8]
|
|
800493e: 2200 movs r2, #0
|
|
8004940: 62da str r2, [r3, #44] ; 0x2c
|
|
lwftp_control_close(s, result);
|
|
8004942: 68f9 ldr r1, [r7, #12]
|
|
8004944: 68b8 ldr r0, [r7, #8]
|
|
8004946: f7ff fd73 bl 8004430 <lwftp_control_close>
|
|
}
|
|
}
|
|
800494a: bf00 nop
|
|
800494c: 3710 adds r7, #16
|
|
800494e: 46bd mov sp, r7
|
|
8004950: bd80 pop {r7, pc}
|
|
8004952: bf00 nop
|
|
8004954: 0801198c .word 0x0801198c
|
|
8004958: 08011920 .word 0x08011920
|
|
|
|
0800495c <lwftp_control_connected>:
|
|
/** Process newly connected PCB
|
|
* @param pointer to lwftp session data
|
|
* @param pointer to PCB
|
|
* @param state of connection
|
|
*/
|
|
static err_t lwftp_control_connected(void *arg, struct tcp_pcb *tpcb, err_t err) {
|
|
800495c: b580 push {r7, lr}
|
|
800495e: b086 sub sp, #24
|
|
8004960: af00 add r7, sp, #0
|
|
8004962: 60f8 str r0, [r7, #12]
|
|
8004964: 60b9 str r1, [r7, #8]
|
|
8004966: 4613 mov r3, r2
|
|
8004968: 71fb strb r3, [r7, #7]
|
|
lwftp_session_t *s = (lwftp_session_t*) arg;
|
|
800496a: 68fb ldr r3, [r7, #12]
|
|
800496c: 617b str r3, [r7, #20]
|
|
|
|
if (err == ERR_OK) {
|
|
800496e: f997 3007 ldrsb.w r3, [r7, #7]
|
|
8004972: 2b00 cmp r3, #0
|
|
8004974: d103 bne.n 800497e <lwftp_control_connected+0x22>
|
|
LWIP_DEBUGF(LWFTP_STATE, ("lwftp:connected to server\n"));
|
|
8004976: 480f ldr r0, [pc, #60] ; (80049b4 <lwftp_control_connected+0x58>)
|
|
8004978: f00c f994 bl 8010ca4 <puts>
|
|
800497c: e014 b.n 80049a8 <lwftp_control_connected+0x4c>
|
|
} else {
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:err in control_connected (%s)\n", lwip_strerr(err)));
|
|
800497e: f997 3007 ldrsb.w r3, [r7, #7]
|
|
8004982: 4618 mov r0, r3
|
|
8004984: f000 fdc2 bl 800550c <lwip_strerr>
|
|
8004988: 4603 mov r3, r0
|
|
800498a: 4619 mov r1, r3
|
|
800498c: 480a ldr r0, [pc, #40] ; (80049b8 <lwftp_control_connected+0x5c>)
|
|
800498e: f00c f91b bl 8010bc8 <iprintf>
|
|
if (s->done_fn) {
|
|
8004992: 697b ldr r3, [r7, #20]
|
|
8004994: 6a1b ldr r3, [r3, #32]
|
|
8004996: 2b00 cmp r3, #0
|
|
8004998: d006 beq.n 80049a8 <lwftp_control_connected+0x4c>
|
|
s->done_fn(s->handle, LWFTP_RESULT_ERR_CONNECT); // 연결 실패 상태 전달
|
|
800499a: 697b ldr r3, [r7, #20]
|
|
800499c: 6a1b ldr r3, [r3, #32]
|
|
800499e: 697a ldr r2, [r7, #20]
|
|
80049a0: 6952 ldr r2, [r2, #20]
|
|
80049a2: 2106 movs r1, #6
|
|
80049a4: 4610 mov r0, r2
|
|
80049a6: 4798 blx r3
|
|
}
|
|
}
|
|
return err;
|
|
80049a8: f997 3007 ldrsb.w r3, [r7, #7]
|
|
}
|
|
80049ac: 4618 mov r0, r3
|
|
80049ae: 3718 adds r7, #24
|
|
80049b0: 46bd mov sp, r7
|
|
80049b2: bd80 pop {r7, pc}
|
|
80049b4: 080119b4 .word 0x080119b4
|
|
80049b8: 080119d0 .word 0x080119d0
|
|
|
|
080049bc <lwftp_connect>:
|
|
|
|
/** Open a control session
|
|
* @param Session structure
|
|
*/
|
|
err_t lwftp_connect(lwftp_session_t *s) {
|
|
80049bc: b580 push {r7, lr}
|
|
80049be: b084 sub sp, #16
|
|
80049c0: af00 add r7, sp, #0
|
|
80049c2: 6078 str r0, [r7, #4]
|
|
err_t error;
|
|
enum lwftp_results retval = LWFTP_RESULT_ERR_UNKNOWN;
|
|
80049c4: 2303 movs r3, #3
|
|
80049c6: 73fb strb r3, [r7, #15]
|
|
|
|
// Check user supplied data
|
|
if ((s->control_state != LWFTP_CLOSED) || s->control_pcb || s->data_pcb
|
|
80049c8: 687b ldr r3, [r7, #4]
|
|
80049ca: f893 3028 ldrb.w r3, [r3, #40] ; 0x28
|
|
80049ce: 2b00 cmp r3, #0
|
|
80049d0: d10f bne.n 80049f2 <lwftp_connect+0x36>
|
|
80049d2: 687b ldr r3, [r7, #4]
|
|
80049d4: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
80049d6: 2b00 cmp r3, #0
|
|
80049d8: d10b bne.n 80049f2 <lwftp_connect+0x36>
|
|
80049da: 687b ldr r3, [r7, #4]
|
|
80049dc: 6b1b ldr r3, [r3, #48] ; 0x30
|
|
80049de: 2b00 cmp r3, #0
|
|
80049e0: d107 bne.n 80049f2 <lwftp_connect+0x36>
|
|
|| !s->user || !s->pass) {
|
|
80049e2: 687b ldr r3, [r7, #4]
|
|
80049e4: 68db ldr r3, [r3, #12]
|
|
80049e6: 2b00 cmp r3, #0
|
|
80049e8: d003 beq.n 80049f2 <lwftp_connect+0x36>
|
|
80049ea: 687b ldr r3, [r7, #4]
|
|
80049ec: 691b ldr r3, [r3, #16]
|
|
80049ee: 2b00 cmp r3, #0
|
|
80049f0: d105 bne.n 80049fe <lwftp_connect+0x42>
|
|
LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:invalid control session\n"));
|
|
80049f2: 482f ldr r0, [pc, #188] ; (8004ab0 <lwftp_connect+0xf4>)
|
|
80049f4: f00c f956 bl 8010ca4 <puts>
|
|
retval = LWFTP_RESULT_ERR_ARGUMENT;
|
|
80049f8: 2304 movs r3, #4
|
|
80049fa: 73fb strb r3, [r7, #15]
|
|
goto exit;
|
|
80049fc: e046 b.n 8004a8c <lwftp_connect+0xd0>
|
|
}
|
|
// Get sessions pcb
|
|
s->control_pcb = tcp_new();
|
|
80049fe: f004 f8a7 bl 8008b50 <tcp_new>
|
|
8004a02: 4602 mov r2, r0
|
|
8004a04: 687b ldr r3, [r7, #4]
|
|
8004a06: 62da str r2, [r3, #44] ; 0x2c
|
|
if (!s->control_pcb) {
|
|
8004a08: 687b ldr r3, [r7, #4]
|
|
8004a0a: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8004a0c: 2b00 cmp r3, #0
|
|
8004a0e: d105 bne.n 8004a1c <lwftp_connect+0x60>
|
|
LWIP_DEBUGF(LWFTP_SERIOUS, ("lwftp:cannot alloc control_pcb (low memory?)\n"));
|
|
8004a10: 4828 ldr r0, [pc, #160] ; (8004ab4 <lwftp_connect+0xf8>)
|
|
8004a12: f00c f947 bl 8010ca4 <puts>
|
|
retval = LWFTP_RESULT_ERR_MEMORY;
|
|
8004a16: 2305 movs r3, #5
|
|
8004a18: 73fb strb r3, [r7, #15]
|
|
goto exit;
|
|
8004a1a: e037 b.n 8004a8c <lwftp_connect+0xd0>
|
|
}
|
|
// Open control session
|
|
tcp_arg(s->control_pcb, s);
|
|
8004a1c: 687b ldr r3, [r7, #4]
|
|
8004a1e: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8004a20: 6879 ldr r1, [r7, #4]
|
|
8004a22: 4618 mov r0, r3
|
|
8004a24: f004 f89c bl 8008b60 <tcp_arg>
|
|
tcp_err(s->control_pcb, lwftp_control_err);
|
|
8004a28: 687b ldr r3, [r7, #4]
|
|
8004a2a: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8004a2c: 4922 ldr r1, [pc, #136] ; (8004ab8 <lwftp_connect+0xfc>)
|
|
8004a2e: 4618 mov r0, r3
|
|
8004a30: f004 f8ec bl 8008c0c <tcp_err>
|
|
tcp_recv(s->control_pcb, lwftp_control_recv);
|
|
8004a34: 687b ldr r3, [r7, #4]
|
|
8004a36: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8004a38: 4920 ldr r1, [pc, #128] ; (8004abc <lwftp_connect+0x100>)
|
|
8004a3a: 4618 mov r0, r3
|
|
8004a3c: f004 f8a2 bl 8008b84 <tcp_recv>
|
|
tcp_sent(s->control_pcb, lwftp_control_sent);
|
|
8004a40: 687b ldr r3, [r7, #4]
|
|
8004a42: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8004a44: 491e ldr r1, [pc, #120] ; (8004ac0 <lwftp_connect+0x104>)
|
|
8004a46: 4618 mov r0, r3
|
|
8004a48: f004 f8be bl 8008bc8 <tcp_sent>
|
|
error = tcp_connect(s->control_pcb, &s->server_ip, s->server_port,
|
|
8004a4c: 687b ldr r3, [r7, #4]
|
|
8004a4e: 6ad8 ldr r0, [r3, #44] ; 0x2c
|
|
8004a50: 6879 ldr r1, [r7, #4]
|
|
8004a52: 687b ldr r3, [r7, #4]
|
|
8004a54: 889a ldrh r2, [r3, #4]
|
|
8004a56: 4b1b ldr r3, [pc, #108] ; (8004ac4 <lwftp_connect+0x108>)
|
|
8004a58: f003 f940 bl 8007cdc <tcp_connect>
|
|
8004a5c: 4603 mov r3, r0
|
|
8004a5e: 73bb strb r3, [r7, #14]
|
|
lwftp_control_connected);
|
|
if (error == ERR_OK) {
|
|
8004a60: f997 300e ldrsb.w r3, [r7, #14]
|
|
8004a64: 2b00 cmp r3, #0
|
|
8004a66: d102 bne.n 8004a6e <lwftp_connect+0xb2>
|
|
retval = LWFTP_RESULT_INPROGRESS;
|
|
8004a68: 2301 movs r3, #1
|
|
8004a6a: 73fb strb r3, [r7, #15]
|
|
goto exit;
|
|
8004a6c: e00e b.n 8004a8c <lwftp_connect+0xd0>
|
|
}
|
|
|
|
// Release pcbs in case of failure
|
|
LWIP_DEBUGF(LWFTP_SERIOUS, ("lwftp:cannot connect control_pcb (%s)\n", lwip_strerr(error)));
|
|
8004a6e: f997 300e ldrsb.w r3, [r7, #14]
|
|
8004a72: 4618 mov r0, r3
|
|
8004a74: f000 fd4a bl 800550c <lwip_strerr>
|
|
8004a78: 4603 mov r3, r0
|
|
8004a7a: 4619 mov r1, r3
|
|
8004a7c: 4812 ldr r0, [pc, #72] ; (8004ac8 <lwftp_connect+0x10c>)
|
|
8004a7e: f00c f8a3 bl 8010bc8 <iprintf>
|
|
lwftp_control_close(s, -1);
|
|
8004a82: f04f 31ff mov.w r1, #4294967295
|
|
8004a86: 6878 ldr r0, [r7, #4]
|
|
8004a88: f7ff fcd2 bl 8004430 <lwftp_control_close>
|
|
|
|
exit: if (s->done_fn)
|
|
8004a8c: 687b ldr r3, [r7, #4]
|
|
8004a8e: 6a1b ldr r3, [r3, #32]
|
|
8004a90: 2b00 cmp r3, #0
|
|
8004a92: d006 beq.n 8004aa2 <lwftp_connect+0xe6>
|
|
s->done_fn(s->handle, retval);
|
|
8004a94: 687b ldr r3, [r7, #4]
|
|
8004a96: 6a1b ldr r3, [r3, #32]
|
|
8004a98: 687a ldr r2, [r7, #4]
|
|
8004a9a: 6952 ldr r2, [r2, #20]
|
|
8004a9c: 7bf9 ldrb r1, [r7, #15]
|
|
8004a9e: 4610 mov r0, r2
|
|
8004aa0: 4798 blx r3
|
|
return retval;
|
|
8004aa2: f997 300f ldrsb.w r3, [r7, #15]
|
|
}
|
|
8004aa6: 4618 mov r0, r3
|
|
8004aa8: 3710 adds r7, #16
|
|
8004aaa: 46bd mov sp, r7
|
|
8004aac: bd80 pop {r7, pc}
|
|
8004aae: bf00 nop
|
|
8004ab0: 080119f8 .word 0x080119f8
|
|
8004ab4: 08011a18 .word 0x08011a18
|
|
8004ab8: 080048f9 .word 0x080048f9
|
|
8004abc: 08004859 .word 0x08004859
|
|
8004ac0: 080048d1 .word 0x080048d1
|
|
8004ac4: 0800495d .word 0x0800495d
|
|
8004ac8: 08011a48 .word 0x08011a48
|
|
|
|
08004acc <MX_LWIP_Init>:
|
|
|
|
/**
|
|
* LwIP initialization function
|
|
*/
|
|
void MX_LWIP_Init(void)
|
|
{
|
|
8004acc: b580 push {r7, lr}
|
|
8004ace: b084 sub sp, #16
|
|
8004ad0: af04 add r7, sp, #16
|
|
/* IP addresses initialization */
|
|
IP_ADDRESS[0] = 192;
|
|
8004ad2: 4b87 ldr r3, [pc, #540] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004ad4: 22c0 movs r2, #192 ; 0xc0
|
|
8004ad6: 701a strb r2, [r3, #0]
|
|
IP_ADDRESS[1] = 168;
|
|
8004ad8: 4b85 ldr r3, [pc, #532] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004ada: 22a8 movs r2, #168 ; 0xa8
|
|
8004adc: 705a strb r2, [r3, #1]
|
|
IP_ADDRESS[2] = 0;
|
|
8004ade: 4b84 ldr r3, [pc, #528] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004ae0: 2200 movs r2, #0
|
|
8004ae2: 709a strb r2, [r3, #2]
|
|
IP_ADDRESS[3] = 120;
|
|
8004ae4: 4b82 ldr r3, [pc, #520] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004ae6: 2278 movs r2, #120 ; 0x78
|
|
8004ae8: 70da strb r2, [r3, #3]
|
|
NETMASK_ADDRESS[0] = 255;
|
|
8004aea: 4b82 ldr r3, [pc, #520] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004aec: 22ff movs r2, #255 ; 0xff
|
|
8004aee: 701a strb r2, [r3, #0]
|
|
NETMASK_ADDRESS[1] = 255;
|
|
8004af0: 4b80 ldr r3, [pc, #512] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004af2: 22ff movs r2, #255 ; 0xff
|
|
8004af4: 705a strb r2, [r3, #1]
|
|
NETMASK_ADDRESS[2] = 255;
|
|
8004af6: 4b7f ldr r3, [pc, #508] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004af8: 22ff movs r2, #255 ; 0xff
|
|
8004afa: 709a strb r2, [r3, #2]
|
|
NETMASK_ADDRESS[3] = 0;
|
|
8004afc: 4b7d ldr r3, [pc, #500] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004afe: 2200 movs r2, #0
|
|
8004b00: 70da strb r2, [r3, #3]
|
|
GATEWAY_ADDRESS[0] = 0;
|
|
8004b02: 4b7d ldr r3, [pc, #500] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004b04: 2200 movs r2, #0
|
|
8004b06: 701a strb r2, [r3, #0]
|
|
GATEWAY_ADDRESS[1] = 0;
|
|
8004b08: 4b7b ldr r3, [pc, #492] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004b0a: 2200 movs r2, #0
|
|
8004b0c: 705a strb r2, [r3, #1]
|
|
GATEWAY_ADDRESS[2] = 0;
|
|
8004b0e: 4b7a ldr r3, [pc, #488] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004b10: 2200 movs r2, #0
|
|
8004b12: 709a strb r2, [r3, #2]
|
|
GATEWAY_ADDRESS[3] = 0;
|
|
8004b14: 4b78 ldr r3, [pc, #480] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004b16: 2200 movs r2, #0
|
|
8004b18: 70da strb r2, [r3, #3]
|
|
|
|
/* USER CODE BEGIN IP_ADDRESSES */
|
|
/* USER CODE END IP_ADDRESSES */
|
|
|
|
/* Initilialize the LwIP stack without RTOS */
|
|
lwip_init();
|
|
8004b1a: f000 fe01 bl 8005720 <lwip_init>
|
|
|
|
/* IP addresses initialization without DHCP (IPv4) */
|
|
IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
|
|
8004b1e: 4b74 ldr r3, [pc, #464] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b20: 781b ldrb r3, [r3, #0]
|
|
8004b22: 061a lsls r2, r3, #24
|
|
8004b24: 4b72 ldr r3, [pc, #456] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b26: 785b ldrb r3, [r3, #1]
|
|
8004b28: 041b lsls r3, r3, #16
|
|
8004b2a: 431a orrs r2, r3
|
|
8004b2c: 4b70 ldr r3, [pc, #448] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b2e: 789b ldrb r3, [r3, #2]
|
|
8004b30: 021b lsls r3, r3, #8
|
|
8004b32: 4313 orrs r3, r2
|
|
8004b34: 4a6e ldr r2, [pc, #440] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b36: 78d2 ldrb r2, [r2, #3]
|
|
8004b38: 4313 orrs r3, r2
|
|
8004b3a: 061a lsls r2, r3, #24
|
|
8004b3c: 4b6c ldr r3, [pc, #432] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b3e: 781b ldrb r3, [r3, #0]
|
|
8004b40: 0619 lsls r1, r3, #24
|
|
8004b42: 4b6b ldr r3, [pc, #428] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b44: 785b ldrb r3, [r3, #1]
|
|
8004b46: 041b lsls r3, r3, #16
|
|
8004b48: 4319 orrs r1, r3
|
|
8004b4a: 4b69 ldr r3, [pc, #420] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b4c: 789b ldrb r3, [r3, #2]
|
|
8004b4e: 021b lsls r3, r3, #8
|
|
8004b50: 430b orrs r3, r1
|
|
8004b52: 4967 ldr r1, [pc, #412] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b54: 78c9 ldrb r1, [r1, #3]
|
|
8004b56: 430b orrs r3, r1
|
|
8004b58: 021b lsls r3, r3, #8
|
|
8004b5a: f403 037f and.w r3, r3, #16711680 ; 0xff0000
|
|
8004b5e: 431a orrs r2, r3
|
|
8004b60: 4b63 ldr r3, [pc, #396] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b62: 781b ldrb r3, [r3, #0]
|
|
8004b64: 0619 lsls r1, r3, #24
|
|
8004b66: 4b62 ldr r3, [pc, #392] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b68: 785b ldrb r3, [r3, #1]
|
|
8004b6a: 041b lsls r3, r3, #16
|
|
8004b6c: 4319 orrs r1, r3
|
|
8004b6e: 4b60 ldr r3, [pc, #384] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b70: 789b ldrb r3, [r3, #2]
|
|
8004b72: 021b lsls r3, r3, #8
|
|
8004b74: 430b orrs r3, r1
|
|
8004b76: 495e ldr r1, [pc, #376] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b78: 78c9 ldrb r1, [r1, #3]
|
|
8004b7a: 430b orrs r3, r1
|
|
8004b7c: 0a1b lsrs r3, r3, #8
|
|
8004b7e: f403 437f and.w r3, r3, #65280 ; 0xff00
|
|
8004b82: 431a orrs r2, r3
|
|
8004b84: 4b5a ldr r3, [pc, #360] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b86: 781b ldrb r3, [r3, #0]
|
|
8004b88: 0619 lsls r1, r3, #24
|
|
8004b8a: 4b59 ldr r3, [pc, #356] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b8c: 785b ldrb r3, [r3, #1]
|
|
8004b8e: 041b lsls r3, r3, #16
|
|
8004b90: 4319 orrs r1, r3
|
|
8004b92: 4b57 ldr r3, [pc, #348] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b94: 789b ldrb r3, [r3, #2]
|
|
8004b96: 021b lsls r3, r3, #8
|
|
8004b98: 430b orrs r3, r1
|
|
8004b9a: 4955 ldr r1, [pc, #340] ; (8004cf0 <MX_LWIP_Init+0x224>)
|
|
8004b9c: 78c9 ldrb r1, [r1, #3]
|
|
8004b9e: 430b orrs r3, r1
|
|
8004ba0: 0e1b lsrs r3, r3, #24
|
|
8004ba2: 4313 orrs r3, r2
|
|
8004ba4: 4a55 ldr r2, [pc, #340] ; (8004cfc <MX_LWIP_Init+0x230>)
|
|
8004ba6: 6013 str r3, [r2, #0]
|
|
IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
|
|
8004ba8: 4b52 ldr r3, [pc, #328] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004baa: 781b ldrb r3, [r3, #0]
|
|
8004bac: 061a lsls r2, r3, #24
|
|
8004bae: 4b51 ldr r3, [pc, #324] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bb0: 785b ldrb r3, [r3, #1]
|
|
8004bb2: 041b lsls r3, r3, #16
|
|
8004bb4: 431a orrs r2, r3
|
|
8004bb6: 4b4f ldr r3, [pc, #316] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bb8: 789b ldrb r3, [r3, #2]
|
|
8004bba: 021b lsls r3, r3, #8
|
|
8004bbc: 4313 orrs r3, r2
|
|
8004bbe: 4a4d ldr r2, [pc, #308] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bc0: 78d2 ldrb r2, [r2, #3]
|
|
8004bc2: 4313 orrs r3, r2
|
|
8004bc4: 061a lsls r2, r3, #24
|
|
8004bc6: 4b4b ldr r3, [pc, #300] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bc8: 781b ldrb r3, [r3, #0]
|
|
8004bca: 0619 lsls r1, r3, #24
|
|
8004bcc: 4b49 ldr r3, [pc, #292] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bce: 785b ldrb r3, [r3, #1]
|
|
8004bd0: 041b lsls r3, r3, #16
|
|
8004bd2: 4319 orrs r1, r3
|
|
8004bd4: 4b47 ldr r3, [pc, #284] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bd6: 789b ldrb r3, [r3, #2]
|
|
8004bd8: 021b lsls r3, r3, #8
|
|
8004bda: 430b orrs r3, r1
|
|
8004bdc: 4945 ldr r1, [pc, #276] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bde: 78c9 ldrb r1, [r1, #3]
|
|
8004be0: 430b orrs r3, r1
|
|
8004be2: 021b lsls r3, r3, #8
|
|
8004be4: f403 037f and.w r3, r3, #16711680 ; 0xff0000
|
|
8004be8: 431a orrs r2, r3
|
|
8004bea: 4b42 ldr r3, [pc, #264] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bec: 781b ldrb r3, [r3, #0]
|
|
8004bee: 0619 lsls r1, r3, #24
|
|
8004bf0: 4b40 ldr r3, [pc, #256] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bf2: 785b ldrb r3, [r3, #1]
|
|
8004bf4: 041b lsls r3, r3, #16
|
|
8004bf6: 4319 orrs r1, r3
|
|
8004bf8: 4b3e ldr r3, [pc, #248] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004bfa: 789b ldrb r3, [r3, #2]
|
|
8004bfc: 021b lsls r3, r3, #8
|
|
8004bfe: 430b orrs r3, r1
|
|
8004c00: 493c ldr r1, [pc, #240] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004c02: 78c9 ldrb r1, [r1, #3]
|
|
8004c04: 430b orrs r3, r1
|
|
8004c06: 0a1b lsrs r3, r3, #8
|
|
8004c08: f403 437f and.w r3, r3, #65280 ; 0xff00
|
|
8004c0c: 431a orrs r2, r3
|
|
8004c0e: 4b39 ldr r3, [pc, #228] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004c10: 781b ldrb r3, [r3, #0]
|
|
8004c12: 0619 lsls r1, r3, #24
|
|
8004c14: 4b37 ldr r3, [pc, #220] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004c16: 785b ldrb r3, [r3, #1]
|
|
8004c18: 041b lsls r3, r3, #16
|
|
8004c1a: 4319 orrs r1, r3
|
|
8004c1c: 4b35 ldr r3, [pc, #212] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004c1e: 789b ldrb r3, [r3, #2]
|
|
8004c20: 021b lsls r3, r3, #8
|
|
8004c22: 430b orrs r3, r1
|
|
8004c24: 4933 ldr r1, [pc, #204] ; (8004cf4 <MX_LWIP_Init+0x228>)
|
|
8004c26: 78c9 ldrb r1, [r1, #3]
|
|
8004c28: 430b orrs r3, r1
|
|
8004c2a: 0e1b lsrs r3, r3, #24
|
|
8004c2c: 4313 orrs r3, r2
|
|
8004c2e: 4a34 ldr r2, [pc, #208] ; (8004d00 <MX_LWIP_Init+0x234>)
|
|
8004c30: 6013 str r3, [r2, #0]
|
|
IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);
|
|
8004c32: 4b31 ldr r3, [pc, #196] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c34: 781b ldrb r3, [r3, #0]
|
|
8004c36: 061a lsls r2, r3, #24
|
|
8004c38: 4b2f ldr r3, [pc, #188] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c3a: 785b ldrb r3, [r3, #1]
|
|
8004c3c: 041b lsls r3, r3, #16
|
|
8004c3e: 431a orrs r2, r3
|
|
8004c40: 4b2d ldr r3, [pc, #180] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c42: 789b ldrb r3, [r3, #2]
|
|
8004c44: 021b lsls r3, r3, #8
|
|
8004c46: 4313 orrs r3, r2
|
|
8004c48: 4a2b ldr r2, [pc, #172] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c4a: 78d2 ldrb r2, [r2, #3]
|
|
8004c4c: 4313 orrs r3, r2
|
|
8004c4e: 061a lsls r2, r3, #24
|
|
8004c50: 4b29 ldr r3, [pc, #164] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c52: 781b ldrb r3, [r3, #0]
|
|
8004c54: 0619 lsls r1, r3, #24
|
|
8004c56: 4b28 ldr r3, [pc, #160] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c58: 785b ldrb r3, [r3, #1]
|
|
8004c5a: 041b lsls r3, r3, #16
|
|
8004c5c: 4319 orrs r1, r3
|
|
8004c5e: 4b26 ldr r3, [pc, #152] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c60: 789b ldrb r3, [r3, #2]
|
|
8004c62: 021b lsls r3, r3, #8
|
|
8004c64: 430b orrs r3, r1
|
|
8004c66: 4924 ldr r1, [pc, #144] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c68: 78c9 ldrb r1, [r1, #3]
|
|
8004c6a: 430b orrs r3, r1
|
|
8004c6c: 021b lsls r3, r3, #8
|
|
8004c6e: f403 037f and.w r3, r3, #16711680 ; 0xff0000
|
|
8004c72: 431a orrs r2, r3
|
|
8004c74: 4b20 ldr r3, [pc, #128] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c76: 781b ldrb r3, [r3, #0]
|
|
8004c78: 0619 lsls r1, r3, #24
|
|
8004c7a: 4b1f ldr r3, [pc, #124] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c7c: 785b ldrb r3, [r3, #1]
|
|
8004c7e: 041b lsls r3, r3, #16
|
|
8004c80: 4319 orrs r1, r3
|
|
8004c82: 4b1d ldr r3, [pc, #116] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c84: 789b ldrb r3, [r3, #2]
|
|
8004c86: 021b lsls r3, r3, #8
|
|
8004c88: 430b orrs r3, r1
|
|
8004c8a: 491b ldr r1, [pc, #108] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c8c: 78c9 ldrb r1, [r1, #3]
|
|
8004c8e: 430b orrs r3, r1
|
|
8004c90: 0a1b lsrs r3, r3, #8
|
|
8004c92: f403 437f and.w r3, r3, #65280 ; 0xff00
|
|
8004c96: 431a orrs r2, r3
|
|
8004c98: 4b17 ldr r3, [pc, #92] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004c9a: 781b ldrb r3, [r3, #0]
|
|
8004c9c: 0619 lsls r1, r3, #24
|
|
8004c9e: 4b16 ldr r3, [pc, #88] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004ca0: 785b ldrb r3, [r3, #1]
|
|
8004ca2: 041b lsls r3, r3, #16
|
|
8004ca4: 4319 orrs r1, r3
|
|
8004ca6: 4b14 ldr r3, [pc, #80] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004ca8: 789b ldrb r3, [r3, #2]
|
|
8004caa: 021b lsls r3, r3, #8
|
|
8004cac: 430b orrs r3, r1
|
|
8004cae: 4912 ldr r1, [pc, #72] ; (8004cf8 <MX_LWIP_Init+0x22c>)
|
|
8004cb0: 78c9 ldrb r1, [r1, #3]
|
|
8004cb2: 430b orrs r3, r1
|
|
8004cb4: 0e1b lsrs r3, r3, #24
|
|
8004cb6: 4313 orrs r3, r2
|
|
8004cb8: 4a12 ldr r2, [pc, #72] ; (8004d04 <MX_LWIP_Init+0x238>)
|
|
8004cba: 6013 str r3, [r2, #0]
|
|
|
|
/* add the network interface (IPv4/IPv6) without RTOS */
|
|
netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);
|
|
8004cbc: 4b12 ldr r3, [pc, #72] ; (8004d08 <MX_LWIP_Init+0x23c>)
|
|
8004cbe: 9302 str r3, [sp, #8]
|
|
8004cc0: 4b12 ldr r3, [pc, #72] ; (8004d0c <MX_LWIP_Init+0x240>)
|
|
8004cc2: 9301 str r3, [sp, #4]
|
|
8004cc4: 2300 movs r3, #0
|
|
8004cc6: 9300 str r3, [sp, #0]
|
|
8004cc8: 4b0e ldr r3, [pc, #56] ; (8004d04 <MX_LWIP_Init+0x238>)
|
|
8004cca: 4a0d ldr r2, [pc, #52] ; (8004d00 <MX_LWIP_Init+0x234>)
|
|
8004ccc: 490b ldr r1, [pc, #44] ; (8004cfc <MX_LWIP_Init+0x230>)
|
|
8004cce: 4810 ldr r0, [pc, #64] ; (8004d10 <MX_LWIP_Init+0x244>)
|
|
8004cd0: f001 fa46 bl 8006160 <netif_add>
|
|
|
|
/* Registers the default network interface */
|
|
netif_set_default(&gnetif);
|
|
8004cd4: 480e ldr r0, [pc, #56] ; (8004d10 <MX_LWIP_Init+0x244>)
|
|
8004cd6: f001 fcd7 bl 8006688 <netif_set_default>
|
|
|
|
/* We must always bring the network interface up connection or not... */
|
|
netif_set_up(&gnetif);
|
|
8004cda: 480d ldr r0, [pc, #52] ; (8004d10 <MX_LWIP_Init+0x244>)
|
|
8004cdc: f001 fcf8 bl 80066d0 <netif_set_up>
|
|
|
|
/* Set the link callback function, this function is called on change of link status*/
|
|
netif_set_link_callback(&gnetif, ethernet_link_status_updated);
|
|
8004ce0: 490c ldr r1, [pc, #48] ; (8004d14 <MX_LWIP_Init+0x248>)
|
|
8004ce2: 480b ldr r0, [pc, #44] ; (8004d10 <MX_LWIP_Init+0x244>)
|
|
8004ce4: f001 fdf6 bl 80068d4 <netif_set_link_callback>
|
|
/* Create the Ethernet link handler thread */
|
|
|
|
/* USER CODE BEGIN 3 */
|
|
|
|
/* USER CODE END 3 */
|
|
}
|
|
8004ce8: bf00 nop
|
|
8004cea: 46bd mov sp, r7
|
|
8004cec: bd80 pop {r7, pc}
|
|
8004cee: bf00 nop
|
|
8004cf0: 24000170 .word 0x24000170
|
|
8004cf4: 24000174 .word 0x24000174
|
|
8004cf8: 24000178 .word 0x24000178
|
|
8004cfc: 24000164 .word 0x24000164
|
|
8004d00: 24000168 .word 0x24000168
|
|
8004d04: 2400016c .word 0x2400016c
|
|
8004d08: 080100b5 .word 0x080100b5
|
|
8004d0c: 08005021 .word 0x08005021
|
|
8004d10: 24000130 .word 0x24000130
|
|
8004d14: 08004d69 .word 0x08004d69
|
|
|
|
08004d18 <Ethernet_Link_Periodic_Handle>:
|
|
* @brief Ethernet Link periodic check
|
|
* @param netif
|
|
* @retval None
|
|
*/
|
|
static void Ethernet_Link_Periodic_Handle(struct netif *netif)
|
|
{
|
|
8004d18: b580 push {r7, lr}
|
|
8004d1a: b082 sub sp, #8
|
|
8004d1c: af00 add r7, sp, #0
|
|
8004d1e: 6078 str r0, [r7, #4]
|
|
/* USER CODE BEGIN 4_4_1 */
|
|
/* USER CODE END 4_4_1 */
|
|
|
|
/* Ethernet Link every 100ms */
|
|
if (HAL_GetTick() - EthernetLinkTimer >= 100)
|
|
8004d20: f7fc f974 bl 800100c <HAL_GetTick>
|
|
8004d24: 4602 mov r2, r0
|
|
8004d26: 4b08 ldr r3, [pc, #32] ; (8004d48 <Ethernet_Link_Periodic_Handle+0x30>)
|
|
8004d28: 681b ldr r3, [r3, #0]
|
|
8004d2a: 1ad3 subs r3, r2, r3
|
|
8004d2c: 2b63 cmp r3, #99 ; 0x63
|
|
8004d2e: d907 bls.n 8004d40 <Ethernet_Link_Periodic_Handle+0x28>
|
|
{
|
|
EthernetLinkTimer = HAL_GetTick();
|
|
8004d30: f7fc f96c bl 800100c <HAL_GetTick>
|
|
8004d34: 4603 mov r3, r0
|
|
8004d36: 4a04 ldr r2, [pc, #16] ; (8004d48 <Ethernet_Link_Periodic_Handle+0x30>)
|
|
8004d38: 6013 str r3, [r2, #0]
|
|
ethernet_link_check_state(netif);
|
|
8004d3a: 6878 ldr r0, [r7, #4]
|
|
8004d3c: f000 fac2 bl 80052c4 <ethernet_link_check_state>
|
|
}
|
|
/* USER CODE BEGIN 4_4 */
|
|
/* USER CODE END 4_4 */
|
|
}
|
|
8004d40: bf00 nop
|
|
8004d42: 3708 adds r7, #8
|
|
8004d44: 46bd mov sp, r7
|
|
8004d46: bd80 pop {r7, pc}
|
|
8004d48: 2400012c .word 0x2400012c
|
|
|
|
08004d4c <MX_LWIP_Process>:
|
|
* Send it to the lwIP stack for handling
|
|
* Handle timeouts if LWIP_TIMERS is set and without RTOS
|
|
* Handle the llink status if LWIP_NETIF_LINK_CALLBACK is set and without RTOS
|
|
*/
|
|
void MX_LWIP_Process(void)
|
|
{
|
|
8004d4c: b580 push {r7, lr}
|
|
8004d4e: af00 add r7, sp, #0
|
|
/* USER CODE BEGIN 4_1 */
|
|
/* USER CODE END 4_1 */
|
|
ethernetif_input(&gnetif);
|
|
8004d50: 4804 ldr r0, [pc, #16] ; (8004d64 <MX_LWIP_Process+0x18>)
|
|
8004d52: f000 f945 bl 8004fe0 <ethernetif_input>
|
|
|
|
/* USER CODE BEGIN 4_2 */
|
|
/* USER CODE END 4_2 */
|
|
/* Handle timeouts */
|
|
sys_check_timeouts();
|
|
8004d56: f008 fcd7 bl 800d708 <sys_check_timeouts>
|
|
|
|
Ethernet_Link_Periodic_Handle(&gnetif);
|
|
8004d5a: 4802 ldr r0, [pc, #8] ; (8004d64 <MX_LWIP_Process+0x18>)
|
|
8004d5c: f7ff ffdc bl 8004d18 <Ethernet_Link_Periodic_Handle>
|
|
|
|
/* USER CODE BEGIN 4_3 */
|
|
/* USER CODE END 4_3 */
|
|
}
|
|
8004d60: bf00 nop
|
|
8004d62: bd80 pop {r7, pc}
|
|
8004d64: 24000130 .word 0x24000130
|
|
|
|
08004d68 <ethernet_link_status_updated>:
|
|
* @brief Notify the User about the network interface config status
|
|
* @param netif: the network interface
|
|
* @retval None
|
|
*/
|
|
static void ethernet_link_status_updated(struct netif *netif)
|
|
{
|
|
8004d68: b480 push {r7}
|
|
8004d6a: b083 sub sp, #12
|
|
8004d6c: af00 add r7, sp, #0
|
|
8004d6e: 6078 str r0, [r7, #4]
|
|
else /* netif is down */
|
|
{
|
|
/* USER CODE BEGIN 6 */
|
|
/* USER CODE END 6 */
|
|
}
|
|
}
|
|
8004d70: bf00 nop
|
|
8004d72: 370c adds r7, #12
|
|
8004d74: 46bd mov sp, r7
|
|
8004d76: f85d 7b04 ldr.w r7, [sp], #4
|
|
8004d7a: 4770 bx lr
|
|
|
|
08004d7c <low_level_init>:
|
|
*
|
|
* @param netif the already initialized lwip network interface structure
|
|
* for this ethernetif
|
|
*/
|
|
static void low_level_init(struct netif *netif)
|
|
{
|
|
8004d7c: b580 push {r7, lr}
|
|
8004d7e: b084 sub sp, #16
|
|
8004d80: af00 add r7, sp, #0
|
|
8004d82: 6078 str r0, [r7, #4]
|
|
HAL_StatusTypeDef hal_eth_init_status = HAL_OK;
|
|
8004d84: 2300 movs r3, #0
|
|
8004d86: 73fb strb r3, [r7, #15]
|
|
/* Start ETH HAL Init */
|
|
|
|
uint8_t MACAddr[6] ;
|
|
heth.Instance = ETH;
|
|
8004d88: 4b3f ldr r3, [pc, #252] ; (8004e88 <low_level_init+0x10c>)
|
|
8004d8a: 4a40 ldr r2, [pc, #256] ; (8004e8c <low_level_init+0x110>)
|
|
8004d8c: 601a str r2, [r3, #0]
|
|
MACAddr[0] = 0x00;
|
|
8004d8e: 2300 movs r3, #0
|
|
8004d90: 723b strb r3, [r7, #8]
|
|
MACAddr[1] = 0x80;
|
|
8004d92: 2380 movs r3, #128 ; 0x80
|
|
8004d94: 727b strb r3, [r7, #9]
|
|
MACAddr[2] = 0xE1;
|
|
8004d96: 23e1 movs r3, #225 ; 0xe1
|
|
8004d98: 72bb strb r3, [r7, #10]
|
|
MACAddr[3] = 0x00;
|
|
8004d9a: 2300 movs r3, #0
|
|
8004d9c: 72fb strb r3, [r7, #11]
|
|
MACAddr[4] = 0x00;
|
|
8004d9e: 2300 movs r3, #0
|
|
8004da0: 733b strb r3, [r7, #12]
|
|
MACAddr[5] = 0x00;
|
|
8004da2: 2300 movs r3, #0
|
|
8004da4: 737b strb r3, [r7, #13]
|
|
heth.Init.MACAddr = &MACAddr[0];
|
|
8004da6: 4a38 ldr r2, [pc, #224] ; (8004e88 <low_level_init+0x10c>)
|
|
8004da8: f107 0308 add.w r3, r7, #8
|
|
8004dac: 6053 str r3, [r2, #4]
|
|
heth.Init.MediaInterface = HAL_ETH_RMII_MODE;
|
|
8004dae: 4b36 ldr r3, [pc, #216] ; (8004e88 <low_level_init+0x10c>)
|
|
8004db0: 2201 movs r2, #1
|
|
8004db2: 721a strb r2, [r3, #8]
|
|
heth.Init.TxDesc = DMATxDscrTab;
|
|
8004db4: 4b34 ldr r3, [pc, #208] ; (8004e88 <low_level_init+0x10c>)
|
|
8004db6: 4a36 ldr r2, [pc, #216] ; (8004e90 <low_level_init+0x114>)
|
|
8004db8: 60da str r2, [r3, #12]
|
|
heth.Init.RxDesc = DMARxDscrTab;
|
|
8004dba: 4b33 ldr r3, [pc, #204] ; (8004e88 <low_level_init+0x10c>)
|
|
8004dbc: 4a35 ldr r2, [pc, #212] ; (8004e94 <low_level_init+0x118>)
|
|
8004dbe: 611a str r2, [r3, #16]
|
|
heth.Init.RxBuffLen = 1536;
|
|
8004dc0: 4b31 ldr r3, [pc, #196] ; (8004e88 <low_level_init+0x10c>)
|
|
8004dc2: f44f 62c0 mov.w r2, #1536 ; 0x600
|
|
8004dc6: 615a str r2, [r3, #20]
|
|
|
|
/* USER CODE BEGIN MACADDRESS */
|
|
|
|
/* USER CODE END MACADDRESS */
|
|
|
|
hal_eth_init_status = HAL_ETH_Init(&heth);
|
|
8004dc8: 482f ldr r0, [pc, #188] ; (8004e88 <low_level_init+0x10c>)
|
|
8004dca: f7fc facb bl 8001364 <HAL_ETH_Init>
|
|
8004dce: 4603 mov r3, r0
|
|
8004dd0: 73fb strb r3, [r7, #15]
|
|
|
|
memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig));
|
|
8004dd2: 2238 movs r2, #56 ; 0x38
|
|
8004dd4: 2100 movs r1, #0
|
|
8004dd6: 4830 ldr r0, [pc, #192] ; (8004e98 <low_level_init+0x11c>)
|
|
8004dd8: f00c f854 bl 8010e84 <memset>
|
|
TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
|
|
8004ddc: 4b2e ldr r3, [pc, #184] ; (8004e98 <low_level_init+0x11c>)
|
|
8004dde: 2221 movs r2, #33 ; 0x21
|
|
8004de0: 601a str r2, [r3, #0]
|
|
TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
|
|
8004de2: 4b2d ldr r3, [pc, #180] ; (8004e98 <low_level_init+0x11c>)
|
|
8004de4: f44f 3240 mov.w r2, #196608 ; 0x30000
|
|
8004de8: 615a str r2, [r3, #20]
|
|
TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;
|
|
8004dea: 4b2b ldr r3, [pc, #172] ; (8004e98 <low_level_init+0x11c>)
|
|
8004dec: 2200 movs r2, #0
|
|
8004dee: 611a str r2, [r3, #16]
|
|
|
|
/* End ETH HAL Init */
|
|
|
|
/* Initialize the RX POOL */
|
|
LWIP_MEMPOOL_INIT(RX_POOL);
|
|
8004df0: 482a ldr r0, [pc, #168] ; (8004e9c <low_level_init+0x120>)
|
|
8004df2: f001 f875 bl 8005ee0 <memp_init_pool>
|
|
|
|
#if LWIP_ARP || LWIP_ETHERNET
|
|
|
|
/* set MAC hardware address length */
|
|
netif->hwaddr_len = ETH_HWADDR_LEN;
|
|
8004df6: 687b ldr r3, [r7, #4]
|
|
8004df8: 2206 movs r2, #6
|
|
8004dfa: f883 202c strb.w r2, [r3, #44] ; 0x2c
|
|
|
|
/* set MAC hardware address */
|
|
netif->hwaddr[0] = heth.Init.MACAddr[0];
|
|
8004dfe: 4b22 ldr r3, [pc, #136] ; (8004e88 <low_level_init+0x10c>)
|
|
8004e00: 685b ldr r3, [r3, #4]
|
|
8004e02: 781a ldrb r2, [r3, #0]
|
|
8004e04: 687b ldr r3, [r7, #4]
|
|
8004e06: f883 2026 strb.w r2, [r3, #38] ; 0x26
|
|
netif->hwaddr[1] = heth.Init.MACAddr[1];
|
|
8004e0a: 4b1f ldr r3, [pc, #124] ; (8004e88 <low_level_init+0x10c>)
|
|
8004e0c: 685b ldr r3, [r3, #4]
|
|
8004e0e: 785a ldrb r2, [r3, #1]
|
|
8004e10: 687b ldr r3, [r7, #4]
|
|
8004e12: f883 2027 strb.w r2, [r3, #39] ; 0x27
|
|
netif->hwaddr[2] = heth.Init.MACAddr[2];
|
|
8004e16: 4b1c ldr r3, [pc, #112] ; (8004e88 <low_level_init+0x10c>)
|
|
8004e18: 685b ldr r3, [r3, #4]
|
|
8004e1a: 789a ldrb r2, [r3, #2]
|
|
8004e1c: 687b ldr r3, [r7, #4]
|
|
8004e1e: f883 2028 strb.w r2, [r3, #40] ; 0x28
|
|
netif->hwaddr[3] = heth.Init.MACAddr[3];
|
|
8004e22: 4b19 ldr r3, [pc, #100] ; (8004e88 <low_level_init+0x10c>)
|
|
8004e24: 685b ldr r3, [r3, #4]
|
|
8004e26: 78da ldrb r2, [r3, #3]
|
|
8004e28: 687b ldr r3, [r7, #4]
|
|
8004e2a: f883 2029 strb.w r2, [r3, #41] ; 0x29
|
|
netif->hwaddr[4] = heth.Init.MACAddr[4];
|
|
8004e2e: 4b16 ldr r3, [pc, #88] ; (8004e88 <low_level_init+0x10c>)
|
|
8004e30: 685b ldr r3, [r3, #4]
|
|
8004e32: 791a ldrb r2, [r3, #4]
|
|
8004e34: 687b ldr r3, [r7, #4]
|
|
8004e36: f883 202a strb.w r2, [r3, #42] ; 0x2a
|
|
netif->hwaddr[5] = heth.Init.MACAddr[5];
|
|
8004e3a: 4b13 ldr r3, [pc, #76] ; (8004e88 <low_level_init+0x10c>)
|
|
8004e3c: 685b ldr r3, [r3, #4]
|
|
8004e3e: 795a ldrb r2, [r3, #5]
|
|
8004e40: 687b ldr r3, [r7, #4]
|
|
8004e42: f883 202b strb.w r2, [r3, #43] ; 0x2b
|
|
|
|
/* maximum transfer unit */
|
|
netif->mtu = ETH_MAX_PAYLOAD;
|
|
8004e46: 687b ldr r3, [r7, #4]
|
|
8004e48: f240 52dc movw r2, #1500 ; 0x5dc
|
|
8004e4c: 849a strh r2, [r3, #36] ; 0x24
|
|
|
|
/* Accept broadcast address and ARP traffic */
|
|
/* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
|
|
#if LWIP_ARP
|
|
netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
|
|
8004e4e: 687b ldr r3, [r7, #4]
|
|
8004e50: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
8004e54: f043 030a orr.w r3, r3, #10
|
|
8004e58: b2da uxtb r2, r3
|
|
8004e5a: 687b ldr r3, [r7, #4]
|
|
8004e5c: f883 202d strb.w r2, [r3, #45] ; 0x2d
|
|
|
|
/* USER CODE BEGIN PHY_PRE_CONFIG */
|
|
|
|
/* USER CODE END PHY_PRE_CONFIG */
|
|
/* Set PHY IO functions */
|
|
LAN8742_RegisterBusIO(&LAN8742, &LAN8742_IOCtx);
|
|
8004e60: 490f ldr r1, [pc, #60] ; (8004ea0 <low_level_init+0x124>)
|
|
8004e62: 4810 ldr r0, [pc, #64] ; (8004ea4 <low_level_init+0x128>)
|
|
8004e64: f7fb feeb bl 8000c3e <LAN8742_RegisterBusIO>
|
|
|
|
/* Initialize the LAN8742 ETH PHY */
|
|
LAN8742_Init(&LAN8742);
|
|
8004e68: 480e ldr r0, [pc, #56] ; (8004ea4 <low_level_init+0x128>)
|
|
8004e6a: f7fb ff1a bl 8000ca2 <LAN8742_Init>
|
|
|
|
if (hal_eth_init_status == HAL_OK)
|
|
8004e6e: 7bfb ldrb r3, [r7, #15]
|
|
8004e70: 2b00 cmp r3, #0
|
|
8004e72: d103 bne.n 8004e7c <low_level_init+0x100>
|
|
{
|
|
/* Get link state */
|
|
ethernet_link_check_state(netif);
|
|
8004e74: 6878 ldr r0, [r7, #4]
|
|
8004e76: f000 fa25 bl 80052c4 <ethernet_link_check_state>
|
|
#endif /* LWIP_ARP || LWIP_ETHERNET */
|
|
|
|
/* USER CODE BEGIN LOW_LEVEL_INIT */
|
|
|
|
/* USER CODE END LOW_LEVEL_INIT */
|
|
}
|
|
8004e7a: e001 b.n 8004e80 <low_level_init+0x104>
|
|
Error_Handler();
|
|
8004e7c: f7fb fd2d bl 80008da <Error_Handler>
|
|
}
|
|
8004e80: bf00 nop
|
|
8004e82: 3710 adds r7, #16
|
|
8004e84: 46bd mov sp, r7
|
|
8004e86: bd80 pop {r7, pc}
|
|
8004e88: 24004b08 .word 0x24004b08
|
|
8004e8c: 40028000 .word 0x40028000
|
|
8004e90: 30000100 .word 0x30000100
|
|
8004e94: 30000000 .word 0x30000000
|
|
8004e98: 24004bb8 .word 0x24004bb8
|
|
8004e9c: 08014c90 .word 0x08014c90
|
|
8004ea0: 24000010 .word 0x24000010
|
|
8004ea4: 24004bf0 .word 0x24004bf0
|
|
|
|
08004ea8 <low_level_output>:
|
|
* to become available since the stack doesn't retry to send a packet
|
|
* dropped because of memory failure (except for the TCP timers).
|
|
*/
|
|
|
|
static err_t low_level_output(struct netif *netif, struct pbuf *p)
|
|
{
|
|
8004ea8: b580 push {r7, lr}
|
|
8004eaa: b092 sub sp, #72 ; 0x48
|
|
8004eac: af00 add r7, sp, #0
|
|
8004eae: 6078 str r0, [r7, #4]
|
|
8004eb0: 6039 str r1, [r7, #0]
|
|
uint32_t i = 0U;
|
|
8004eb2: 2300 movs r3, #0
|
|
8004eb4: 647b str r3, [r7, #68] ; 0x44
|
|
struct pbuf *q = NULL;
|
|
8004eb6: 2300 movs r3, #0
|
|
8004eb8: 643b str r3, [r7, #64] ; 0x40
|
|
err_t errval = ERR_OK;
|
|
8004eba: 2300 movs r3, #0
|
|
8004ebc: f887 303f strb.w r3, [r7, #63] ; 0x3f
|
|
ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT] = {0};
|
|
8004ec0: f107 030c add.w r3, r7, #12
|
|
8004ec4: 2230 movs r2, #48 ; 0x30
|
|
8004ec6: 2100 movs r1, #0
|
|
8004ec8: 4618 mov r0, r3
|
|
8004eca: f00b ffdb bl 8010e84 <memset>
|
|
|
|
memset(Txbuffer, 0 , ETH_TX_DESC_CNT*sizeof(ETH_BufferTypeDef));
|
|
8004ece: f107 030c add.w r3, r7, #12
|
|
8004ed2: 2230 movs r2, #48 ; 0x30
|
|
8004ed4: 2100 movs r1, #0
|
|
8004ed6: 4618 mov r0, r3
|
|
8004ed8: f00b ffd4 bl 8010e84 <memset>
|
|
|
|
for(q = p; q != NULL; q = q->next)
|
|
8004edc: 683b ldr r3, [r7, #0]
|
|
8004ede: 643b str r3, [r7, #64] ; 0x40
|
|
8004ee0: e045 b.n 8004f6e <low_level_output+0xc6>
|
|
{
|
|
if(i >= ETH_TX_DESC_CNT)
|
|
8004ee2: 6c7b ldr r3, [r7, #68] ; 0x44
|
|
8004ee4: 2b03 cmp r3, #3
|
|
8004ee6: d902 bls.n 8004eee <low_level_output+0x46>
|
|
return ERR_IF;
|
|
8004ee8: f06f 030b mvn.w r3, #11
|
|
8004eec: e055 b.n 8004f9a <low_level_output+0xf2>
|
|
|
|
Txbuffer[i].buffer = q->payload;
|
|
8004eee: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
8004ef0: 6859 ldr r1, [r3, #4]
|
|
8004ef2: 6c7a ldr r2, [r7, #68] ; 0x44
|
|
8004ef4: 4613 mov r3, r2
|
|
8004ef6: 005b lsls r3, r3, #1
|
|
8004ef8: 4413 add r3, r2
|
|
8004efa: 009b lsls r3, r3, #2
|
|
8004efc: 3348 adds r3, #72 ; 0x48
|
|
8004efe: 443b add r3, r7
|
|
8004f00: 3b3c subs r3, #60 ; 0x3c
|
|
8004f02: 6019 str r1, [r3, #0]
|
|
Txbuffer[i].len = q->len;
|
|
8004f04: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
8004f06: 895b ldrh r3, [r3, #10]
|
|
8004f08: 4619 mov r1, r3
|
|
8004f0a: 6c7a ldr r2, [r7, #68] ; 0x44
|
|
8004f0c: 4613 mov r3, r2
|
|
8004f0e: 005b lsls r3, r3, #1
|
|
8004f10: 4413 add r3, r2
|
|
8004f12: 009b lsls r3, r3, #2
|
|
8004f14: 3348 adds r3, #72 ; 0x48
|
|
8004f16: 443b add r3, r7
|
|
8004f18: 3b38 subs r3, #56 ; 0x38
|
|
8004f1a: 6019 str r1, [r3, #0]
|
|
|
|
if(i>0)
|
|
8004f1c: 6c7b ldr r3, [r7, #68] ; 0x44
|
|
8004f1e: 2b00 cmp r3, #0
|
|
8004f20: d011 beq.n 8004f46 <low_level_output+0x9e>
|
|
{
|
|
Txbuffer[i-1].next = &Txbuffer[i];
|
|
8004f22: 6c7b ldr r3, [r7, #68] ; 0x44
|
|
8004f24: 1e5a subs r2, r3, #1
|
|
8004f26: f107 000c add.w r0, r7, #12
|
|
8004f2a: 6c79 ldr r1, [r7, #68] ; 0x44
|
|
8004f2c: 460b mov r3, r1
|
|
8004f2e: 005b lsls r3, r3, #1
|
|
8004f30: 440b add r3, r1
|
|
8004f32: 009b lsls r3, r3, #2
|
|
8004f34: 18c1 adds r1, r0, r3
|
|
8004f36: 4613 mov r3, r2
|
|
8004f38: 005b lsls r3, r3, #1
|
|
8004f3a: 4413 add r3, r2
|
|
8004f3c: 009b lsls r3, r3, #2
|
|
8004f3e: 3348 adds r3, #72 ; 0x48
|
|
8004f40: 443b add r3, r7
|
|
8004f42: 3b34 subs r3, #52 ; 0x34
|
|
8004f44: 6019 str r1, [r3, #0]
|
|
}
|
|
|
|
if(q->next == NULL)
|
|
8004f46: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
8004f48: 681b ldr r3, [r3, #0]
|
|
8004f4a: 2b00 cmp r3, #0
|
|
8004f4c: d109 bne.n 8004f62 <low_level_output+0xba>
|
|
{
|
|
Txbuffer[i].next = NULL;
|
|
8004f4e: 6c7a ldr r2, [r7, #68] ; 0x44
|
|
8004f50: 4613 mov r3, r2
|
|
8004f52: 005b lsls r3, r3, #1
|
|
8004f54: 4413 add r3, r2
|
|
8004f56: 009b lsls r3, r3, #2
|
|
8004f58: 3348 adds r3, #72 ; 0x48
|
|
8004f5a: 443b add r3, r7
|
|
8004f5c: 3b34 subs r3, #52 ; 0x34
|
|
8004f5e: 2200 movs r2, #0
|
|
8004f60: 601a str r2, [r3, #0]
|
|
}
|
|
|
|
i++;
|
|
8004f62: 6c7b ldr r3, [r7, #68] ; 0x44
|
|
8004f64: 3301 adds r3, #1
|
|
8004f66: 647b str r3, [r7, #68] ; 0x44
|
|
for(q = p; q != NULL; q = q->next)
|
|
8004f68: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
8004f6a: 681b ldr r3, [r3, #0]
|
|
8004f6c: 643b str r3, [r7, #64] ; 0x40
|
|
8004f6e: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
8004f70: 2b00 cmp r3, #0
|
|
8004f72: d1b6 bne.n 8004ee2 <low_level_output+0x3a>
|
|
}
|
|
|
|
TxConfig.Length = p->tot_len;
|
|
8004f74: 683b ldr r3, [r7, #0]
|
|
8004f76: 891b ldrh r3, [r3, #8]
|
|
8004f78: 461a mov r2, r3
|
|
8004f7a: 4b0a ldr r3, [pc, #40] ; (8004fa4 <low_level_output+0xfc>)
|
|
8004f7c: 605a str r2, [r3, #4]
|
|
TxConfig.TxBuffer = Txbuffer;
|
|
8004f7e: 4a09 ldr r2, [pc, #36] ; (8004fa4 <low_level_output+0xfc>)
|
|
8004f80: f107 030c add.w r3, r7, #12
|
|
8004f84: 6093 str r3, [r2, #8]
|
|
TxConfig.pData = p;
|
|
8004f86: 4a07 ldr r2, [pc, #28] ; (8004fa4 <low_level_output+0xfc>)
|
|
8004f88: 683b ldr r3, [r7, #0]
|
|
8004f8a: 6353 str r3, [r2, #52] ; 0x34
|
|
|
|
HAL_ETH_Transmit(&heth, &TxConfig, ETH_DMA_TRANSMIT_TIMEOUT);
|
|
8004f8c: 2214 movs r2, #20
|
|
8004f8e: 4905 ldr r1, [pc, #20] ; (8004fa4 <low_level_output+0xfc>)
|
|
8004f90: 4805 ldr r0, [pc, #20] ; (8004fa8 <low_level_output+0x100>)
|
|
8004f92: f7fc fb7f bl 8001694 <HAL_ETH_Transmit>
|
|
|
|
return errval;
|
|
8004f96: f997 303f ldrsb.w r3, [r7, #63] ; 0x3f
|
|
}
|
|
8004f9a: 4618 mov r0, r3
|
|
8004f9c: 3748 adds r7, #72 ; 0x48
|
|
8004f9e: 46bd mov sp, r7
|
|
8004fa0: bd80 pop {r7, pc}
|
|
8004fa2: bf00 nop
|
|
8004fa4: 24004bb8 .word 0x24004bb8
|
|
8004fa8: 24004b08 .word 0x24004b08
|
|
|
|
08004fac <low_level_input>:
|
|
* @param netif the lwip network interface structure for this ethernetif
|
|
* @return a pbuf filled with the received packet (including MAC header)
|
|
* NULL on memory error
|
|
*/
|
|
static struct pbuf * low_level_input(struct netif *netif)
|
|
{
|
|
8004fac: b580 push {r7, lr}
|
|
8004fae: b084 sub sp, #16
|
|
8004fb0: af00 add r7, sp, #0
|
|
8004fb2: 6078 str r0, [r7, #4]
|
|
struct pbuf *p = NULL;
|
|
8004fb4: 2300 movs r3, #0
|
|
8004fb6: 60fb str r3, [r7, #12]
|
|
|
|
if(RxAllocStatus == RX_ALLOC_OK)
|
|
8004fb8: 4b07 ldr r3, [pc, #28] ; (8004fd8 <low_level_input+0x2c>)
|
|
8004fba: 781b ldrb r3, [r3, #0]
|
|
8004fbc: 2b00 cmp r3, #0
|
|
8004fbe: d105 bne.n 8004fcc <low_level_input+0x20>
|
|
{
|
|
HAL_ETH_ReadData(&heth, (void **)&p);
|
|
8004fc0: f107 030c add.w r3, r7, #12
|
|
8004fc4: 4619 mov r1, r3
|
|
8004fc6: 4805 ldr r0, [pc, #20] ; (8004fdc <low_level_input+0x30>)
|
|
8004fc8: f7fc fbfb bl 80017c2 <HAL_ETH_ReadData>
|
|
}
|
|
|
|
return p;
|
|
8004fcc: 68fb ldr r3, [r7, #12]
|
|
}
|
|
8004fce: 4618 mov r0, r3
|
|
8004fd0: 3710 adds r7, #16
|
|
8004fd2: 46bd mov sp, r7
|
|
8004fd4: bd80 pop {r7, pc}
|
|
8004fd6: bf00 nop
|
|
8004fd8: 24004b04 .word 0x24004b04
|
|
8004fdc: 24004b08 .word 0x24004b08
|
|
|
|
08004fe0 <ethernetif_input>:
|
|
* the appropriate input function is called.
|
|
*
|
|
* @param netif the lwip network interface structure for this ethernetif
|
|
*/
|
|
void ethernetif_input(struct netif *netif)
|
|
{
|
|
8004fe0: b580 push {r7, lr}
|
|
8004fe2: b084 sub sp, #16
|
|
8004fe4: af00 add r7, sp, #0
|
|
8004fe6: 6078 str r0, [r7, #4]
|
|
struct pbuf *p = NULL;
|
|
8004fe8: 2300 movs r3, #0
|
|
8004fea: 60fb str r3, [r7, #12]
|
|
|
|
do
|
|
{
|
|
p = low_level_input( netif );
|
|
8004fec: 6878 ldr r0, [r7, #4]
|
|
8004fee: f7ff ffdd bl 8004fac <low_level_input>
|
|
8004ff2: 60f8 str r0, [r7, #12]
|
|
if (p != NULL)
|
|
8004ff4: 68fb ldr r3, [r7, #12]
|
|
8004ff6: 2b00 cmp r3, #0
|
|
8004ff8: d00a beq.n 8005010 <ethernetif_input+0x30>
|
|
{
|
|
if (netif->input( p, netif) != ERR_OK )
|
|
8004ffa: 687b ldr r3, [r7, #4]
|
|
8004ffc: 691b ldr r3, [r3, #16]
|
|
8004ffe: 6879 ldr r1, [r7, #4]
|
|
8005000: 68f8 ldr r0, [r7, #12]
|
|
8005002: 4798 blx r3
|
|
8005004: 4603 mov r3, r0
|
|
8005006: 2b00 cmp r3, #0
|
|
8005008: d002 beq.n 8005010 <ethernetif_input+0x30>
|
|
{
|
|
pbuf_free(p);
|
|
800500a: 68f8 ldr r0, [r7, #12]
|
|
800500c: f001 ffe2 bl 8006fd4 <pbuf_free>
|
|
}
|
|
}
|
|
} while(p!=NULL);
|
|
8005010: 68fb ldr r3, [r7, #12]
|
|
8005012: 2b00 cmp r3, #0
|
|
8005014: d1ea bne.n 8004fec <ethernetif_input+0xc>
|
|
}
|
|
8005016: bf00 nop
|
|
8005018: bf00 nop
|
|
800501a: 3710 adds r7, #16
|
|
800501c: 46bd mov sp, r7
|
|
800501e: bd80 pop {r7, pc}
|
|
|
|
08005020 <ethernetif_init>:
|
|
* @return ERR_OK if the loopif is initialized
|
|
* ERR_MEM if private data couldn't be allocated
|
|
* any other err_t on error
|
|
*/
|
|
err_t ethernetif_init(struct netif *netif)
|
|
{
|
|
8005020: b580 push {r7, lr}
|
|
8005022: b082 sub sp, #8
|
|
8005024: af00 add r7, sp, #0
|
|
8005026: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("netif != NULL", (netif != NULL));
|
|
8005028: 687b ldr r3, [r7, #4]
|
|
800502a: 2b00 cmp r3, #0
|
|
800502c: d106 bne.n 800503c <ethernetif_init+0x1c>
|
|
800502e: 4b0e ldr r3, [pc, #56] ; (8005068 <ethernetif_init+0x48>)
|
|
8005030: f240 127b movw r2, #379 ; 0x17b
|
|
8005034: 490d ldr r1, [pc, #52] ; (800506c <ethernetif_init+0x4c>)
|
|
8005036: 480e ldr r0, [pc, #56] ; (8005070 <ethernetif_init+0x50>)
|
|
8005038: f00b fdc6 bl 8010bc8 <iprintf>
|
|
* The last argument should be replaced with your link speed, in units
|
|
* of bits per second.
|
|
*/
|
|
// MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, LINK_SPEED_OF_YOUR_NETIF_IN_BPS);
|
|
|
|
netif->name[0] = IFNAME0;
|
|
800503c: 687b ldr r3, [r7, #4]
|
|
800503e: 2273 movs r2, #115 ; 0x73
|
|
8005040: f883 202e strb.w r2, [r3, #46] ; 0x2e
|
|
netif->name[1] = IFNAME1;
|
|
8005044: 687b ldr r3, [r7, #4]
|
|
8005046: 2274 movs r2, #116 ; 0x74
|
|
8005048: f883 202f strb.w r2, [r3, #47] ; 0x2f
|
|
* is available...) */
|
|
|
|
#if LWIP_IPV4
|
|
#if LWIP_ARP || LWIP_ETHERNET
|
|
#if LWIP_ARP
|
|
netif->output = etharp_output;
|
|
800504c: 687b ldr r3, [r7, #4]
|
|
800504e: 4a09 ldr r2, [pc, #36] ; (8005074 <ethernetif_init+0x54>)
|
|
8005050: 615a str r2, [r3, #20]
|
|
|
|
#if LWIP_IPV6
|
|
netif->output_ip6 = ethip6_output;
|
|
#endif /* LWIP_IPV6 */
|
|
|
|
netif->linkoutput = low_level_output;
|
|
8005052: 687b ldr r3, [r7, #4]
|
|
8005054: 4a08 ldr r2, [pc, #32] ; (8005078 <ethernetif_init+0x58>)
|
|
8005056: 619a str r2, [r3, #24]
|
|
|
|
/* initialize the hardware */
|
|
low_level_init(netif);
|
|
8005058: 6878 ldr r0, [r7, #4]
|
|
800505a: f7ff fe8f bl 8004d7c <low_level_init>
|
|
|
|
return ERR_OK;
|
|
800505e: 2300 movs r3, #0
|
|
}
|
|
8005060: 4618 mov r0, r3
|
|
8005062: 3708 adds r7, #8
|
|
8005064: 46bd mov sp, r7
|
|
8005066: bd80 pop {r7, pc}
|
|
8005068: 08011b00 .word 0x08011b00
|
|
800506c: 08011b1c .word 0x08011b1c
|
|
8005070: 08011b2c .word 0x08011b2c
|
|
8005074: 0800e3f5 .word 0x0800e3f5
|
|
8005078: 08004ea9 .word 0x08004ea9
|
|
|
|
0800507c <pbuf_free_custom>:
|
|
* @brief Custom Rx pbuf free callback
|
|
* @param pbuf: pbuf to be freed
|
|
* @retval None
|
|
*/
|
|
void pbuf_free_custom(struct pbuf *p)
|
|
{
|
|
800507c: b580 push {r7, lr}
|
|
800507e: b084 sub sp, #16
|
|
8005080: af00 add r7, sp, #0
|
|
8005082: 6078 str r0, [r7, #4]
|
|
struct pbuf_custom* custom_pbuf = (struct pbuf_custom*)p;
|
|
8005084: 687b ldr r3, [r7, #4]
|
|
8005086: 60fb str r3, [r7, #12]
|
|
LWIP_MEMPOOL_FREE(RX_POOL, custom_pbuf);
|
|
8005088: 68f9 ldr r1, [r7, #12]
|
|
800508a: 4807 ldr r0, [pc, #28] ; (80050a8 <pbuf_free_custom+0x2c>)
|
|
800508c: f001 f812 bl 80060b4 <memp_free_pool>
|
|
|
|
/* If the Rx Buffer Pool was exhausted, signal the ethernetif_input task to
|
|
* call HAL_ETH_GetRxDataBuffer to rebuild the Rx descriptors. */
|
|
|
|
if (RxAllocStatus == RX_ALLOC_ERROR)
|
|
8005090: 4b06 ldr r3, [pc, #24] ; (80050ac <pbuf_free_custom+0x30>)
|
|
8005092: 781b ldrb r3, [r3, #0]
|
|
8005094: 2b01 cmp r3, #1
|
|
8005096: d102 bne.n 800509e <pbuf_free_custom+0x22>
|
|
{
|
|
RxAllocStatus = RX_ALLOC_OK;
|
|
8005098: 4b04 ldr r3, [pc, #16] ; (80050ac <pbuf_free_custom+0x30>)
|
|
800509a: 2200 movs r2, #0
|
|
800509c: 701a strb r2, [r3, #0]
|
|
}
|
|
}
|
|
800509e: bf00 nop
|
|
80050a0: 3710 adds r7, #16
|
|
80050a2: 46bd mov sp, r7
|
|
80050a4: bd80 pop {r7, pc}
|
|
80050a6: bf00 nop
|
|
80050a8: 08014c90 .word 0x08014c90
|
|
80050ac: 24004b04 .word 0x24004b04
|
|
|
|
080050b0 <sys_now>:
|
|
* when LWIP_TIMERS == 1 and NO_SYS == 1
|
|
* @param None
|
|
* @retval Current Time value
|
|
*/
|
|
u32_t sys_now(void)
|
|
{
|
|
80050b0: b580 push {r7, lr}
|
|
80050b2: af00 add r7, sp, #0
|
|
return HAL_GetTick();
|
|
80050b4: f7fb ffaa bl 800100c <HAL_GetTick>
|
|
80050b8: 4603 mov r3, r0
|
|
}
|
|
80050ba: 4618 mov r0, r3
|
|
80050bc: bd80 pop {r7, pc}
|
|
...
|
|
|
|
080050c0 <HAL_ETH_MspInit>:
|
|
* @param ethHandle: ETH handle
|
|
* @retval None
|
|
*/
|
|
|
|
void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
|
|
{
|
|
80050c0: b580 push {r7, lr}
|
|
80050c2: b08e sub sp, #56 ; 0x38
|
|
80050c4: af00 add r7, sp, #0
|
|
80050c6: 6078 str r0, [r7, #4]
|
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|
80050c8: f107 0324 add.w r3, r7, #36 ; 0x24
|
|
80050cc: 2200 movs r2, #0
|
|
80050ce: 601a str r2, [r3, #0]
|
|
80050d0: 605a str r2, [r3, #4]
|
|
80050d2: 609a str r2, [r3, #8]
|
|
80050d4: 60da str r2, [r3, #12]
|
|
80050d6: 611a str r2, [r3, #16]
|
|
if(ethHandle->Instance==ETH)
|
|
80050d8: 687b ldr r3, [r7, #4]
|
|
80050da: 681b ldr r3, [r3, #0]
|
|
80050dc: 4a4d ldr r2, [pc, #308] ; (8005214 <HAL_ETH_MspInit+0x154>)
|
|
80050de: 4293 cmp r3, r2
|
|
80050e0: f040 8093 bne.w 800520a <HAL_ETH_MspInit+0x14a>
|
|
{
|
|
/* USER CODE BEGIN ETH_MspInit 0 */
|
|
|
|
/* USER CODE END ETH_MspInit 0 */
|
|
/* Enable Peripheral clock */
|
|
__HAL_RCC_ETH1MAC_CLK_ENABLE();
|
|
80050e4: 4b4c ldr r3, [pc, #304] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
80050e6: f8d3 30d8 ldr.w r3, [r3, #216] ; 0xd8
|
|
80050ea: 4a4b ldr r2, [pc, #300] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
80050ec: f443 4300 orr.w r3, r3, #32768 ; 0x8000
|
|
80050f0: f8c2 30d8 str.w r3, [r2, #216] ; 0xd8
|
|
80050f4: 4b48 ldr r3, [pc, #288] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
80050f6: f8d3 30d8 ldr.w r3, [r3, #216] ; 0xd8
|
|
80050fa: f403 4300 and.w r3, r3, #32768 ; 0x8000
|
|
80050fe: 623b str r3, [r7, #32]
|
|
8005100: 6a3b ldr r3, [r7, #32]
|
|
__HAL_RCC_ETH1TX_CLK_ENABLE();
|
|
8005102: 4b45 ldr r3, [pc, #276] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005104: f8d3 30d8 ldr.w r3, [r3, #216] ; 0xd8
|
|
8005108: 4a43 ldr r2, [pc, #268] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
800510a: f443 3380 orr.w r3, r3, #65536 ; 0x10000
|
|
800510e: f8c2 30d8 str.w r3, [r2, #216] ; 0xd8
|
|
8005112: 4b41 ldr r3, [pc, #260] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005114: f8d3 30d8 ldr.w r3, [r3, #216] ; 0xd8
|
|
8005118: f403 3380 and.w r3, r3, #65536 ; 0x10000
|
|
800511c: 61fb str r3, [r7, #28]
|
|
800511e: 69fb ldr r3, [r7, #28]
|
|
__HAL_RCC_ETH1RX_CLK_ENABLE();
|
|
8005120: 4b3d ldr r3, [pc, #244] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005122: f8d3 30d8 ldr.w r3, [r3, #216] ; 0xd8
|
|
8005126: 4a3c ldr r2, [pc, #240] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005128: f443 3300 orr.w r3, r3, #131072 ; 0x20000
|
|
800512c: f8c2 30d8 str.w r3, [r2, #216] ; 0xd8
|
|
8005130: 4b39 ldr r3, [pc, #228] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005132: f8d3 30d8 ldr.w r3, [r3, #216] ; 0xd8
|
|
8005136: f403 3300 and.w r3, r3, #131072 ; 0x20000
|
|
800513a: 61bb str r3, [r7, #24]
|
|
800513c: 69bb ldr r3, [r7, #24]
|
|
|
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
|
800513e: 4b36 ldr r3, [pc, #216] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005140: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
8005144: 4a34 ldr r2, [pc, #208] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005146: f043 0304 orr.w r3, r3, #4
|
|
800514a: f8c2 30e0 str.w r3, [r2, #224] ; 0xe0
|
|
800514e: 4b32 ldr r3, [pc, #200] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005150: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
8005154: f003 0304 and.w r3, r3, #4
|
|
8005158: 617b str r3, [r7, #20]
|
|
800515a: 697b ldr r3, [r7, #20]
|
|
__HAL_RCC_GPIOA_CLK_ENABLE();
|
|
800515c: 4b2e ldr r3, [pc, #184] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
800515e: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
8005162: 4a2d ldr r2, [pc, #180] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005164: f043 0301 orr.w r3, r3, #1
|
|
8005168: f8c2 30e0 str.w r3, [r2, #224] ; 0xe0
|
|
800516c: 4b2a ldr r3, [pc, #168] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
800516e: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
8005172: f003 0301 and.w r3, r3, #1
|
|
8005176: 613b str r3, [r7, #16]
|
|
8005178: 693b ldr r3, [r7, #16]
|
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
|
800517a: 4b27 ldr r3, [pc, #156] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
800517c: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
8005180: 4a25 ldr r2, [pc, #148] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
8005182: f043 0302 orr.w r3, r3, #2
|
|
8005186: f8c2 30e0 str.w r3, [r2, #224] ; 0xe0
|
|
800518a: 4b23 ldr r3, [pc, #140] ; (8005218 <HAL_ETH_MspInit+0x158>)
|
|
800518c: f8d3 30e0 ldr.w r3, [r3, #224] ; 0xe0
|
|
8005190: f003 0302 and.w r3, r3, #2
|
|
8005194: 60fb str r3, [r7, #12]
|
|
8005196: 68fb ldr r3, [r7, #12]
|
|
PB13 ------> ETH_TXD1
|
|
PA7 ------> ETH_CRS_DV
|
|
PB11 ------> ETH_TX_EN
|
|
PB12 ------> ETH_TXD0
|
|
*/
|
|
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
|
|
8005198: 2332 movs r3, #50 ; 0x32
|
|
800519a: 627b str r3, [r7, #36] ; 0x24
|
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
800519c: 2302 movs r3, #2
|
|
800519e: 62bb str r3, [r7, #40] ; 0x28
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
80051a0: 2300 movs r3, #0
|
|
80051a2: 62fb str r3, [r7, #44] ; 0x2c
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
|
80051a4: 2303 movs r3, #3
|
|
80051a6: 633b str r3, [r7, #48] ; 0x30
|
|
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
|
|
80051a8: 230b movs r3, #11
|
|
80051aa: 637b str r3, [r7, #52] ; 0x34
|
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
|
80051ac: f107 0324 add.w r3, r7, #36 ; 0x24
|
|
80051b0: 4619 mov r1, r3
|
|
80051b2: 481a ldr r0, [pc, #104] ; (800521c <HAL_ETH_MspInit+0x15c>)
|
|
80051b4: f7fd fde2 bl 8002d7c <HAL_GPIO_Init>
|
|
|
|
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
|
|
80051b8: 2386 movs r3, #134 ; 0x86
|
|
80051ba: 627b str r3, [r7, #36] ; 0x24
|
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
80051bc: 2302 movs r3, #2
|
|
80051be: 62bb str r3, [r7, #40] ; 0x28
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
80051c0: 2300 movs r3, #0
|
|
80051c2: 62fb str r3, [r7, #44] ; 0x2c
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
|
80051c4: 2303 movs r3, #3
|
|
80051c6: 633b str r3, [r7, #48] ; 0x30
|
|
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
|
|
80051c8: 230b movs r3, #11
|
|
80051ca: 637b str r3, [r7, #52] ; 0x34
|
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|
80051cc: f107 0324 add.w r3, r7, #36 ; 0x24
|
|
80051d0: 4619 mov r1, r3
|
|
80051d2: 4813 ldr r0, [pc, #76] ; (8005220 <HAL_ETH_MspInit+0x160>)
|
|
80051d4: f7fd fdd2 bl 8002d7c <HAL_GPIO_Init>
|
|
|
|
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_11|GPIO_PIN_12;
|
|
80051d8: f44f 5360 mov.w r3, #14336 ; 0x3800
|
|
80051dc: 627b str r3, [r7, #36] ; 0x24
|
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
80051de: 2302 movs r3, #2
|
|
80051e0: 62bb str r3, [r7, #40] ; 0x28
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
80051e2: 2300 movs r3, #0
|
|
80051e4: 62fb str r3, [r7, #44] ; 0x2c
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
|
80051e6: 2303 movs r3, #3
|
|
80051e8: 633b str r3, [r7, #48] ; 0x30
|
|
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
|
|
80051ea: 230b movs r3, #11
|
|
80051ec: 637b str r3, [r7, #52] ; 0x34
|
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|
80051ee: f107 0324 add.w r3, r7, #36 ; 0x24
|
|
80051f2: 4619 mov r1, r3
|
|
80051f4: 480b ldr r0, [pc, #44] ; (8005224 <HAL_ETH_MspInit+0x164>)
|
|
80051f6: f7fd fdc1 bl 8002d7c <HAL_GPIO_Init>
|
|
|
|
/* Peripheral interrupt init */
|
|
HAL_NVIC_SetPriority(ETH_IRQn, 0, 0);
|
|
80051fa: 2200 movs r2, #0
|
|
80051fc: 2100 movs r1, #0
|
|
80051fe: 203d movs r0, #61 ; 0x3d
|
|
8005200: f7fb ffff bl 8001202 <HAL_NVIC_SetPriority>
|
|
HAL_NVIC_EnableIRQ(ETH_IRQn);
|
|
8005204: 203d movs r0, #61 ; 0x3d
|
|
8005206: f7fc f816 bl 8001236 <HAL_NVIC_EnableIRQ>
|
|
/* USER CODE BEGIN ETH_MspInit 1 */
|
|
|
|
/* USER CODE END ETH_MspInit 1 */
|
|
}
|
|
}
|
|
800520a: bf00 nop
|
|
800520c: 3738 adds r7, #56 ; 0x38
|
|
800520e: 46bd mov sp, r7
|
|
8005210: bd80 pop {r7, pc}
|
|
8005212: bf00 nop
|
|
8005214: 40028000 .word 0x40028000
|
|
8005218: 58024400 .word 0x58024400
|
|
800521c: 58020800 .word 0x58020800
|
|
8005220: 58020000 .word 0x58020000
|
|
8005224: 58020400 .word 0x58020400
|
|
|
|
08005228 <ETH_PHY_IO_Init>:
|
|
* @brief Initializes the MDIO interface GPIO and clocks.
|
|
* @param None
|
|
* @retval 0 if OK, -1 if ERROR
|
|
*/
|
|
int32_t ETH_PHY_IO_Init(void)
|
|
{
|
|
8005228: b580 push {r7, lr}
|
|
800522a: af00 add r7, sp, #0
|
|
/* We assume that MDIO GPIO configuration is already done
|
|
in the ETH_MspInit() else it should be done here
|
|
*/
|
|
|
|
/* Configure the MDIO Clock */
|
|
HAL_ETH_SetMDIOClockRange(&heth);
|
|
800522c: 4802 ldr r0, [pc, #8] ; (8005238 <ETH_PHY_IO_Init+0x10>)
|
|
800522e: f7fc ffd9 bl 80021e4 <HAL_ETH_SetMDIOClockRange>
|
|
|
|
return 0;
|
|
8005232: 2300 movs r3, #0
|
|
}
|
|
8005234: 4618 mov r0, r3
|
|
8005236: bd80 pop {r7, pc}
|
|
8005238: 24004b08 .word 0x24004b08
|
|
|
|
0800523c <ETH_PHY_IO_DeInit>:
|
|
* @brief De-Initializes the MDIO interface .
|
|
* @param None
|
|
* @retval 0 if OK, -1 if ERROR
|
|
*/
|
|
int32_t ETH_PHY_IO_DeInit (void)
|
|
{
|
|
800523c: b480 push {r7}
|
|
800523e: af00 add r7, sp, #0
|
|
return 0;
|
|
8005240: 2300 movs r3, #0
|
|
}
|
|
8005242: 4618 mov r0, r3
|
|
8005244: 46bd mov sp, r7
|
|
8005246: f85d 7b04 ldr.w r7, [sp], #4
|
|
800524a: 4770 bx lr
|
|
|
|
0800524c <ETH_PHY_IO_ReadReg>:
|
|
* @param RegAddr: PHY register address
|
|
* @param pRegVal: pointer to hold the register value
|
|
* @retval 0 if OK -1 if Error
|
|
*/
|
|
int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal)
|
|
{
|
|
800524c: b580 push {r7, lr}
|
|
800524e: b084 sub sp, #16
|
|
8005250: af00 add r7, sp, #0
|
|
8005252: 60f8 str r0, [r7, #12]
|
|
8005254: 60b9 str r1, [r7, #8]
|
|
8005256: 607a str r2, [r7, #4]
|
|
if(HAL_ETH_ReadPHYRegister(&heth, DevAddr, RegAddr, pRegVal) != HAL_OK)
|
|
8005258: 687b ldr r3, [r7, #4]
|
|
800525a: 68ba ldr r2, [r7, #8]
|
|
800525c: 68f9 ldr r1, [r7, #12]
|
|
800525e: 4807 ldr r0, [pc, #28] ; (800527c <ETH_PHY_IO_ReadReg+0x30>)
|
|
8005260: f7fc fd2a bl 8001cb8 <HAL_ETH_ReadPHYRegister>
|
|
8005264: 4603 mov r3, r0
|
|
8005266: 2b00 cmp r3, #0
|
|
8005268: d002 beq.n 8005270 <ETH_PHY_IO_ReadReg+0x24>
|
|
{
|
|
return -1;
|
|
800526a: f04f 33ff mov.w r3, #4294967295
|
|
800526e: e000 b.n 8005272 <ETH_PHY_IO_ReadReg+0x26>
|
|
}
|
|
|
|
return 0;
|
|
8005270: 2300 movs r3, #0
|
|
}
|
|
8005272: 4618 mov r0, r3
|
|
8005274: 3710 adds r7, #16
|
|
8005276: 46bd mov sp, r7
|
|
8005278: bd80 pop {r7, pc}
|
|
800527a: bf00 nop
|
|
800527c: 24004b08 .word 0x24004b08
|
|
|
|
08005280 <ETH_PHY_IO_WriteReg>:
|
|
* @param RegAddr: PHY register address
|
|
* @param RegVal: Value to be written
|
|
* @retval 0 if OK -1 if Error
|
|
*/
|
|
int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal)
|
|
{
|
|
8005280: b580 push {r7, lr}
|
|
8005282: b084 sub sp, #16
|
|
8005284: af00 add r7, sp, #0
|
|
8005286: 60f8 str r0, [r7, #12]
|
|
8005288: 60b9 str r1, [r7, #8]
|
|
800528a: 607a str r2, [r7, #4]
|
|
if(HAL_ETH_WritePHYRegister(&heth, DevAddr, RegAddr, RegVal) != HAL_OK)
|
|
800528c: 687b ldr r3, [r7, #4]
|
|
800528e: 68ba ldr r2, [r7, #8]
|
|
8005290: 68f9 ldr r1, [r7, #12]
|
|
8005292: 4807 ldr r0, [pc, #28] ; (80052b0 <ETH_PHY_IO_WriteReg+0x30>)
|
|
8005294: f7fc fd64 bl 8001d60 <HAL_ETH_WritePHYRegister>
|
|
8005298: 4603 mov r3, r0
|
|
800529a: 2b00 cmp r3, #0
|
|
800529c: d002 beq.n 80052a4 <ETH_PHY_IO_WriteReg+0x24>
|
|
{
|
|
return -1;
|
|
800529e: f04f 33ff mov.w r3, #4294967295
|
|
80052a2: e000 b.n 80052a6 <ETH_PHY_IO_WriteReg+0x26>
|
|
}
|
|
|
|
return 0;
|
|
80052a4: 2300 movs r3, #0
|
|
}
|
|
80052a6: 4618 mov r0, r3
|
|
80052a8: 3710 adds r7, #16
|
|
80052aa: 46bd mov sp, r7
|
|
80052ac: bd80 pop {r7, pc}
|
|
80052ae: bf00 nop
|
|
80052b0: 24004b08 .word 0x24004b08
|
|
|
|
080052b4 <ETH_PHY_IO_GetTick>:
|
|
/**
|
|
* @brief Get the time in millisecons used for internal PHY driver process.
|
|
* @retval Time value
|
|
*/
|
|
int32_t ETH_PHY_IO_GetTick(void)
|
|
{
|
|
80052b4: b580 push {r7, lr}
|
|
80052b6: af00 add r7, sp, #0
|
|
return HAL_GetTick();
|
|
80052b8: f7fb fea8 bl 800100c <HAL_GetTick>
|
|
80052bc: 4603 mov r3, r0
|
|
}
|
|
80052be: 4618 mov r0, r3
|
|
80052c0: bd80 pop {r7, pc}
|
|
...
|
|
|
|
080052c4 <ethernet_link_check_state>:
|
|
/**
|
|
* @brief Check the ETH link state then update ETH driver and netif link accordingly.
|
|
* @retval None
|
|
*/
|
|
void ethernet_link_check_state(struct netif *netif)
|
|
{
|
|
80052c4: b580 push {r7, lr}
|
|
80052c6: b0a0 sub sp, #128 ; 0x80
|
|
80052c8: af00 add r7, sp, #0
|
|
80052ca: 6078 str r0, [r7, #4]
|
|
ETH_MACConfigTypeDef MACConf = {0};
|
|
80052cc: f107 030c add.w r3, r7, #12
|
|
80052d0: 2264 movs r2, #100 ; 0x64
|
|
80052d2: 2100 movs r1, #0
|
|
80052d4: 4618 mov r0, r3
|
|
80052d6: f00b fdd5 bl 8010e84 <memset>
|
|
int32_t PHYLinkState = 0;
|
|
80052da: 2300 movs r3, #0
|
|
80052dc: 673b str r3, [r7, #112] ; 0x70
|
|
uint32_t linkchanged = 0U, speed = 0U, duplex = 0U;
|
|
80052de: 2300 movs r3, #0
|
|
80052e0: 67fb str r3, [r7, #124] ; 0x7c
|
|
80052e2: 2300 movs r3, #0
|
|
80052e4: 67bb str r3, [r7, #120] ; 0x78
|
|
80052e6: 2300 movs r3, #0
|
|
80052e8: 677b str r3, [r7, #116] ; 0x74
|
|
|
|
PHYLinkState = LAN8742_GetLinkState(&LAN8742);
|
|
80052ea: 483a ldr r0, [pc, #232] ; (80053d4 <ethernet_link_check_state+0x110>)
|
|
80052ec: f7fb fd81 bl 8000df2 <LAN8742_GetLinkState>
|
|
80052f0: 6738 str r0, [r7, #112] ; 0x70
|
|
|
|
if(netif_is_link_up(netif) && (PHYLinkState <= LAN8742_STATUS_LINK_DOWN))
|
|
80052f2: 687b ldr r3, [r7, #4]
|
|
80052f4: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
80052f8: 089b lsrs r3, r3, #2
|
|
80052fa: f003 0301 and.w r3, r3, #1
|
|
80052fe: b2db uxtb r3, r3
|
|
8005300: 2b00 cmp r3, #0
|
|
8005302: d00c beq.n 800531e <ethernet_link_check_state+0x5a>
|
|
8005304: 6f3b ldr r3, [r7, #112] ; 0x70
|
|
8005306: 2b01 cmp r3, #1
|
|
8005308: dc09 bgt.n 800531e <ethernet_link_check_state+0x5a>
|
|
{
|
|
HAL_ETH_Stop(&heth);
|
|
800530a: 4833 ldr r0, [pc, #204] ; (80053d8 <ethernet_link_check_state+0x114>)
|
|
800530c: f7fc f972 bl 80015f4 <HAL_ETH_Stop>
|
|
netif_set_down(netif);
|
|
8005310: 6878 ldr r0, [r7, #4]
|
|
8005312: f001 fa49 bl 80067a8 <netif_set_down>
|
|
netif_set_link_down(netif);
|
|
8005316: 6878 ldr r0, [r7, #4]
|
|
8005318: f001 faac bl 8006874 <netif_set_link_down>
|
|
netif_set_up(netif);
|
|
netif_set_link_up(netif);
|
|
}
|
|
}
|
|
|
|
}
|
|
800531c: e055 b.n 80053ca <ethernet_link_check_state+0x106>
|
|
else if(!netif_is_link_up(netif) && (PHYLinkState > LAN8742_STATUS_LINK_DOWN))
|
|
800531e: 687b ldr r3, [r7, #4]
|
|
8005320: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
8005324: f003 0304 and.w r3, r3, #4
|
|
8005328: 2b00 cmp r3, #0
|
|
800532a: d14e bne.n 80053ca <ethernet_link_check_state+0x106>
|
|
800532c: 6f3b ldr r3, [r7, #112] ; 0x70
|
|
800532e: 2b01 cmp r3, #1
|
|
8005330: dd4b ble.n 80053ca <ethernet_link_check_state+0x106>
|
|
switch (PHYLinkState)
|
|
8005332: 6f3b ldr r3, [r7, #112] ; 0x70
|
|
8005334: 3b02 subs r3, #2
|
|
8005336: 2b03 cmp r3, #3
|
|
8005338: d82a bhi.n 8005390 <ethernet_link_check_state+0xcc>
|
|
800533a: a201 add r2, pc, #4 ; (adr r2, 8005340 <ethernet_link_check_state+0x7c>)
|
|
800533c: f852 f023 ldr.w pc, [r2, r3, lsl #2]
|
|
8005340: 08005351 .word 0x08005351
|
|
8005344: 08005363 .word 0x08005363
|
|
8005348: 08005373 .word 0x08005373
|
|
800534c: 08005383 .word 0x08005383
|
|
duplex = ETH_FULLDUPLEX_MODE;
|
|
8005350: f44f 5300 mov.w r3, #8192 ; 0x2000
|
|
8005354: 677b str r3, [r7, #116] ; 0x74
|
|
speed = ETH_SPEED_100M;
|
|
8005356: f44f 4380 mov.w r3, #16384 ; 0x4000
|
|
800535a: 67bb str r3, [r7, #120] ; 0x78
|
|
linkchanged = 1;
|
|
800535c: 2301 movs r3, #1
|
|
800535e: 67fb str r3, [r7, #124] ; 0x7c
|
|
break;
|
|
8005360: e017 b.n 8005392 <ethernet_link_check_state+0xce>
|
|
duplex = ETH_HALFDUPLEX_MODE;
|
|
8005362: 2300 movs r3, #0
|
|
8005364: 677b str r3, [r7, #116] ; 0x74
|
|
speed = ETH_SPEED_100M;
|
|
8005366: f44f 4380 mov.w r3, #16384 ; 0x4000
|
|
800536a: 67bb str r3, [r7, #120] ; 0x78
|
|
linkchanged = 1;
|
|
800536c: 2301 movs r3, #1
|
|
800536e: 67fb str r3, [r7, #124] ; 0x7c
|
|
break;
|
|
8005370: e00f b.n 8005392 <ethernet_link_check_state+0xce>
|
|
duplex = ETH_FULLDUPLEX_MODE;
|
|
8005372: f44f 5300 mov.w r3, #8192 ; 0x2000
|
|
8005376: 677b str r3, [r7, #116] ; 0x74
|
|
speed = ETH_SPEED_10M;
|
|
8005378: 2300 movs r3, #0
|
|
800537a: 67bb str r3, [r7, #120] ; 0x78
|
|
linkchanged = 1;
|
|
800537c: 2301 movs r3, #1
|
|
800537e: 67fb str r3, [r7, #124] ; 0x7c
|
|
break;
|
|
8005380: e007 b.n 8005392 <ethernet_link_check_state+0xce>
|
|
duplex = ETH_HALFDUPLEX_MODE;
|
|
8005382: 2300 movs r3, #0
|
|
8005384: 677b str r3, [r7, #116] ; 0x74
|
|
speed = ETH_SPEED_10M;
|
|
8005386: 2300 movs r3, #0
|
|
8005388: 67bb str r3, [r7, #120] ; 0x78
|
|
linkchanged = 1;
|
|
800538a: 2301 movs r3, #1
|
|
800538c: 67fb str r3, [r7, #124] ; 0x7c
|
|
break;
|
|
800538e: e000 b.n 8005392 <ethernet_link_check_state+0xce>
|
|
break;
|
|
8005390: bf00 nop
|
|
if(linkchanged)
|
|
8005392: 6ffb ldr r3, [r7, #124] ; 0x7c
|
|
8005394: 2b00 cmp r3, #0
|
|
8005396: d018 beq.n 80053ca <ethernet_link_check_state+0x106>
|
|
HAL_ETH_GetMACConfig(&heth, &MACConf);
|
|
8005398: f107 030c add.w r3, r7, #12
|
|
800539c: 4619 mov r1, r3
|
|
800539e: 480e ldr r0, [pc, #56] ; (80053d8 <ethernet_link_check_state+0x114>)
|
|
80053a0: f7fc fd32 bl 8001e08 <HAL_ETH_GetMACConfig>
|
|
MACConf.DuplexMode = duplex;
|
|
80053a4: 6f7b ldr r3, [r7, #116] ; 0x74
|
|
80053a6: 627b str r3, [r7, #36] ; 0x24
|
|
MACConf.Speed = speed;
|
|
80053a8: 6fbb ldr r3, [r7, #120] ; 0x78
|
|
80053aa: 623b str r3, [r7, #32]
|
|
HAL_ETH_SetMACConfig(&heth, &MACConf);
|
|
80053ac: f107 030c add.w r3, r7, #12
|
|
80053b0: 4619 mov r1, r3
|
|
80053b2: 4809 ldr r0, [pc, #36] ; (80053d8 <ethernet_link_check_state+0x114>)
|
|
80053b4: f7fc fefc bl 80021b0 <HAL_ETH_SetMACConfig>
|
|
HAL_ETH_Start(&heth);
|
|
80053b8: 4807 ldr r0, [pc, #28] ; (80053d8 <ethernet_link_check_state+0x114>)
|
|
80053ba: f7fc f8b9 bl 8001530 <HAL_ETH_Start>
|
|
netif_set_up(netif);
|
|
80053be: 6878 ldr r0, [r7, #4]
|
|
80053c0: f001 f986 bl 80066d0 <netif_set_up>
|
|
netif_set_link_up(netif);
|
|
80053c4: 6878 ldr r0, [r7, #4]
|
|
80053c6: f001 fa21 bl 800680c <netif_set_link_up>
|
|
}
|
|
80053ca: bf00 nop
|
|
80053cc: 3780 adds r7, #128 ; 0x80
|
|
80053ce: 46bd mov sp, r7
|
|
80053d0: bd80 pop {r7, pc}
|
|
80053d2: bf00 nop
|
|
80053d4: 24004bf0 .word 0x24004bf0
|
|
80053d8: 24004b08 .word 0x24004b08
|
|
|
|
080053dc <HAL_ETH_RxAllocateCallback>:
|
|
|
|
void HAL_ETH_RxAllocateCallback(uint8_t **buff)
|
|
{
|
|
80053dc: b580 push {r7, lr}
|
|
80053de: b086 sub sp, #24
|
|
80053e0: af02 add r7, sp, #8
|
|
80053e2: 6078 str r0, [r7, #4]
|
|
/* USER CODE BEGIN HAL ETH RxAllocateCallback */
|
|
struct pbuf_custom *p = LWIP_MEMPOOL_ALLOC(RX_POOL);
|
|
80053e4: 4812 ldr r0, [pc, #72] ; (8005430 <HAL_ETH_RxAllocateCallback+0x54>)
|
|
80053e6: f000 fdf7 bl 8005fd8 <memp_malloc_pool>
|
|
80053ea: 60f8 str r0, [r7, #12]
|
|
if (p)
|
|
80053ec: 68fb ldr r3, [r7, #12]
|
|
80053ee: 2b00 cmp r3, #0
|
|
80053f0: d014 beq.n 800541c <HAL_ETH_RxAllocateCallback+0x40>
|
|
{
|
|
/* Get the buff from the struct pbuf address. */
|
|
*buff = (uint8_t *)p + offsetof(RxBuff_t, buff);
|
|
80053f2: 68fb ldr r3, [r7, #12]
|
|
80053f4: f103 0220 add.w r2, r3, #32
|
|
80053f8: 687b ldr r3, [r7, #4]
|
|
80053fa: 601a str r2, [r3, #0]
|
|
p->custom_free_function = pbuf_free_custom;
|
|
80053fc: 68fb ldr r3, [r7, #12]
|
|
80053fe: 4a0d ldr r2, [pc, #52] ; (8005434 <HAL_ETH_RxAllocateCallback+0x58>)
|
|
8005400: 611a str r2, [r3, #16]
|
|
/* Initialize the struct pbuf.
|
|
* This must be performed whenever a buffer's allocated because it may be
|
|
* changed by lwIP or the app, e.g., pbuf_free decrements ref. */
|
|
pbuf_alloced_custom(PBUF_RAW, 0, PBUF_REF, p, *buff, ETH_RX_BUFFER_SIZE);
|
|
8005402: 687b ldr r3, [r7, #4]
|
|
8005404: 681b ldr r3, [r3, #0]
|
|
8005406: f44f 62c0 mov.w r2, #1536 ; 0x600
|
|
800540a: 9201 str r2, [sp, #4]
|
|
800540c: 9300 str r3, [sp, #0]
|
|
800540e: 68fb ldr r3, [r7, #12]
|
|
8005410: 2241 movs r2, #65 ; 0x41
|
|
8005412: 2100 movs r1, #0
|
|
8005414: 2000 movs r0, #0
|
|
8005416: f001 fc23 bl 8006c60 <pbuf_alloced_custom>
|
|
{
|
|
RxAllocStatus = RX_ALLOC_ERROR;
|
|
*buff = NULL;
|
|
}
|
|
/* USER CODE END HAL ETH RxAllocateCallback */
|
|
}
|
|
800541a: e005 b.n 8005428 <HAL_ETH_RxAllocateCallback+0x4c>
|
|
RxAllocStatus = RX_ALLOC_ERROR;
|
|
800541c: 4b06 ldr r3, [pc, #24] ; (8005438 <HAL_ETH_RxAllocateCallback+0x5c>)
|
|
800541e: 2201 movs r2, #1
|
|
8005420: 701a strb r2, [r3, #0]
|
|
*buff = NULL;
|
|
8005422: 687b ldr r3, [r7, #4]
|
|
8005424: 2200 movs r2, #0
|
|
8005426: 601a str r2, [r3, #0]
|
|
}
|
|
8005428: bf00 nop
|
|
800542a: 3710 adds r7, #16
|
|
800542c: 46bd mov sp, r7
|
|
800542e: bd80 pop {r7, pc}
|
|
8005430: 08014c90 .word 0x08014c90
|
|
8005434: 0800507d .word 0x0800507d
|
|
8005438: 24004b04 .word 0x24004b04
|
|
|
|
0800543c <HAL_ETH_RxLinkCallback>:
|
|
|
|
void HAL_ETH_RxLinkCallback(void **pStart, void **pEnd, uint8_t *buff, uint16_t Length)
|
|
{
|
|
800543c: b480 push {r7}
|
|
800543e: b08d sub sp, #52 ; 0x34
|
|
8005440: af00 add r7, sp, #0
|
|
8005442: 60f8 str r0, [r7, #12]
|
|
8005444: 60b9 str r1, [r7, #8]
|
|
8005446: 607a str r2, [r7, #4]
|
|
8005448: 807b strh r3, [r7, #2]
|
|
/* USER CODE BEGIN HAL ETH RxLinkCallback */
|
|
|
|
struct pbuf **ppStart = (struct pbuf **)pStart;
|
|
800544a: 68fb ldr r3, [r7, #12]
|
|
800544c: 62bb str r3, [r7, #40] ; 0x28
|
|
struct pbuf **ppEnd = (struct pbuf **)pEnd;
|
|
800544e: 68bb ldr r3, [r7, #8]
|
|
8005450: 627b str r3, [r7, #36] ; 0x24
|
|
struct pbuf *p = NULL;
|
|
8005452: 2300 movs r3, #0
|
|
8005454: 62fb str r3, [r7, #44] ; 0x2c
|
|
|
|
/* Get the struct pbuf from the buff address. */
|
|
p = (struct pbuf *)(buff - offsetof(RxBuff_t, buff));
|
|
8005456: 687b ldr r3, [r7, #4]
|
|
8005458: 3b20 subs r3, #32
|
|
800545a: 62fb str r3, [r7, #44] ; 0x2c
|
|
p->next = NULL;
|
|
800545c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800545e: 2200 movs r2, #0
|
|
8005460: 601a str r2, [r3, #0]
|
|
p->tot_len = 0;
|
|
8005462: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8005464: 2200 movs r2, #0
|
|
8005466: 811a strh r2, [r3, #8]
|
|
p->len = Length;
|
|
8005468: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800546a: 887a ldrh r2, [r7, #2]
|
|
800546c: 815a strh r2, [r3, #10]
|
|
|
|
/* Chain the buffer. */
|
|
if (!*ppStart)
|
|
800546e: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8005470: 681b ldr r3, [r3, #0]
|
|
8005472: 2b00 cmp r3, #0
|
|
8005474: d103 bne.n 800547e <HAL_ETH_RxLinkCallback+0x42>
|
|
{
|
|
/* The first buffer of the packet. */
|
|
*ppStart = p;
|
|
8005476: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8005478: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
800547a: 601a str r2, [r3, #0]
|
|
800547c: e003 b.n 8005486 <HAL_ETH_RxLinkCallback+0x4a>
|
|
}
|
|
else
|
|
{
|
|
/* Chain the buffer to the end of the packet. */
|
|
(*ppEnd)->next = p;
|
|
800547e: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8005480: 681b ldr r3, [r3, #0]
|
|
8005482: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8005484: 601a str r2, [r3, #0]
|
|
}
|
|
*ppEnd = p;
|
|
8005486: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8005488: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
800548a: 601a str r2, [r3, #0]
|
|
|
|
/* Update the total length of all the buffers of the chain. Each pbuf in the chain should have its tot_len
|
|
* set to its own length, plus the length of all the following pbufs in the chain. */
|
|
for (p = *ppStart; p != NULL; p = p->next)
|
|
800548c: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800548e: 681b ldr r3, [r3, #0]
|
|
8005490: 62fb str r3, [r7, #44] ; 0x2c
|
|
8005492: e009 b.n 80054a8 <HAL_ETH_RxLinkCallback+0x6c>
|
|
{
|
|
p->tot_len += Length;
|
|
8005494: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8005496: 891a ldrh r2, [r3, #8]
|
|
8005498: 887b ldrh r3, [r7, #2]
|
|
800549a: 4413 add r3, r2
|
|
800549c: b29a uxth r2, r3
|
|
800549e: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80054a0: 811a strh r2, [r3, #8]
|
|
for (p = *ppStart; p != NULL; p = p->next)
|
|
80054a2: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80054a4: 681b ldr r3, [r3, #0]
|
|
80054a6: 62fb str r3, [r7, #44] ; 0x2c
|
|
80054a8: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80054aa: 2b00 cmp r3, #0
|
|
80054ac: d1f2 bne.n 8005494 <HAL_ETH_RxLinkCallback+0x58>
|
|
}
|
|
|
|
/* Invalidate data cache because Rx DMA's writing to physical memory makes it stale. */
|
|
SCB_InvalidateDCache_by_Addr((uint32_t *)buff, Length);
|
|
80054ae: 887b ldrh r3, [r7, #2]
|
|
80054b0: 687a ldr r2, [r7, #4]
|
|
80054b2: 623a str r2, [r7, #32]
|
|
80054b4: 61fb str r3, [r7, #28]
|
|
if ( dsize > 0 ) {
|
|
80054b6: 69fb ldr r3, [r7, #28]
|
|
80054b8: 2b00 cmp r3, #0
|
|
80054ba: dd1d ble.n 80054f8 <HAL_ETH_RxLinkCallback+0xbc>
|
|
int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U));
|
|
80054bc: 6a3b ldr r3, [r7, #32]
|
|
80054be: f003 021f and.w r2, r3, #31
|
|
80054c2: 69fb ldr r3, [r7, #28]
|
|
80054c4: 4413 add r3, r2
|
|
80054c6: 61bb str r3, [r7, #24]
|
|
uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */;
|
|
80054c8: 6a3b ldr r3, [r7, #32]
|
|
80054ca: 617b str r3, [r7, #20]
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
80054cc: f3bf 8f4f dsb sy
|
|
}
|
|
80054d0: bf00 nop
|
|
SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */
|
|
80054d2: 4a0d ldr r2, [pc, #52] ; (8005508 <HAL_ETH_RxLinkCallback+0xcc>)
|
|
80054d4: 697b ldr r3, [r7, #20]
|
|
80054d6: f8c2 325c str.w r3, [r2, #604] ; 0x25c
|
|
op_addr += __SCB_DCACHE_LINE_SIZE;
|
|
80054da: 697b ldr r3, [r7, #20]
|
|
80054dc: 3320 adds r3, #32
|
|
80054de: 617b str r3, [r7, #20]
|
|
op_size -= __SCB_DCACHE_LINE_SIZE;
|
|
80054e0: 69bb ldr r3, [r7, #24]
|
|
80054e2: 3b20 subs r3, #32
|
|
80054e4: 61bb str r3, [r7, #24]
|
|
} while ( op_size > 0 );
|
|
80054e6: 69bb ldr r3, [r7, #24]
|
|
80054e8: 2b00 cmp r3, #0
|
|
80054ea: dcf2 bgt.n 80054d2 <HAL_ETH_RxLinkCallback+0x96>
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
80054ec: f3bf 8f4f dsb sy
|
|
}
|
|
80054f0: bf00 nop
|
|
__ASM volatile ("isb 0xF":::"memory");
|
|
80054f2: f3bf 8f6f isb sy
|
|
}
|
|
80054f6: bf00 nop
|
|
}
|
|
80054f8: bf00 nop
|
|
|
|
/* USER CODE END HAL ETH RxLinkCallback */
|
|
}
|
|
80054fa: bf00 nop
|
|
80054fc: 3734 adds r7, #52 ; 0x34
|
|
80054fe: 46bd mov sp, r7
|
|
8005500: f85d 7b04 ldr.w r7, [sp], #4
|
|
8005504: 4770 bx lr
|
|
8005506: bf00 nop
|
|
8005508: e000ed00 .word 0xe000ed00
|
|
|
|
0800550c <lwip_strerr>:
|
|
* @param err an lwip internal err_t
|
|
* @return a string representation for err
|
|
*/
|
|
const char *
|
|
lwip_strerr(err_t err)
|
|
{
|
|
800550c: b480 push {r7}
|
|
800550e: b083 sub sp, #12
|
|
8005510: af00 add r7, sp, #0
|
|
8005512: 4603 mov r3, r0
|
|
8005514: 71fb strb r3, [r7, #7]
|
|
if ((err > 0) || (-err >= (err_t)LWIP_ARRAYSIZE(err_strerr))) {
|
|
8005516: f997 3007 ldrsb.w r3, [r7, #7]
|
|
800551a: 2b00 cmp r3, #0
|
|
800551c: dc04 bgt.n 8005528 <lwip_strerr+0x1c>
|
|
800551e: f997 3007 ldrsb.w r3, [r7, #7]
|
|
8005522: f113 0f10 cmn.w r3, #16
|
|
8005526: da01 bge.n 800552c <lwip_strerr+0x20>
|
|
return "Unknown error.";
|
|
8005528: 4b06 ldr r3, [pc, #24] ; (8005544 <lwip_strerr+0x38>)
|
|
800552a: e005 b.n 8005538 <lwip_strerr+0x2c>
|
|
}
|
|
return err_strerr[-err];
|
|
800552c: f997 3007 ldrsb.w r3, [r7, #7]
|
|
8005530: 425b negs r3, r3
|
|
8005532: 4a05 ldr r2, [pc, #20] ; (8005548 <lwip_strerr+0x3c>)
|
|
8005534: f852 3023 ldr.w r3, [r2, r3, lsl #2]
|
|
}
|
|
8005538: 4618 mov r0, r3
|
|
800553a: 370c adds r7, #12
|
|
800553c: 46bd mov sp, r7
|
|
800553e: f85d 7b04 ldr.w r7, [sp], #4
|
|
8005542: 4770 bx lr
|
|
8005544: 08011c90 .word 0x08011c90
|
|
8005548: 24000024 .word 0x24000024
|
|
|
|
0800554c <lwip_htons>:
|
|
* @param n u16_t in host byte order
|
|
* @return n in network byte order
|
|
*/
|
|
u16_t
|
|
lwip_htons(u16_t n)
|
|
{
|
|
800554c: b480 push {r7}
|
|
800554e: b083 sub sp, #12
|
|
8005550: af00 add r7, sp, #0
|
|
8005552: 4603 mov r3, r0
|
|
8005554: 80fb strh r3, [r7, #6]
|
|
return PP_HTONS(n);
|
|
8005556: 88fb ldrh r3, [r7, #6]
|
|
8005558: 021b lsls r3, r3, #8
|
|
800555a: b21a sxth r2, r3
|
|
800555c: 88fb ldrh r3, [r7, #6]
|
|
800555e: 0a1b lsrs r3, r3, #8
|
|
8005560: b29b uxth r3, r3
|
|
8005562: b21b sxth r3, r3
|
|
8005564: 4313 orrs r3, r2
|
|
8005566: b21b sxth r3, r3
|
|
8005568: b29b uxth r3, r3
|
|
}
|
|
800556a: 4618 mov r0, r3
|
|
800556c: 370c adds r7, #12
|
|
800556e: 46bd mov sp, r7
|
|
8005570: f85d 7b04 ldr.w r7, [sp], #4
|
|
8005574: 4770 bx lr
|
|
|
|
08005576 <lwip_htonl>:
|
|
* @param n u32_t in host byte order
|
|
* @return n in network byte order
|
|
*/
|
|
u32_t
|
|
lwip_htonl(u32_t n)
|
|
{
|
|
8005576: b480 push {r7}
|
|
8005578: b083 sub sp, #12
|
|
800557a: af00 add r7, sp, #0
|
|
800557c: 6078 str r0, [r7, #4]
|
|
return PP_HTONL(n);
|
|
800557e: 687b ldr r3, [r7, #4]
|
|
8005580: 061a lsls r2, r3, #24
|
|
8005582: 687b ldr r3, [r7, #4]
|
|
8005584: 021b lsls r3, r3, #8
|
|
8005586: f403 037f and.w r3, r3, #16711680 ; 0xff0000
|
|
800558a: 431a orrs r2, r3
|
|
800558c: 687b ldr r3, [r7, #4]
|
|
800558e: 0a1b lsrs r3, r3, #8
|
|
8005590: f403 437f and.w r3, r3, #65280 ; 0xff00
|
|
8005594: 431a orrs r2, r3
|
|
8005596: 687b ldr r3, [r7, #4]
|
|
8005598: 0e1b lsrs r3, r3, #24
|
|
800559a: 4313 orrs r3, r2
|
|
}
|
|
800559c: 4618 mov r0, r3
|
|
800559e: 370c adds r7, #12
|
|
80055a0: 46bd mov sp, r7
|
|
80055a2: f85d 7b04 ldr.w r7, [sp], #4
|
|
80055a6: 4770 bx lr
|
|
|
|
080055a8 <lwip_standard_chksum>:
|
|
* @param len length of data to be summed
|
|
* @return host order (!) lwip checksum (non-inverted Internet sum)
|
|
*/
|
|
u16_t
|
|
lwip_standard_chksum(const void *dataptr, int len)
|
|
{
|
|
80055a8: b480 push {r7}
|
|
80055aa: b089 sub sp, #36 ; 0x24
|
|
80055ac: af00 add r7, sp, #0
|
|
80055ae: 6078 str r0, [r7, #4]
|
|
80055b0: 6039 str r1, [r7, #0]
|
|
const u8_t *pb = (const u8_t *)dataptr;
|
|
80055b2: 687b ldr r3, [r7, #4]
|
|
80055b4: 61fb str r3, [r7, #28]
|
|
const u16_t *ps;
|
|
u16_t t = 0;
|
|
80055b6: 2300 movs r3, #0
|
|
80055b8: 81fb strh r3, [r7, #14]
|
|
u32_t sum = 0;
|
|
80055ba: 2300 movs r3, #0
|
|
80055bc: 617b str r3, [r7, #20]
|
|
int odd = ((mem_ptr_t)pb & 1);
|
|
80055be: 69fb ldr r3, [r7, #28]
|
|
80055c0: f003 0301 and.w r3, r3, #1
|
|
80055c4: 613b str r3, [r7, #16]
|
|
|
|
/* Get aligned to u16_t */
|
|
if (odd && len > 0) {
|
|
80055c6: 693b ldr r3, [r7, #16]
|
|
80055c8: 2b00 cmp r3, #0
|
|
80055ca: d00d beq.n 80055e8 <lwip_standard_chksum+0x40>
|
|
80055cc: 683b ldr r3, [r7, #0]
|
|
80055ce: 2b00 cmp r3, #0
|
|
80055d0: dd0a ble.n 80055e8 <lwip_standard_chksum+0x40>
|
|
((u8_t *)&t)[1] = *pb++;
|
|
80055d2: 69fa ldr r2, [r7, #28]
|
|
80055d4: 1c53 adds r3, r2, #1
|
|
80055d6: 61fb str r3, [r7, #28]
|
|
80055d8: f107 030e add.w r3, r7, #14
|
|
80055dc: 3301 adds r3, #1
|
|
80055de: 7812 ldrb r2, [r2, #0]
|
|
80055e0: 701a strb r2, [r3, #0]
|
|
len--;
|
|
80055e2: 683b ldr r3, [r7, #0]
|
|
80055e4: 3b01 subs r3, #1
|
|
80055e6: 603b str r3, [r7, #0]
|
|
}
|
|
|
|
/* Add the bulk of the data */
|
|
ps = (const u16_t *)(const void *)pb;
|
|
80055e8: 69fb ldr r3, [r7, #28]
|
|
80055ea: 61bb str r3, [r7, #24]
|
|
while (len > 1) {
|
|
80055ec: e00a b.n 8005604 <lwip_standard_chksum+0x5c>
|
|
sum += *ps++;
|
|
80055ee: 69bb ldr r3, [r7, #24]
|
|
80055f0: 1c9a adds r2, r3, #2
|
|
80055f2: 61ba str r2, [r7, #24]
|
|
80055f4: 881b ldrh r3, [r3, #0]
|
|
80055f6: 461a mov r2, r3
|
|
80055f8: 697b ldr r3, [r7, #20]
|
|
80055fa: 4413 add r3, r2
|
|
80055fc: 617b str r3, [r7, #20]
|
|
len -= 2;
|
|
80055fe: 683b ldr r3, [r7, #0]
|
|
8005600: 3b02 subs r3, #2
|
|
8005602: 603b str r3, [r7, #0]
|
|
while (len > 1) {
|
|
8005604: 683b ldr r3, [r7, #0]
|
|
8005606: 2b01 cmp r3, #1
|
|
8005608: dcf1 bgt.n 80055ee <lwip_standard_chksum+0x46>
|
|
}
|
|
|
|
/* Consume left-over byte, if any */
|
|
if (len > 0) {
|
|
800560a: 683b ldr r3, [r7, #0]
|
|
800560c: 2b00 cmp r3, #0
|
|
800560e: dd04 ble.n 800561a <lwip_standard_chksum+0x72>
|
|
((u8_t *)&t)[0] = *(const u8_t *)ps;
|
|
8005610: f107 030e add.w r3, r7, #14
|
|
8005614: 69ba ldr r2, [r7, #24]
|
|
8005616: 7812 ldrb r2, [r2, #0]
|
|
8005618: 701a strb r2, [r3, #0]
|
|
}
|
|
|
|
/* Add end bytes */
|
|
sum += t;
|
|
800561a: 89fb ldrh r3, [r7, #14]
|
|
800561c: 461a mov r2, r3
|
|
800561e: 697b ldr r3, [r7, #20]
|
|
8005620: 4413 add r3, r2
|
|
8005622: 617b str r3, [r7, #20]
|
|
|
|
/* Fold 32-bit sum to 16 bits
|
|
calling this twice is probably faster than if statements... */
|
|
sum = FOLD_U32T(sum);
|
|
8005624: 697b ldr r3, [r7, #20]
|
|
8005626: 0c1a lsrs r2, r3, #16
|
|
8005628: 697b ldr r3, [r7, #20]
|
|
800562a: b29b uxth r3, r3
|
|
800562c: 4413 add r3, r2
|
|
800562e: 617b str r3, [r7, #20]
|
|
sum = FOLD_U32T(sum);
|
|
8005630: 697b ldr r3, [r7, #20]
|
|
8005632: 0c1a lsrs r2, r3, #16
|
|
8005634: 697b ldr r3, [r7, #20]
|
|
8005636: b29b uxth r3, r3
|
|
8005638: 4413 add r3, r2
|
|
800563a: 617b str r3, [r7, #20]
|
|
|
|
/* Swap if alignment was odd */
|
|
if (odd) {
|
|
800563c: 693b ldr r3, [r7, #16]
|
|
800563e: 2b00 cmp r3, #0
|
|
8005640: d007 beq.n 8005652 <lwip_standard_chksum+0xaa>
|
|
sum = SWAP_BYTES_IN_WORD(sum);
|
|
8005642: 697b ldr r3, [r7, #20]
|
|
8005644: 021b lsls r3, r3, #8
|
|
8005646: b29a uxth r2, r3
|
|
8005648: 697b ldr r3, [r7, #20]
|
|
800564a: 0a1b lsrs r3, r3, #8
|
|
800564c: b2db uxtb r3, r3
|
|
800564e: 4313 orrs r3, r2
|
|
8005650: 617b str r3, [r7, #20]
|
|
}
|
|
|
|
return (u16_t)sum;
|
|
8005652: 697b ldr r3, [r7, #20]
|
|
8005654: b29b uxth r3, r3
|
|
}
|
|
8005656: 4618 mov r0, r3
|
|
8005658: 3724 adds r7, #36 ; 0x24
|
|
800565a: 46bd mov sp, r7
|
|
800565c: f85d 7b04 ldr.w r7, [sp], #4
|
|
8005660: 4770 bx lr
|
|
|
|
08005662 <inet_chksum>:
|
|
* @return checksum (as u16_t) to be saved directly in the protocol header
|
|
*/
|
|
|
|
u16_t
|
|
inet_chksum(const void *dataptr, u16_t len)
|
|
{
|
|
8005662: b580 push {r7, lr}
|
|
8005664: b082 sub sp, #8
|
|
8005666: af00 add r7, sp, #0
|
|
8005668: 6078 str r0, [r7, #4]
|
|
800566a: 460b mov r3, r1
|
|
800566c: 807b strh r3, [r7, #2]
|
|
return (u16_t)~(unsigned int)LWIP_CHKSUM(dataptr, len);
|
|
800566e: 887b ldrh r3, [r7, #2]
|
|
8005670: 4619 mov r1, r3
|
|
8005672: 6878 ldr r0, [r7, #4]
|
|
8005674: f7ff ff98 bl 80055a8 <lwip_standard_chksum>
|
|
8005678: 4603 mov r3, r0
|
|
800567a: 43db mvns r3, r3
|
|
800567c: b29b uxth r3, r3
|
|
}
|
|
800567e: 4618 mov r0, r3
|
|
8005680: 3708 adds r7, #8
|
|
8005682: 46bd mov sp, r7
|
|
8005684: bd80 pop {r7, pc}
|
|
|
|
08005686 <inet_chksum_pbuf>:
|
|
* @param p pbuf chain over that the checksum should be calculated
|
|
* @return checksum (as u16_t) to be saved directly in the protocol header
|
|
*/
|
|
u16_t
|
|
inet_chksum_pbuf(struct pbuf *p)
|
|
{
|
|
8005686: b580 push {r7, lr}
|
|
8005688: b086 sub sp, #24
|
|
800568a: af00 add r7, sp, #0
|
|
800568c: 6078 str r0, [r7, #4]
|
|
u32_t acc;
|
|
struct pbuf *q;
|
|
int swapped = 0;
|
|
800568e: 2300 movs r3, #0
|
|
8005690: 60fb str r3, [r7, #12]
|
|
|
|
acc = 0;
|
|
8005692: 2300 movs r3, #0
|
|
8005694: 617b str r3, [r7, #20]
|
|
for (q = p; q != NULL; q = q->next) {
|
|
8005696: 687b ldr r3, [r7, #4]
|
|
8005698: 613b str r3, [r7, #16]
|
|
800569a: e02b b.n 80056f4 <inet_chksum_pbuf+0x6e>
|
|
acc += LWIP_CHKSUM(q->payload, q->len);
|
|
800569c: 693b ldr r3, [r7, #16]
|
|
800569e: 685a ldr r2, [r3, #4]
|
|
80056a0: 693b ldr r3, [r7, #16]
|
|
80056a2: 895b ldrh r3, [r3, #10]
|
|
80056a4: 4619 mov r1, r3
|
|
80056a6: 4610 mov r0, r2
|
|
80056a8: f7ff ff7e bl 80055a8 <lwip_standard_chksum>
|
|
80056ac: 4603 mov r3, r0
|
|
80056ae: 461a mov r2, r3
|
|
80056b0: 697b ldr r3, [r7, #20]
|
|
80056b2: 4413 add r3, r2
|
|
80056b4: 617b str r3, [r7, #20]
|
|
acc = FOLD_U32T(acc);
|
|
80056b6: 697b ldr r3, [r7, #20]
|
|
80056b8: 0c1a lsrs r2, r3, #16
|
|
80056ba: 697b ldr r3, [r7, #20]
|
|
80056bc: b29b uxth r3, r3
|
|
80056be: 4413 add r3, r2
|
|
80056c0: 617b str r3, [r7, #20]
|
|
if (q->len % 2 != 0) {
|
|
80056c2: 693b ldr r3, [r7, #16]
|
|
80056c4: 895b ldrh r3, [r3, #10]
|
|
80056c6: f003 0301 and.w r3, r3, #1
|
|
80056ca: b29b uxth r3, r3
|
|
80056cc: 2b00 cmp r3, #0
|
|
80056ce: d00e beq.n 80056ee <inet_chksum_pbuf+0x68>
|
|
swapped = !swapped;
|
|
80056d0: 68fb ldr r3, [r7, #12]
|
|
80056d2: 2b00 cmp r3, #0
|
|
80056d4: bf0c ite eq
|
|
80056d6: 2301 moveq r3, #1
|
|
80056d8: 2300 movne r3, #0
|
|
80056da: b2db uxtb r3, r3
|
|
80056dc: 60fb str r3, [r7, #12]
|
|
acc = SWAP_BYTES_IN_WORD(acc);
|
|
80056de: 697b ldr r3, [r7, #20]
|
|
80056e0: 021b lsls r3, r3, #8
|
|
80056e2: b29a uxth r2, r3
|
|
80056e4: 697b ldr r3, [r7, #20]
|
|
80056e6: 0a1b lsrs r3, r3, #8
|
|
80056e8: b2db uxtb r3, r3
|
|
80056ea: 4313 orrs r3, r2
|
|
80056ec: 617b str r3, [r7, #20]
|
|
for (q = p; q != NULL; q = q->next) {
|
|
80056ee: 693b ldr r3, [r7, #16]
|
|
80056f0: 681b ldr r3, [r3, #0]
|
|
80056f2: 613b str r3, [r7, #16]
|
|
80056f4: 693b ldr r3, [r7, #16]
|
|
80056f6: 2b00 cmp r3, #0
|
|
80056f8: d1d0 bne.n 800569c <inet_chksum_pbuf+0x16>
|
|
}
|
|
}
|
|
|
|
if (swapped) {
|
|
80056fa: 68fb ldr r3, [r7, #12]
|
|
80056fc: 2b00 cmp r3, #0
|
|
80056fe: d007 beq.n 8005710 <inet_chksum_pbuf+0x8a>
|
|
acc = SWAP_BYTES_IN_WORD(acc);
|
|
8005700: 697b ldr r3, [r7, #20]
|
|
8005702: 021b lsls r3, r3, #8
|
|
8005704: b29a uxth r2, r3
|
|
8005706: 697b ldr r3, [r7, #20]
|
|
8005708: 0a1b lsrs r3, r3, #8
|
|
800570a: b2db uxtb r3, r3
|
|
800570c: 4313 orrs r3, r2
|
|
800570e: 617b str r3, [r7, #20]
|
|
}
|
|
return (u16_t)~(acc & 0xffffUL);
|
|
8005710: 697b ldr r3, [r7, #20]
|
|
8005712: b29b uxth r3, r3
|
|
8005714: 43db mvns r3, r3
|
|
8005716: b29b uxth r3, r3
|
|
}
|
|
8005718: 4618 mov r0, r3
|
|
800571a: 3718 adds r7, #24
|
|
800571c: 46bd mov sp, r7
|
|
800571e: bd80 pop {r7, pc}
|
|
|
|
08005720 <lwip_init>:
|
|
* Initialize all modules.
|
|
* Use this in NO_SYS mode. Use tcpip_init() otherwise.
|
|
*/
|
|
void
|
|
lwip_init(void)
|
|
{
|
|
8005720: b580 push {r7, lr}
|
|
8005722: b082 sub sp, #8
|
|
8005724: af00 add r7, sp, #0
|
|
#ifndef LWIP_SKIP_CONST_CHECK
|
|
int a = 0;
|
|
8005726: 2300 movs r3, #0
|
|
8005728: 607b str r3, [r7, #4]
|
|
/* Modules initialization */
|
|
stats_init();
|
|
#if !NO_SYS
|
|
sys_init();
|
|
#endif /* !NO_SYS */
|
|
mem_init();
|
|
800572a: f000 f8d9 bl 80058e0 <mem_init>
|
|
memp_init();
|
|
800572e: f000 fc07 bl 8005f40 <memp_init>
|
|
pbuf_init();
|
|
netif_init();
|
|
8005732: f000 fd0d bl 8006150 <netif_init>
|
|
#endif /* LWIP_IPV4 */
|
|
#if LWIP_RAW
|
|
raw_init();
|
|
#endif /* LWIP_RAW */
|
|
#if LWIP_UDP
|
|
udp_init();
|
|
8005736: f008 f829 bl 800d78c <udp_init>
|
|
#endif /* LWIP_UDP */
|
|
#if LWIP_TCP
|
|
tcp_init();
|
|
800573a: f001 fed9 bl 80074f0 <tcp_init>
|
|
#if PPP_SUPPORT
|
|
ppp_init();
|
|
#endif
|
|
|
|
#if LWIP_TIMERS
|
|
sys_timeouts_init();
|
|
800573e: f007 ff9b bl 800d678 <sys_timeouts_init>
|
|
#endif /* LWIP_TIMERS */
|
|
}
|
|
8005742: bf00 nop
|
|
8005744: 3708 adds r7, #8
|
|
8005746: 46bd mov sp, r7
|
|
8005748: bd80 pop {r7, pc}
|
|
...
|
|
|
|
0800574c <ptr_to_mem>:
|
|
#define mem_overflow_check_element(mem)
|
|
#endif /* MEM_OVERFLOW_CHECK */
|
|
|
|
static struct mem *
|
|
ptr_to_mem(mem_size_t ptr)
|
|
{
|
|
800574c: b480 push {r7}
|
|
800574e: b083 sub sp, #12
|
|
8005750: af00 add r7, sp, #0
|
|
8005752: 4603 mov r3, r0
|
|
8005754: 80fb strh r3, [r7, #6]
|
|
return (struct mem *)(void *)&ram[ptr];
|
|
8005756: 4b05 ldr r3, [pc, #20] ; (800576c <ptr_to_mem+0x20>)
|
|
8005758: 681a ldr r2, [r3, #0]
|
|
800575a: 88fb ldrh r3, [r7, #6]
|
|
800575c: 4413 add r3, r2
|
|
}
|
|
800575e: 4618 mov r0, r3
|
|
8005760: 370c adds r7, #12
|
|
8005762: 46bd mov sp, r7
|
|
8005764: f85d 7b04 ldr.w r7, [sp], #4
|
|
8005768: 4770 bx lr
|
|
800576a: bf00 nop
|
|
800576c: 24004c28 .word 0x24004c28
|
|
|
|
08005770 <mem_to_ptr>:
|
|
|
|
static mem_size_t
|
|
mem_to_ptr(void *mem)
|
|
{
|
|
8005770: b480 push {r7}
|
|
8005772: b083 sub sp, #12
|
|
8005774: af00 add r7, sp, #0
|
|
8005776: 6078 str r0, [r7, #4]
|
|
return (mem_size_t)((u8_t *)mem - ram);
|
|
8005778: 4b05 ldr r3, [pc, #20] ; (8005790 <mem_to_ptr+0x20>)
|
|
800577a: 681b ldr r3, [r3, #0]
|
|
800577c: 687a ldr r2, [r7, #4]
|
|
800577e: 1ad3 subs r3, r2, r3
|
|
8005780: b29b uxth r3, r3
|
|
}
|
|
8005782: 4618 mov r0, r3
|
|
8005784: 370c adds r7, #12
|
|
8005786: 46bd mov sp, r7
|
|
8005788: f85d 7b04 ldr.w r7, [sp], #4
|
|
800578c: 4770 bx lr
|
|
800578e: bf00 nop
|
|
8005790: 24004c28 .word 0x24004c28
|
|
|
|
08005794 <plug_holes>:
|
|
* This assumes access to the heap is protected by the calling function
|
|
* already.
|
|
*/
|
|
static void
|
|
plug_holes(struct mem *mem)
|
|
{
|
|
8005794: b590 push {r4, r7, lr}
|
|
8005796: b085 sub sp, #20
|
|
8005798: af00 add r7, sp, #0
|
|
800579a: 6078 str r0, [r7, #4]
|
|
struct mem *nmem;
|
|
struct mem *pmem;
|
|
|
|
LWIP_ASSERT("plug_holes: mem >= ram", (u8_t *)mem >= ram);
|
|
800579c: 4b47 ldr r3, [pc, #284] ; (80058bc <plug_holes+0x128>)
|
|
800579e: 681b ldr r3, [r3, #0]
|
|
80057a0: 687a ldr r2, [r7, #4]
|
|
80057a2: 429a cmp r2, r3
|
|
80057a4: d206 bcs.n 80057b4 <plug_holes+0x20>
|
|
80057a6: 4b46 ldr r3, [pc, #280] ; (80058c0 <plug_holes+0x12c>)
|
|
80057a8: f240 12df movw r2, #479 ; 0x1df
|
|
80057ac: 4945 ldr r1, [pc, #276] ; (80058c4 <plug_holes+0x130>)
|
|
80057ae: 4846 ldr r0, [pc, #280] ; (80058c8 <plug_holes+0x134>)
|
|
80057b0: f00b fa0a bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("plug_holes: mem < ram_end", (u8_t *)mem < (u8_t *)ram_end);
|
|
80057b4: 4b45 ldr r3, [pc, #276] ; (80058cc <plug_holes+0x138>)
|
|
80057b6: 681b ldr r3, [r3, #0]
|
|
80057b8: 687a ldr r2, [r7, #4]
|
|
80057ba: 429a cmp r2, r3
|
|
80057bc: d306 bcc.n 80057cc <plug_holes+0x38>
|
|
80057be: 4b40 ldr r3, [pc, #256] ; (80058c0 <plug_holes+0x12c>)
|
|
80057c0: f44f 72f0 mov.w r2, #480 ; 0x1e0
|
|
80057c4: 4942 ldr r1, [pc, #264] ; (80058d0 <plug_holes+0x13c>)
|
|
80057c6: 4840 ldr r0, [pc, #256] ; (80058c8 <plug_holes+0x134>)
|
|
80057c8: f00b f9fe bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
|
|
80057cc: 687b ldr r3, [r7, #4]
|
|
80057ce: 791b ldrb r3, [r3, #4]
|
|
80057d0: 2b00 cmp r3, #0
|
|
80057d2: d006 beq.n 80057e2 <plug_holes+0x4e>
|
|
80057d4: 4b3a ldr r3, [pc, #232] ; (80058c0 <plug_holes+0x12c>)
|
|
80057d6: f240 12e1 movw r2, #481 ; 0x1e1
|
|
80057da: 493e ldr r1, [pc, #248] ; (80058d4 <plug_holes+0x140>)
|
|
80057dc: 483a ldr r0, [pc, #232] ; (80058c8 <plug_holes+0x134>)
|
|
80057de: f00b f9f3 bl 8010bc8 <iprintf>
|
|
|
|
/* plug hole forward */
|
|
LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
|
|
80057e2: 687b ldr r3, [r7, #4]
|
|
80057e4: 881b ldrh r3, [r3, #0]
|
|
80057e6: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
80057ea: 4293 cmp r3, r2
|
|
80057ec: d906 bls.n 80057fc <plug_holes+0x68>
|
|
80057ee: 4b34 ldr r3, [pc, #208] ; (80058c0 <plug_holes+0x12c>)
|
|
80057f0: f44f 72f2 mov.w r2, #484 ; 0x1e4
|
|
80057f4: 4938 ldr r1, [pc, #224] ; (80058d8 <plug_holes+0x144>)
|
|
80057f6: 4834 ldr r0, [pc, #208] ; (80058c8 <plug_holes+0x134>)
|
|
80057f8: f00b f9e6 bl 8010bc8 <iprintf>
|
|
|
|
nmem = ptr_to_mem(mem->next);
|
|
80057fc: 687b ldr r3, [r7, #4]
|
|
80057fe: 881b ldrh r3, [r3, #0]
|
|
8005800: 4618 mov r0, r3
|
|
8005802: f7ff ffa3 bl 800574c <ptr_to_mem>
|
|
8005806: 60f8 str r0, [r7, #12]
|
|
if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
|
|
8005808: 687a ldr r2, [r7, #4]
|
|
800580a: 68fb ldr r3, [r7, #12]
|
|
800580c: 429a cmp r2, r3
|
|
800580e: d025 beq.n 800585c <plug_holes+0xc8>
|
|
8005810: 68fb ldr r3, [r7, #12]
|
|
8005812: 791b ldrb r3, [r3, #4]
|
|
8005814: 2b00 cmp r3, #0
|
|
8005816: d121 bne.n 800585c <plug_holes+0xc8>
|
|
8005818: 4b2c ldr r3, [pc, #176] ; (80058cc <plug_holes+0x138>)
|
|
800581a: 681b ldr r3, [r3, #0]
|
|
800581c: 68fa ldr r2, [r7, #12]
|
|
800581e: 429a cmp r2, r3
|
|
8005820: d01c beq.n 800585c <plug_holes+0xc8>
|
|
/* if mem->next is unused and not end of ram, combine mem and mem->next */
|
|
if (lfree == nmem) {
|
|
8005822: 4b2e ldr r3, [pc, #184] ; (80058dc <plug_holes+0x148>)
|
|
8005824: 681b ldr r3, [r3, #0]
|
|
8005826: 68fa ldr r2, [r7, #12]
|
|
8005828: 429a cmp r2, r3
|
|
800582a: d102 bne.n 8005832 <plug_holes+0x9e>
|
|
lfree = mem;
|
|
800582c: 4a2b ldr r2, [pc, #172] ; (80058dc <plug_holes+0x148>)
|
|
800582e: 687b ldr r3, [r7, #4]
|
|
8005830: 6013 str r3, [r2, #0]
|
|
}
|
|
mem->next = nmem->next;
|
|
8005832: 68fb ldr r3, [r7, #12]
|
|
8005834: 881a ldrh r2, [r3, #0]
|
|
8005836: 687b ldr r3, [r7, #4]
|
|
8005838: 801a strh r2, [r3, #0]
|
|
if (nmem->next != MEM_SIZE_ALIGNED) {
|
|
800583a: 68fb ldr r3, [r7, #12]
|
|
800583c: 881b ldrh r3, [r3, #0]
|
|
800583e: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005842: 4293 cmp r3, r2
|
|
8005844: d00a beq.n 800585c <plug_holes+0xc8>
|
|
ptr_to_mem(nmem->next)->prev = mem_to_ptr(mem);
|
|
8005846: 68fb ldr r3, [r7, #12]
|
|
8005848: 881b ldrh r3, [r3, #0]
|
|
800584a: 4618 mov r0, r3
|
|
800584c: f7ff ff7e bl 800574c <ptr_to_mem>
|
|
8005850: 4604 mov r4, r0
|
|
8005852: 6878 ldr r0, [r7, #4]
|
|
8005854: f7ff ff8c bl 8005770 <mem_to_ptr>
|
|
8005858: 4603 mov r3, r0
|
|
800585a: 8063 strh r3, [r4, #2]
|
|
}
|
|
}
|
|
|
|
/* plug hole backward */
|
|
pmem = ptr_to_mem(mem->prev);
|
|
800585c: 687b ldr r3, [r7, #4]
|
|
800585e: 885b ldrh r3, [r3, #2]
|
|
8005860: 4618 mov r0, r3
|
|
8005862: f7ff ff73 bl 800574c <ptr_to_mem>
|
|
8005866: 60b8 str r0, [r7, #8]
|
|
if (pmem != mem && pmem->used == 0) {
|
|
8005868: 68ba ldr r2, [r7, #8]
|
|
800586a: 687b ldr r3, [r7, #4]
|
|
800586c: 429a cmp r2, r3
|
|
800586e: d020 beq.n 80058b2 <plug_holes+0x11e>
|
|
8005870: 68bb ldr r3, [r7, #8]
|
|
8005872: 791b ldrb r3, [r3, #4]
|
|
8005874: 2b00 cmp r3, #0
|
|
8005876: d11c bne.n 80058b2 <plug_holes+0x11e>
|
|
/* if mem->prev is unused, combine mem and mem->prev */
|
|
if (lfree == mem) {
|
|
8005878: 4b18 ldr r3, [pc, #96] ; (80058dc <plug_holes+0x148>)
|
|
800587a: 681b ldr r3, [r3, #0]
|
|
800587c: 687a ldr r2, [r7, #4]
|
|
800587e: 429a cmp r2, r3
|
|
8005880: d102 bne.n 8005888 <plug_holes+0xf4>
|
|
lfree = pmem;
|
|
8005882: 4a16 ldr r2, [pc, #88] ; (80058dc <plug_holes+0x148>)
|
|
8005884: 68bb ldr r3, [r7, #8]
|
|
8005886: 6013 str r3, [r2, #0]
|
|
}
|
|
pmem->next = mem->next;
|
|
8005888: 687b ldr r3, [r7, #4]
|
|
800588a: 881a ldrh r2, [r3, #0]
|
|
800588c: 68bb ldr r3, [r7, #8]
|
|
800588e: 801a strh r2, [r3, #0]
|
|
if (mem->next != MEM_SIZE_ALIGNED) {
|
|
8005890: 687b ldr r3, [r7, #4]
|
|
8005892: 881b ldrh r3, [r3, #0]
|
|
8005894: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005898: 4293 cmp r3, r2
|
|
800589a: d00a beq.n 80058b2 <plug_holes+0x11e>
|
|
ptr_to_mem(mem->next)->prev = mem_to_ptr(pmem);
|
|
800589c: 687b ldr r3, [r7, #4]
|
|
800589e: 881b ldrh r3, [r3, #0]
|
|
80058a0: 4618 mov r0, r3
|
|
80058a2: f7ff ff53 bl 800574c <ptr_to_mem>
|
|
80058a6: 4604 mov r4, r0
|
|
80058a8: 68b8 ldr r0, [r7, #8]
|
|
80058aa: f7ff ff61 bl 8005770 <mem_to_ptr>
|
|
80058ae: 4603 mov r3, r0
|
|
80058b0: 8063 strh r3, [r4, #2]
|
|
}
|
|
}
|
|
}
|
|
80058b2: bf00 nop
|
|
80058b4: 3714 adds r7, #20
|
|
80058b6: 46bd mov sp, r7
|
|
80058b8: bd90 pop {r4, r7, pc}
|
|
80058ba: bf00 nop
|
|
80058bc: 24004c28 .word 0x24004c28
|
|
80058c0: 08011ca0 .word 0x08011ca0
|
|
80058c4: 08011cd0 .word 0x08011cd0
|
|
80058c8: 08011ce8 .word 0x08011ce8
|
|
80058cc: 24004c2c .word 0x24004c2c
|
|
80058d0: 08011d10 .word 0x08011d10
|
|
80058d4: 08011d2c .word 0x08011d2c
|
|
80058d8: 08011d48 .word 0x08011d48
|
|
80058dc: 24004c30 .word 0x24004c30
|
|
|
|
080058e0 <mem_init>:
|
|
/**
|
|
* Zero the heap and initialize start, end and lowest-free
|
|
*/
|
|
void
|
|
mem_init(void)
|
|
{
|
|
80058e0: b580 push {r7, lr}
|
|
80058e2: b082 sub sp, #8
|
|
80058e4: af00 add r7, sp, #0
|
|
|
|
LWIP_ASSERT("Sanity check alignment",
|
|
(SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT - 1)) == 0);
|
|
|
|
/* align the heap */
|
|
ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
|
|
80058e6: 4b16 ldr r3, [pc, #88] ; (8005940 <mem_init+0x60>)
|
|
80058e8: 4a16 ldr r2, [pc, #88] ; (8005944 <mem_init+0x64>)
|
|
80058ea: 601a str r2, [r3, #0]
|
|
/* initialize the start of the heap */
|
|
mem = (struct mem *)(void *)ram;
|
|
80058ec: 4b14 ldr r3, [pc, #80] ; (8005940 <mem_init+0x60>)
|
|
80058ee: 681b ldr r3, [r3, #0]
|
|
80058f0: 607b str r3, [r7, #4]
|
|
mem->next = MEM_SIZE_ALIGNED;
|
|
80058f2: 687b ldr r3, [r7, #4]
|
|
80058f4: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
80058f8: 801a strh r2, [r3, #0]
|
|
mem->prev = 0;
|
|
80058fa: 687b ldr r3, [r7, #4]
|
|
80058fc: 2200 movs r2, #0
|
|
80058fe: 805a strh r2, [r3, #2]
|
|
mem->used = 0;
|
|
8005900: 687b ldr r3, [r7, #4]
|
|
8005902: 2200 movs r2, #0
|
|
8005904: 711a strb r2, [r3, #4]
|
|
/* initialize the end of the heap */
|
|
ram_end = ptr_to_mem(MEM_SIZE_ALIGNED);
|
|
8005906: f647 50e8 movw r0, #32232 ; 0x7de8
|
|
800590a: f7ff ff1f bl 800574c <ptr_to_mem>
|
|
800590e: 4603 mov r3, r0
|
|
8005910: 4a0d ldr r2, [pc, #52] ; (8005948 <mem_init+0x68>)
|
|
8005912: 6013 str r3, [r2, #0]
|
|
ram_end->used = 1;
|
|
8005914: 4b0c ldr r3, [pc, #48] ; (8005948 <mem_init+0x68>)
|
|
8005916: 681b ldr r3, [r3, #0]
|
|
8005918: 2201 movs r2, #1
|
|
800591a: 711a strb r2, [r3, #4]
|
|
ram_end->next = MEM_SIZE_ALIGNED;
|
|
800591c: 4b0a ldr r3, [pc, #40] ; (8005948 <mem_init+0x68>)
|
|
800591e: 681b ldr r3, [r3, #0]
|
|
8005920: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005924: 801a strh r2, [r3, #0]
|
|
ram_end->prev = MEM_SIZE_ALIGNED;
|
|
8005926: 4b08 ldr r3, [pc, #32] ; (8005948 <mem_init+0x68>)
|
|
8005928: 681b ldr r3, [r3, #0]
|
|
800592a: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
800592e: 805a strh r2, [r3, #2]
|
|
MEM_SANITY();
|
|
|
|
/* initialize the lowest-free pointer to the start of the heap */
|
|
lfree = (struct mem *)(void *)ram;
|
|
8005930: 4b03 ldr r3, [pc, #12] ; (8005940 <mem_init+0x60>)
|
|
8005932: 681b ldr r3, [r3, #0]
|
|
8005934: 4a05 ldr r2, [pc, #20] ; (800594c <mem_init+0x6c>)
|
|
8005936: 6013 str r3, [r2, #0]
|
|
MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
|
|
|
|
if (sys_mutex_new(&mem_mutex) != ERR_OK) {
|
|
LWIP_ASSERT("failed to create mem_mutex", 0);
|
|
}
|
|
}
|
|
8005938: bf00 nop
|
|
800593a: 3708 adds r7, #8
|
|
800593c: 46bd mov sp, r7
|
|
800593e: bd80 pop {r7, pc}
|
|
8005940: 24004c28 .word 0x24004c28
|
|
8005944: 30000200 .word 0x30000200
|
|
8005948: 24004c2c .word 0x24004c2c
|
|
800594c: 24004c30 .word 0x24004c30
|
|
|
|
08005950 <mem_link_valid>:
|
|
/* Check if a struct mem is correctly linked.
|
|
* If not, double-free is a possible reason.
|
|
*/
|
|
static int
|
|
mem_link_valid(struct mem *mem)
|
|
{
|
|
8005950: b580 push {r7, lr}
|
|
8005952: b086 sub sp, #24
|
|
8005954: af00 add r7, sp, #0
|
|
8005956: 6078 str r0, [r7, #4]
|
|
struct mem *nmem, *pmem;
|
|
mem_size_t rmem_idx;
|
|
rmem_idx = mem_to_ptr(mem);
|
|
8005958: 6878 ldr r0, [r7, #4]
|
|
800595a: f7ff ff09 bl 8005770 <mem_to_ptr>
|
|
800595e: 4603 mov r3, r0
|
|
8005960: 82fb strh r3, [r7, #22]
|
|
nmem = ptr_to_mem(mem->next);
|
|
8005962: 687b ldr r3, [r7, #4]
|
|
8005964: 881b ldrh r3, [r3, #0]
|
|
8005966: 4618 mov r0, r3
|
|
8005968: f7ff fef0 bl 800574c <ptr_to_mem>
|
|
800596c: 6138 str r0, [r7, #16]
|
|
pmem = ptr_to_mem(mem->prev);
|
|
800596e: 687b ldr r3, [r7, #4]
|
|
8005970: 885b ldrh r3, [r3, #2]
|
|
8005972: 4618 mov r0, r3
|
|
8005974: f7ff feea bl 800574c <ptr_to_mem>
|
|
8005978: 60f8 str r0, [r7, #12]
|
|
if ((mem->next > MEM_SIZE_ALIGNED) || (mem->prev > MEM_SIZE_ALIGNED) ||
|
|
800597a: 687b ldr r3, [r7, #4]
|
|
800597c: 881b ldrh r3, [r3, #0]
|
|
800597e: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005982: 4293 cmp r3, r2
|
|
8005984: d819 bhi.n 80059ba <mem_link_valid+0x6a>
|
|
8005986: 687b ldr r3, [r7, #4]
|
|
8005988: 885b ldrh r3, [r3, #2]
|
|
800598a: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
800598e: 4293 cmp r3, r2
|
|
8005990: d813 bhi.n 80059ba <mem_link_valid+0x6a>
|
|
((mem->prev != rmem_idx) && (pmem->next != rmem_idx)) ||
|
|
8005992: 687b ldr r3, [r7, #4]
|
|
8005994: 885b ldrh r3, [r3, #2]
|
|
if ((mem->next > MEM_SIZE_ALIGNED) || (mem->prev > MEM_SIZE_ALIGNED) ||
|
|
8005996: 8afa ldrh r2, [r7, #22]
|
|
8005998: 429a cmp r2, r3
|
|
800599a: d004 beq.n 80059a6 <mem_link_valid+0x56>
|
|
((mem->prev != rmem_idx) && (pmem->next != rmem_idx)) ||
|
|
800599c: 68fb ldr r3, [r7, #12]
|
|
800599e: 881b ldrh r3, [r3, #0]
|
|
80059a0: 8afa ldrh r2, [r7, #22]
|
|
80059a2: 429a cmp r2, r3
|
|
80059a4: d109 bne.n 80059ba <mem_link_valid+0x6a>
|
|
((nmem != ram_end) && (nmem->prev != rmem_idx))) {
|
|
80059a6: 4b08 ldr r3, [pc, #32] ; (80059c8 <mem_link_valid+0x78>)
|
|
80059a8: 681b ldr r3, [r3, #0]
|
|
((mem->prev != rmem_idx) && (pmem->next != rmem_idx)) ||
|
|
80059aa: 693a ldr r2, [r7, #16]
|
|
80059ac: 429a cmp r2, r3
|
|
80059ae: d006 beq.n 80059be <mem_link_valid+0x6e>
|
|
((nmem != ram_end) && (nmem->prev != rmem_idx))) {
|
|
80059b0: 693b ldr r3, [r7, #16]
|
|
80059b2: 885b ldrh r3, [r3, #2]
|
|
80059b4: 8afa ldrh r2, [r7, #22]
|
|
80059b6: 429a cmp r2, r3
|
|
80059b8: d001 beq.n 80059be <mem_link_valid+0x6e>
|
|
return 0;
|
|
80059ba: 2300 movs r3, #0
|
|
80059bc: e000 b.n 80059c0 <mem_link_valid+0x70>
|
|
}
|
|
return 1;
|
|
80059be: 2301 movs r3, #1
|
|
}
|
|
80059c0: 4618 mov r0, r3
|
|
80059c2: 3718 adds r7, #24
|
|
80059c4: 46bd mov sp, r7
|
|
80059c6: bd80 pop {r7, pc}
|
|
80059c8: 24004c2c .word 0x24004c2c
|
|
|
|
080059cc <mem_free>:
|
|
* @param rmem is the data portion of a struct mem as returned by a previous
|
|
* call to mem_malloc()
|
|
*/
|
|
void
|
|
mem_free(void *rmem)
|
|
{
|
|
80059cc: b580 push {r7, lr}
|
|
80059ce: b084 sub sp, #16
|
|
80059d0: af00 add r7, sp, #0
|
|
80059d2: 6078 str r0, [r7, #4]
|
|
struct mem *mem;
|
|
LWIP_MEM_FREE_DECL_PROTECT();
|
|
|
|
if (rmem == NULL) {
|
|
80059d4: 687b ldr r3, [r7, #4]
|
|
80059d6: 2b00 cmp r3, #0
|
|
80059d8: d103 bne.n 80059e2 <mem_free+0x16>
|
|
LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("mem_free(p == NULL) was called.\n"));
|
|
80059da: 482f ldr r0, [pc, #188] ; (8005a98 <mem_free+0xcc>)
|
|
80059dc: f00b f962 bl 8010ca4 <puts>
|
|
return;
|
|
80059e0: e057 b.n 8005a92 <mem_free+0xc6>
|
|
}
|
|
if ((((mem_ptr_t)rmem) & (MEM_ALIGNMENT - 1)) != 0) {
|
|
80059e2: 687b ldr r3, [r7, #4]
|
|
80059e4: f003 0303 and.w r3, r3, #3
|
|
80059e8: 2b00 cmp r3, #0
|
|
80059ea: d00a beq.n 8005a02 <mem_free+0x36>
|
|
LWIP_MEM_ILLEGAL_FREE("mem_free: sanity check alignment");
|
|
80059ec: 4b2b ldr r3, [pc, #172] ; (8005a9c <mem_free+0xd0>)
|
|
80059ee: f240 2273 movw r2, #627 ; 0x273
|
|
80059f2: 492b ldr r1, [pc, #172] ; (8005aa0 <mem_free+0xd4>)
|
|
80059f4: 482b ldr r0, [pc, #172] ; (8005aa4 <mem_free+0xd8>)
|
|
80059f6: f00b f8e7 bl 8010bc8 <iprintf>
|
|
LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: sanity check alignment\n"));
|
|
80059fa: 4829 ldr r0, [pc, #164] ; (8005aa0 <mem_free+0xd4>)
|
|
80059fc: f00b f952 bl 8010ca4 <puts>
|
|
/* protect mem stats from concurrent access */
|
|
MEM_STATS_INC_LOCKED(illegal);
|
|
return;
|
|
8005a00: e047 b.n 8005a92 <mem_free+0xc6>
|
|
}
|
|
|
|
/* Get the corresponding struct mem: */
|
|
/* cast through void* to get rid of alignment warnings */
|
|
mem = (struct mem *)(void *)((u8_t *)rmem - (SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET));
|
|
8005a02: 687b ldr r3, [r7, #4]
|
|
8005a04: 3b08 subs r3, #8
|
|
8005a06: 60fb str r3, [r7, #12]
|
|
|
|
if ((u8_t *)mem < ram || (u8_t *)rmem + MIN_SIZE_ALIGNED > (u8_t *)ram_end) {
|
|
8005a08: 4b27 ldr r3, [pc, #156] ; (8005aa8 <mem_free+0xdc>)
|
|
8005a0a: 681b ldr r3, [r3, #0]
|
|
8005a0c: 68fa ldr r2, [r7, #12]
|
|
8005a0e: 429a cmp r2, r3
|
|
8005a10: d306 bcc.n 8005a20 <mem_free+0x54>
|
|
8005a12: 687b ldr r3, [r7, #4]
|
|
8005a14: f103 020c add.w r2, r3, #12
|
|
8005a18: 4b24 ldr r3, [pc, #144] ; (8005aac <mem_free+0xe0>)
|
|
8005a1a: 681b ldr r3, [r3, #0]
|
|
8005a1c: 429a cmp r2, r3
|
|
8005a1e: d90a bls.n 8005a36 <mem_free+0x6a>
|
|
LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory");
|
|
8005a20: 4b1e ldr r3, [pc, #120] ; (8005a9c <mem_free+0xd0>)
|
|
8005a22: f240 227f movw r2, #639 ; 0x27f
|
|
8005a26: 4922 ldr r1, [pc, #136] ; (8005ab0 <mem_free+0xe4>)
|
|
8005a28: 481e ldr r0, [pc, #120] ; (8005aa4 <mem_free+0xd8>)
|
|
8005a2a: f00b f8cd bl 8010bc8 <iprintf>
|
|
LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
|
|
8005a2e: 4820 ldr r0, [pc, #128] ; (8005ab0 <mem_free+0xe4>)
|
|
8005a30: f00b f938 bl 8010ca4 <puts>
|
|
/* protect mem stats from concurrent access */
|
|
MEM_STATS_INC_LOCKED(illegal);
|
|
return;
|
|
8005a34: e02d b.n 8005a92 <mem_free+0xc6>
|
|
mem_overflow_check_element(mem);
|
|
#endif
|
|
/* protect the heap from concurrent access */
|
|
LWIP_MEM_FREE_PROTECT();
|
|
/* mem has to be in a used state */
|
|
if (!mem->used) {
|
|
8005a36: 68fb ldr r3, [r7, #12]
|
|
8005a38: 791b ldrb r3, [r3, #4]
|
|
8005a3a: 2b00 cmp r3, #0
|
|
8005a3c: d10a bne.n 8005a54 <mem_free+0x88>
|
|
LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory: double free");
|
|
8005a3e: 4b17 ldr r3, [pc, #92] ; (8005a9c <mem_free+0xd0>)
|
|
8005a40: f44f 7223 mov.w r2, #652 ; 0x28c
|
|
8005a44: 491b ldr r1, [pc, #108] ; (8005ab4 <mem_free+0xe8>)
|
|
8005a46: 4817 ldr r0, [pc, #92] ; (8005aa4 <mem_free+0xd8>)
|
|
8005a48: f00b f8be bl 8010bc8 <iprintf>
|
|
LWIP_MEM_FREE_UNPROTECT();
|
|
LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory: double free?\n"));
|
|
8005a4c: 481a ldr r0, [pc, #104] ; (8005ab8 <mem_free+0xec>)
|
|
8005a4e: f00b f929 bl 8010ca4 <puts>
|
|
/* protect mem stats from concurrent access */
|
|
MEM_STATS_INC_LOCKED(illegal);
|
|
return;
|
|
8005a52: e01e b.n 8005a92 <mem_free+0xc6>
|
|
}
|
|
|
|
if (!mem_link_valid(mem)) {
|
|
8005a54: 68f8 ldr r0, [r7, #12]
|
|
8005a56: f7ff ff7b bl 8005950 <mem_link_valid>
|
|
8005a5a: 4603 mov r3, r0
|
|
8005a5c: 2b00 cmp r3, #0
|
|
8005a5e: d10a bne.n 8005a76 <mem_free+0xaa>
|
|
LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory: non-linked: double free");
|
|
8005a60: 4b0e ldr r3, [pc, #56] ; (8005a9c <mem_free+0xd0>)
|
|
8005a62: f240 2295 movw r2, #661 ; 0x295
|
|
8005a66: 4915 ldr r1, [pc, #84] ; (8005abc <mem_free+0xf0>)
|
|
8005a68: 480e ldr r0, [pc, #56] ; (8005aa4 <mem_free+0xd8>)
|
|
8005a6a: f00b f8ad bl 8010bc8 <iprintf>
|
|
LWIP_MEM_FREE_UNPROTECT();
|
|
LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory: non-linked: double free?\n"));
|
|
8005a6e: 4814 ldr r0, [pc, #80] ; (8005ac0 <mem_free+0xf4>)
|
|
8005a70: f00b f918 bl 8010ca4 <puts>
|
|
/* protect mem stats from concurrent access */
|
|
MEM_STATS_INC_LOCKED(illegal);
|
|
return;
|
|
8005a74: e00d b.n 8005a92 <mem_free+0xc6>
|
|
}
|
|
|
|
/* mem is now unused. */
|
|
mem->used = 0;
|
|
8005a76: 68fb ldr r3, [r7, #12]
|
|
8005a78: 2200 movs r2, #0
|
|
8005a7a: 711a strb r2, [r3, #4]
|
|
|
|
if (mem < lfree) {
|
|
8005a7c: 4b11 ldr r3, [pc, #68] ; (8005ac4 <mem_free+0xf8>)
|
|
8005a7e: 681b ldr r3, [r3, #0]
|
|
8005a80: 68fa ldr r2, [r7, #12]
|
|
8005a82: 429a cmp r2, r3
|
|
8005a84: d202 bcs.n 8005a8c <mem_free+0xc0>
|
|
/* the newly freed struct is now the lowest */
|
|
lfree = mem;
|
|
8005a86: 4a0f ldr r2, [pc, #60] ; (8005ac4 <mem_free+0xf8>)
|
|
8005a88: 68fb ldr r3, [r7, #12]
|
|
8005a8a: 6013 str r3, [r2, #0]
|
|
}
|
|
|
|
MEM_STATS_DEC_USED(used, mem->next - (mem_size_t)(((u8_t *)mem - ram)));
|
|
|
|
/* finally, see if prev or next are free also */
|
|
plug_holes(mem);
|
|
8005a8c: 68f8 ldr r0, [r7, #12]
|
|
8005a8e: f7ff fe81 bl 8005794 <plug_holes>
|
|
MEM_SANITY();
|
|
#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
|
|
mem_free_count = 1;
|
|
#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
|
|
LWIP_MEM_FREE_UNPROTECT();
|
|
}
|
|
8005a92: 3710 adds r7, #16
|
|
8005a94: 46bd mov sp, r7
|
|
8005a96: bd80 pop {r7, pc}
|
|
8005a98: 08011d74 .word 0x08011d74
|
|
8005a9c: 08011ca0 .word 0x08011ca0
|
|
8005aa0: 08011d94 .word 0x08011d94
|
|
8005aa4: 08011ce8 .word 0x08011ce8
|
|
8005aa8: 24004c28 .word 0x24004c28
|
|
8005aac: 24004c2c .word 0x24004c2c
|
|
8005ab0: 08011db8 .word 0x08011db8
|
|
8005ab4: 08011dd4 .word 0x08011dd4
|
|
8005ab8: 08011dfc .word 0x08011dfc
|
|
8005abc: 08011e24 .word 0x08011e24
|
|
8005ac0: 08011e58 .word 0x08011e58
|
|
8005ac4: 24004c30 .word 0x24004c30
|
|
|
|
08005ac8 <mem_trim>:
|
|
* or NULL if newsize is > old size, in which case rmem is NOT touched
|
|
* or freed!
|
|
*/
|
|
void *
|
|
mem_trim(void *rmem, mem_size_t new_size)
|
|
{
|
|
8005ac8: b580 push {r7, lr}
|
|
8005aca: b088 sub sp, #32
|
|
8005acc: af00 add r7, sp, #0
|
|
8005ace: 6078 str r0, [r7, #4]
|
|
8005ad0: 460b mov r3, r1
|
|
8005ad2: 807b strh r3, [r7, #2]
|
|
/* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */
|
|
LWIP_MEM_FREE_DECL_PROTECT();
|
|
|
|
/* Expand the size of the allocated memory region so that we can
|
|
adjust for alignment. */
|
|
newsize = (mem_size_t)LWIP_MEM_ALIGN_SIZE(new_size);
|
|
8005ad4: 887b ldrh r3, [r7, #2]
|
|
8005ad6: 3303 adds r3, #3
|
|
8005ad8: b29b uxth r3, r3
|
|
8005ada: f023 0303 bic.w r3, r3, #3
|
|
8005ade: 83fb strh r3, [r7, #30]
|
|
if (newsize < MIN_SIZE_ALIGNED) {
|
|
8005ae0: 8bfb ldrh r3, [r7, #30]
|
|
8005ae2: 2b0b cmp r3, #11
|
|
8005ae4: d801 bhi.n 8005aea <mem_trim+0x22>
|
|
/* every data block must be at least MIN_SIZE_ALIGNED long */
|
|
newsize = MIN_SIZE_ALIGNED;
|
|
8005ae6: 230c movs r3, #12
|
|
8005ae8: 83fb strh r3, [r7, #30]
|
|
}
|
|
#if MEM_OVERFLOW_CHECK
|
|
newsize += MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED;
|
|
#endif
|
|
if ((newsize > MEM_SIZE_ALIGNED) || (newsize < new_size)) {
|
|
8005aea: 8bfb ldrh r3, [r7, #30]
|
|
8005aec: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005af0: 4293 cmp r3, r2
|
|
8005af2: d803 bhi.n 8005afc <mem_trim+0x34>
|
|
8005af4: 8bfa ldrh r2, [r7, #30]
|
|
8005af6: 887b ldrh r3, [r7, #2]
|
|
8005af8: 429a cmp r2, r3
|
|
8005afa: d201 bcs.n 8005b00 <mem_trim+0x38>
|
|
return NULL;
|
|
8005afc: 2300 movs r3, #0
|
|
8005afe: e0d3 b.n 8005ca8 <mem_trim+0x1e0>
|
|
}
|
|
|
|
LWIP_ASSERT("mem_trim: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
|
|
8005b00: 4b6b ldr r3, [pc, #428] ; (8005cb0 <mem_trim+0x1e8>)
|
|
8005b02: 681b ldr r3, [r3, #0]
|
|
8005b04: 687a ldr r2, [r7, #4]
|
|
8005b06: 429a cmp r2, r3
|
|
8005b08: d304 bcc.n 8005b14 <mem_trim+0x4c>
|
|
8005b0a: 4b6a ldr r3, [pc, #424] ; (8005cb4 <mem_trim+0x1ec>)
|
|
8005b0c: 681b ldr r3, [r3, #0]
|
|
8005b0e: 687a ldr r2, [r7, #4]
|
|
8005b10: 429a cmp r2, r3
|
|
8005b12: d306 bcc.n 8005b22 <mem_trim+0x5a>
|
|
8005b14: 4b68 ldr r3, [pc, #416] ; (8005cb8 <mem_trim+0x1f0>)
|
|
8005b16: f240 22d1 movw r2, #721 ; 0x2d1
|
|
8005b1a: 4968 ldr r1, [pc, #416] ; (8005cbc <mem_trim+0x1f4>)
|
|
8005b1c: 4868 ldr r0, [pc, #416] ; (8005cc0 <mem_trim+0x1f8>)
|
|
8005b1e: f00b f853 bl 8010bc8 <iprintf>
|
|
(u8_t *)rmem < (u8_t *)ram_end);
|
|
|
|
if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
|
|
8005b22: 4b63 ldr r3, [pc, #396] ; (8005cb0 <mem_trim+0x1e8>)
|
|
8005b24: 681b ldr r3, [r3, #0]
|
|
8005b26: 687a ldr r2, [r7, #4]
|
|
8005b28: 429a cmp r2, r3
|
|
8005b2a: d304 bcc.n 8005b36 <mem_trim+0x6e>
|
|
8005b2c: 4b61 ldr r3, [pc, #388] ; (8005cb4 <mem_trim+0x1ec>)
|
|
8005b2e: 681b ldr r3, [r3, #0]
|
|
8005b30: 687a ldr r2, [r7, #4]
|
|
8005b32: 429a cmp r2, r3
|
|
8005b34: d304 bcc.n 8005b40 <mem_trim+0x78>
|
|
LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_trim: illegal memory\n"));
|
|
8005b36: 4863 ldr r0, [pc, #396] ; (8005cc4 <mem_trim+0x1fc>)
|
|
8005b38: f00b f8b4 bl 8010ca4 <puts>
|
|
/* protect mem stats from concurrent access */
|
|
MEM_STATS_INC_LOCKED(illegal);
|
|
return rmem;
|
|
8005b3c: 687b ldr r3, [r7, #4]
|
|
8005b3e: e0b3 b.n 8005ca8 <mem_trim+0x1e0>
|
|
}
|
|
/* Get the corresponding struct mem ... */
|
|
/* cast through void* to get rid of alignment warnings */
|
|
mem = (struct mem *)(void *)((u8_t *)rmem - (SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET));
|
|
8005b40: 687b ldr r3, [r7, #4]
|
|
8005b42: 3b08 subs r3, #8
|
|
8005b44: 61bb str r3, [r7, #24]
|
|
#if MEM_OVERFLOW_CHECK
|
|
mem_overflow_check_element(mem);
|
|
#endif
|
|
/* ... and its offset pointer */
|
|
ptr = mem_to_ptr(mem);
|
|
8005b46: 69b8 ldr r0, [r7, #24]
|
|
8005b48: f7ff fe12 bl 8005770 <mem_to_ptr>
|
|
8005b4c: 4603 mov r3, r0
|
|
8005b4e: 82fb strh r3, [r7, #22]
|
|
|
|
size = (mem_size_t)((mem_size_t)(mem->next - ptr) - (SIZEOF_STRUCT_MEM + MEM_SANITY_OVERHEAD));
|
|
8005b50: 69bb ldr r3, [r7, #24]
|
|
8005b52: 881a ldrh r2, [r3, #0]
|
|
8005b54: 8afb ldrh r3, [r7, #22]
|
|
8005b56: 1ad3 subs r3, r2, r3
|
|
8005b58: b29b uxth r3, r3
|
|
8005b5a: 3b08 subs r3, #8
|
|
8005b5c: 82bb strh r3, [r7, #20]
|
|
LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size);
|
|
8005b5e: 8bfa ldrh r2, [r7, #30]
|
|
8005b60: 8abb ldrh r3, [r7, #20]
|
|
8005b62: 429a cmp r2, r3
|
|
8005b64: d906 bls.n 8005b74 <mem_trim+0xac>
|
|
8005b66: 4b54 ldr r3, [pc, #336] ; (8005cb8 <mem_trim+0x1f0>)
|
|
8005b68: f44f 7239 mov.w r2, #740 ; 0x2e4
|
|
8005b6c: 4956 ldr r1, [pc, #344] ; (8005cc8 <mem_trim+0x200>)
|
|
8005b6e: 4854 ldr r0, [pc, #336] ; (8005cc0 <mem_trim+0x1f8>)
|
|
8005b70: f00b f82a bl 8010bc8 <iprintf>
|
|
if (newsize > size) {
|
|
8005b74: 8bfa ldrh r2, [r7, #30]
|
|
8005b76: 8abb ldrh r3, [r7, #20]
|
|
8005b78: 429a cmp r2, r3
|
|
8005b7a: d901 bls.n 8005b80 <mem_trim+0xb8>
|
|
/* not supported */
|
|
return NULL;
|
|
8005b7c: 2300 movs r3, #0
|
|
8005b7e: e093 b.n 8005ca8 <mem_trim+0x1e0>
|
|
}
|
|
if (newsize == size) {
|
|
8005b80: 8bfa ldrh r2, [r7, #30]
|
|
8005b82: 8abb ldrh r3, [r7, #20]
|
|
8005b84: 429a cmp r2, r3
|
|
8005b86: d101 bne.n 8005b8c <mem_trim+0xc4>
|
|
/* No change in size, simply return */
|
|
return rmem;
|
|
8005b88: 687b ldr r3, [r7, #4]
|
|
8005b8a: e08d b.n 8005ca8 <mem_trim+0x1e0>
|
|
}
|
|
|
|
/* protect the heap from concurrent access */
|
|
LWIP_MEM_FREE_PROTECT();
|
|
|
|
mem2 = ptr_to_mem(mem->next);
|
|
8005b8c: 69bb ldr r3, [r7, #24]
|
|
8005b8e: 881b ldrh r3, [r3, #0]
|
|
8005b90: 4618 mov r0, r3
|
|
8005b92: f7ff fddb bl 800574c <ptr_to_mem>
|
|
8005b96: 6138 str r0, [r7, #16]
|
|
if (mem2->used == 0) {
|
|
8005b98: 693b ldr r3, [r7, #16]
|
|
8005b9a: 791b ldrb r3, [r3, #4]
|
|
8005b9c: 2b00 cmp r3, #0
|
|
8005b9e: d141 bne.n 8005c24 <mem_trim+0x15c>
|
|
/* The next struct is unused, we can simply move it at little */
|
|
mem_size_t next;
|
|
LWIP_ASSERT("invalid next ptr", mem->next != MEM_SIZE_ALIGNED);
|
|
8005ba0: 69bb ldr r3, [r7, #24]
|
|
8005ba2: 881b ldrh r3, [r3, #0]
|
|
8005ba4: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005ba8: 4293 cmp r3, r2
|
|
8005baa: d106 bne.n 8005bba <mem_trim+0xf2>
|
|
8005bac: 4b42 ldr r3, [pc, #264] ; (8005cb8 <mem_trim+0x1f0>)
|
|
8005bae: f240 22f5 movw r2, #757 ; 0x2f5
|
|
8005bb2: 4946 ldr r1, [pc, #280] ; (8005ccc <mem_trim+0x204>)
|
|
8005bb4: 4842 ldr r0, [pc, #264] ; (8005cc0 <mem_trim+0x1f8>)
|
|
8005bb6: f00b f807 bl 8010bc8 <iprintf>
|
|
/* remember the old next pointer */
|
|
next = mem2->next;
|
|
8005bba: 693b ldr r3, [r7, #16]
|
|
8005bbc: 881b ldrh r3, [r3, #0]
|
|
8005bbe: 81bb strh r3, [r7, #12]
|
|
/* create new struct mem which is moved directly after the shrinked mem */
|
|
ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + newsize);
|
|
8005bc0: 8afa ldrh r2, [r7, #22]
|
|
8005bc2: 8bfb ldrh r3, [r7, #30]
|
|
8005bc4: 4413 add r3, r2
|
|
8005bc6: b29b uxth r3, r3
|
|
8005bc8: 3308 adds r3, #8
|
|
8005bca: 81fb strh r3, [r7, #14]
|
|
if (lfree == mem2) {
|
|
8005bcc: 4b40 ldr r3, [pc, #256] ; (8005cd0 <mem_trim+0x208>)
|
|
8005bce: 681b ldr r3, [r3, #0]
|
|
8005bd0: 693a ldr r2, [r7, #16]
|
|
8005bd2: 429a cmp r2, r3
|
|
8005bd4: d106 bne.n 8005be4 <mem_trim+0x11c>
|
|
lfree = ptr_to_mem(ptr2);
|
|
8005bd6: 89fb ldrh r3, [r7, #14]
|
|
8005bd8: 4618 mov r0, r3
|
|
8005bda: f7ff fdb7 bl 800574c <ptr_to_mem>
|
|
8005bde: 4603 mov r3, r0
|
|
8005be0: 4a3b ldr r2, [pc, #236] ; (8005cd0 <mem_trim+0x208>)
|
|
8005be2: 6013 str r3, [r2, #0]
|
|
}
|
|
mem2 = ptr_to_mem(ptr2);
|
|
8005be4: 89fb ldrh r3, [r7, #14]
|
|
8005be6: 4618 mov r0, r3
|
|
8005be8: f7ff fdb0 bl 800574c <ptr_to_mem>
|
|
8005bec: 6138 str r0, [r7, #16]
|
|
mem2->used = 0;
|
|
8005bee: 693b ldr r3, [r7, #16]
|
|
8005bf0: 2200 movs r2, #0
|
|
8005bf2: 711a strb r2, [r3, #4]
|
|
/* restore the next pointer */
|
|
mem2->next = next;
|
|
8005bf4: 693b ldr r3, [r7, #16]
|
|
8005bf6: 89ba ldrh r2, [r7, #12]
|
|
8005bf8: 801a strh r2, [r3, #0]
|
|
/* link it back to mem */
|
|
mem2->prev = ptr;
|
|
8005bfa: 693b ldr r3, [r7, #16]
|
|
8005bfc: 8afa ldrh r2, [r7, #22]
|
|
8005bfe: 805a strh r2, [r3, #2]
|
|
/* link mem to it */
|
|
mem->next = ptr2;
|
|
8005c00: 69bb ldr r3, [r7, #24]
|
|
8005c02: 89fa ldrh r2, [r7, #14]
|
|
8005c04: 801a strh r2, [r3, #0]
|
|
/* last thing to restore linked list: as we have moved mem2,
|
|
* let 'mem2->next->prev' point to mem2 again. but only if mem2->next is not
|
|
* the end of the heap */
|
|
if (mem2->next != MEM_SIZE_ALIGNED) {
|
|
8005c06: 693b ldr r3, [r7, #16]
|
|
8005c08: 881b ldrh r3, [r3, #0]
|
|
8005c0a: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005c0e: 4293 cmp r3, r2
|
|
8005c10: d049 beq.n 8005ca6 <mem_trim+0x1de>
|
|
ptr_to_mem(mem2->next)->prev = ptr2;
|
|
8005c12: 693b ldr r3, [r7, #16]
|
|
8005c14: 881b ldrh r3, [r3, #0]
|
|
8005c16: 4618 mov r0, r3
|
|
8005c18: f7ff fd98 bl 800574c <ptr_to_mem>
|
|
8005c1c: 4602 mov r2, r0
|
|
8005c1e: 89fb ldrh r3, [r7, #14]
|
|
8005c20: 8053 strh r3, [r2, #2]
|
|
8005c22: e040 b.n 8005ca6 <mem_trim+0x1de>
|
|
}
|
|
MEM_STATS_DEC_USED(used, (size - newsize));
|
|
/* no need to plug holes, we've already done that */
|
|
} else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) {
|
|
8005c24: 8bfb ldrh r3, [r7, #30]
|
|
8005c26: f103 0214 add.w r2, r3, #20
|
|
8005c2a: 8abb ldrh r3, [r7, #20]
|
|
8005c2c: 429a cmp r2, r3
|
|
8005c2e: d83a bhi.n 8005ca6 <mem_trim+0x1de>
|
|
* Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem
|
|
* ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').
|
|
* @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
|
|
* region that couldn't hold data, but when mem->next gets freed,
|
|
* the 2 regions would be combined, resulting in more free memory */
|
|
ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + newsize);
|
|
8005c30: 8afa ldrh r2, [r7, #22]
|
|
8005c32: 8bfb ldrh r3, [r7, #30]
|
|
8005c34: 4413 add r3, r2
|
|
8005c36: b29b uxth r3, r3
|
|
8005c38: 3308 adds r3, #8
|
|
8005c3a: 81fb strh r3, [r7, #14]
|
|
LWIP_ASSERT("invalid next ptr", mem->next != MEM_SIZE_ALIGNED);
|
|
8005c3c: 69bb ldr r3, [r7, #24]
|
|
8005c3e: 881b ldrh r3, [r3, #0]
|
|
8005c40: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005c44: 4293 cmp r3, r2
|
|
8005c46: d106 bne.n 8005c56 <mem_trim+0x18e>
|
|
8005c48: 4b1b ldr r3, [pc, #108] ; (8005cb8 <mem_trim+0x1f0>)
|
|
8005c4a: f240 3216 movw r2, #790 ; 0x316
|
|
8005c4e: 491f ldr r1, [pc, #124] ; (8005ccc <mem_trim+0x204>)
|
|
8005c50: 481b ldr r0, [pc, #108] ; (8005cc0 <mem_trim+0x1f8>)
|
|
8005c52: f00a ffb9 bl 8010bc8 <iprintf>
|
|
mem2 = ptr_to_mem(ptr2);
|
|
8005c56: 89fb ldrh r3, [r7, #14]
|
|
8005c58: 4618 mov r0, r3
|
|
8005c5a: f7ff fd77 bl 800574c <ptr_to_mem>
|
|
8005c5e: 6138 str r0, [r7, #16]
|
|
if (mem2 < lfree) {
|
|
8005c60: 4b1b ldr r3, [pc, #108] ; (8005cd0 <mem_trim+0x208>)
|
|
8005c62: 681b ldr r3, [r3, #0]
|
|
8005c64: 693a ldr r2, [r7, #16]
|
|
8005c66: 429a cmp r2, r3
|
|
8005c68: d202 bcs.n 8005c70 <mem_trim+0x1a8>
|
|
lfree = mem2;
|
|
8005c6a: 4a19 ldr r2, [pc, #100] ; (8005cd0 <mem_trim+0x208>)
|
|
8005c6c: 693b ldr r3, [r7, #16]
|
|
8005c6e: 6013 str r3, [r2, #0]
|
|
}
|
|
mem2->used = 0;
|
|
8005c70: 693b ldr r3, [r7, #16]
|
|
8005c72: 2200 movs r2, #0
|
|
8005c74: 711a strb r2, [r3, #4]
|
|
mem2->next = mem->next;
|
|
8005c76: 69bb ldr r3, [r7, #24]
|
|
8005c78: 881a ldrh r2, [r3, #0]
|
|
8005c7a: 693b ldr r3, [r7, #16]
|
|
8005c7c: 801a strh r2, [r3, #0]
|
|
mem2->prev = ptr;
|
|
8005c7e: 693b ldr r3, [r7, #16]
|
|
8005c80: 8afa ldrh r2, [r7, #22]
|
|
8005c82: 805a strh r2, [r3, #2]
|
|
mem->next = ptr2;
|
|
8005c84: 69bb ldr r3, [r7, #24]
|
|
8005c86: 89fa ldrh r2, [r7, #14]
|
|
8005c88: 801a strh r2, [r3, #0]
|
|
if (mem2->next != MEM_SIZE_ALIGNED) {
|
|
8005c8a: 693b ldr r3, [r7, #16]
|
|
8005c8c: 881b ldrh r3, [r3, #0]
|
|
8005c8e: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005c92: 4293 cmp r3, r2
|
|
8005c94: d007 beq.n 8005ca6 <mem_trim+0x1de>
|
|
ptr_to_mem(mem2->next)->prev = ptr2;
|
|
8005c96: 693b ldr r3, [r7, #16]
|
|
8005c98: 881b ldrh r3, [r3, #0]
|
|
8005c9a: 4618 mov r0, r3
|
|
8005c9c: f7ff fd56 bl 800574c <ptr_to_mem>
|
|
8005ca0: 4602 mov r2, r0
|
|
8005ca2: 89fb ldrh r3, [r7, #14]
|
|
8005ca4: 8053 strh r3, [r2, #2]
|
|
MEM_SANITY();
|
|
#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
|
|
mem_free_count = 1;
|
|
#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
|
|
LWIP_MEM_FREE_UNPROTECT();
|
|
return rmem;
|
|
8005ca6: 687b ldr r3, [r7, #4]
|
|
}
|
|
8005ca8: 4618 mov r0, r3
|
|
8005caa: 3720 adds r7, #32
|
|
8005cac: 46bd mov sp, r7
|
|
8005cae: bd80 pop {r7, pc}
|
|
8005cb0: 24004c28 .word 0x24004c28
|
|
8005cb4: 24004c2c .word 0x24004c2c
|
|
8005cb8: 08011ca0 .word 0x08011ca0
|
|
8005cbc: 08011e8c .word 0x08011e8c
|
|
8005cc0: 08011ce8 .word 0x08011ce8
|
|
8005cc4: 08011ea4 .word 0x08011ea4
|
|
8005cc8: 08011ec0 .word 0x08011ec0
|
|
8005ccc: 08011ee0 .word 0x08011ee0
|
|
8005cd0: 24004c30 .word 0x24004c30
|
|
|
|
08005cd4 <mem_malloc>:
|
|
*
|
|
* Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT).
|
|
*/
|
|
void *
|
|
mem_malloc(mem_size_t size_in)
|
|
{
|
|
8005cd4: b580 push {r7, lr}
|
|
8005cd6: b088 sub sp, #32
|
|
8005cd8: af00 add r7, sp, #0
|
|
8005cda: 4603 mov r3, r0
|
|
8005cdc: 80fb strh r3, [r7, #6]
|
|
#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
|
|
u8_t local_mem_free_count = 0;
|
|
#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
|
|
LWIP_MEM_ALLOC_DECL_PROTECT();
|
|
|
|
if (size_in == 0) {
|
|
8005cde: 88fb ldrh r3, [r7, #6]
|
|
8005ce0: 2b00 cmp r3, #0
|
|
8005ce2: d101 bne.n 8005ce8 <mem_malloc+0x14>
|
|
return NULL;
|
|
8005ce4: 2300 movs r3, #0
|
|
8005ce6: e0e3 b.n 8005eb0 <mem_malloc+0x1dc>
|
|
}
|
|
|
|
/* Expand the size of the allocated memory region so that we can
|
|
adjust for alignment. */
|
|
size = (mem_size_t)LWIP_MEM_ALIGN_SIZE(size_in);
|
|
8005ce8: 88fb ldrh r3, [r7, #6]
|
|
8005cea: 3303 adds r3, #3
|
|
8005cec: b29b uxth r3, r3
|
|
8005cee: f023 0303 bic.w r3, r3, #3
|
|
8005cf2: 83bb strh r3, [r7, #28]
|
|
if (size < MIN_SIZE_ALIGNED) {
|
|
8005cf4: 8bbb ldrh r3, [r7, #28]
|
|
8005cf6: 2b0b cmp r3, #11
|
|
8005cf8: d801 bhi.n 8005cfe <mem_malloc+0x2a>
|
|
/* every data block must be at least MIN_SIZE_ALIGNED long */
|
|
size = MIN_SIZE_ALIGNED;
|
|
8005cfa: 230c movs r3, #12
|
|
8005cfc: 83bb strh r3, [r7, #28]
|
|
}
|
|
#if MEM_OVERFLOW_CHECK
|
|
size += MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED;
|
|
#endif
|
|
if ((size > MEM_SIZE_ALIGNED) || (size < size_in)) {
|
|
8005cfe: 8bbb ldrh r3, [r7, #28]
|
|
8005d00: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005d04: 4293 cmp r3, r2
|
|
8005d06: d803 bhi.n 8005d10 <mem_malloc+0x3c>
|
|
8005d08: 8bba ldrh r2, [r7, #28]
|
|
8005d0a: 88fb ldrh r3, [r7, #6]
|
|
8005d0c: 429a cmp r2, r3
|
|
8005d0e: d201 bcs.n 8005d14 <mem_malloc+0x40>
|
|
return NULL;
|
|
8005d10: 2300 movs r3, #0
|
|
8005d12: e0cd b.n 8005eb0 <mem_malloc+0x1dc>
|
|
#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
|
|
|
|
/* Scan through the heap searching for a free block that is big enough,
|
|
* beginning with the lowest free block.
|
|
*/
|
|
for (ptr = mem_to_ptr(lfree); ptr < MEM_SIZE_ALIGNED - size;
|
|
8005d14: 4b68 ldr r3, [pc, #416] ; (8005eb8 <mem_malloc+0x1e4>)
|
|
8005d16: 681b ldr r3, [r3, #0]
|
|
8005d18: 4618 mov r0, r3
|
|
8005d1a: f7ff fd29 bl 8005770 <mem_to_ptr>
|
|
8005d1e: 4603 mov r3, r0
|
|
8005d20: 83fb strh r3, [r7, #30]
|
|
8005d22: e0b6 b.n 8005e92 <mem_malloc+0x1be>
|
|
ptr = ptr_to_mem(ptr)->next) {
|
|
mem = ptr_to_mem(ptr);
|
|
8005d24: 8bfb ldrh r3, [r7, #30]
|
|
8005d26: 4618 mov r0, r3
|
|
8005d28: f7ff fd10 bl 800574c <ptr_to_mem>
|
|
8005d2c: 6178 str r0, [r7, #20]
|
|
local_mem_free_count = 1;
|
|
break;
|
|
}
|
|
#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
|
|
|
|
if ((!mem->used) &&
|
|
8005d2e: 697b ldr r3, [r7, #20]
|
|
8005d30: 791b ldrb r3, [r3, #4]
|
|
8005d32: 2b00 cmp r3, #0
|
|
8005d34: f040 80a6 bne.w 8005e84 <mem_malloc+0x1b0>
|
|
(mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
|
|
8005d38: 697b ldr r3, [r7, #20]
|
|
8005d3a: 881b ldrh r3, [r3, #0]
|
|
8005d3c: 461a mov r2, r3
|
|
8005d3e: 8bfb ldrh r3, [r7, #30]
|
|
8005d40: 1ad3 subs r3, r2, r3
|
|
8005d42: f1a3 0208 sub.w r2, r3, #8
|
|
8005d46: 8bbb ldrh r3, [r7, #28]
|
|
if ((!mem->used) &&
|
|
8005d48: 429a cmp r2, r3
|
|
8005d4a: f0c0 809b bcc.w 8005e84 <mem_malloc+0x1b0>
|
|
/* mem is not used and at least perfect fit is possible:
|
|
* mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */
|
|
|
|
if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) {
|
|
8005d4e: 697b ldr r3, [r7, #20]
|
|
8005d50: 881b ldrh r3, [r3, #0]
|
|
8005d52: 461a mov r2, r3
|
|
8005d54: 8bfb ldrh r3, [r7, #30]
|
|
8005d56: 1ad3 subs r3, r2, r3
|
|
8005d58: f1a3 0208 sub.w r2, r3, #8
|
|
8005d5c: 8bbb ldrh r3, [r7, #28]
|
|
8005d5e: 3314 adds r3, #20
|
|
8005d60: 429a cmp r2, r3
|
|
8005d62: d335 bcc.n 8005dd0 <mem_malloc+0xfc>
|
|
* struct mem would fit in but no data between mem2 and mem2->next
|
|
* @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
|
|
* region that couldn't hold data, but when mem->next gets freed,
|
|
* the 2 regions would be combined, resulting in more free memory
|
|
*/
|
|
ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + size);
|
|
8005d64: 8bfa ldrh r2, [r7, #30]
|
|
8005d66: 8bbb ldrh r3, [r7, #28]
|
|
8005d68: 4413 add r3, r2
|
|
8005d6a: b29b uxth r3, r3
|
|
8005d6c: 3308 adds r3, #8
|
|
8005d6e: 827b strh r3, [r7, #18]
|
|
LWIP_ASSERT("invalid next ptr",ptr2 != MEM_SIZE_ALIGNED);
|
|
8005d70: 8a7b ldrh r3, [r7, #18]
|
|
8005d72: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005d76: 4293 cmp r3, r2
|
|
8005d78: d106 bne.n 8005d88 <mem_malloc+0xb4>
|
|
8005d7a: 4b50 ldr r3, [pc, #320] ; (8005ebc <mem_malloc+0x1e8>)
|
|
8005d7c: f240 3287 movw r2, #903 ; 0x387
|
|
8005d80: 494f ldr r1, [pc, #316] ; (8005ec0 <mem_malloc+0x1ec>)
|
|
8005d82: 4850 ldr r0, [pc, #320] ; (8005ec4 <mem_malloc+0x1f0>)
|
|
8005d84: f00a ff20 bl 8010bc8 <iprintf>
|
|
/* create mem2 struct */
|
|
mem2 = ptr_to_mem(ptr2);
|
|
8005d88: 8a7b ldrh r3, [r7, #18]
|
|
8005d8a: 4618 mov r0, r3
|
|
8005d8c: f7ff fcde bl 800574c <ptr_to_mem>
|
|
8005d90: 60f8 str r0, [r7, #12]
|
|
mem2->used = 0;
|
|
8005d92: 68fb ldr r3, [r7, #12]
|
|
8005d94: 2200 movs r2, #0
|
|
8005d96: 711a strb r2, [r3, #4]
|
|
mem2->next = mem->next;
|
|
8005d98: 697b ldr r3, [r7, #20]
|
|
8005d9a: 881a ldrh r2, [r3, #0]
|
|
8005d9c: 68fb ldr r3, [r7, #12]
|
|
8005d9e: 801a strh r2, [r3, #0]
|
|
mem2->prev = ptr;
|
|
8005da0: 68fb ldr r3, [r7, #12]
|
|
8005da2: 8bfa ldrh r2, [r7, #30]
|
|
8005da4: 805a strh r2, [r3, #2]
|
|
/* and insert it between mem and mem->next */
|
|
mem->next = ptr2;
|
|
8005da6: 697b ldr r3, [r7, #20]
|
|
8005da8: 8a7a ldrh r2, [r7, #18]
|
|
8005daa: 801a strh r2, [r3, #0]
|
|
mem->used = 1;
|
|
8005dac: 697b ldr r3, [r7, #20]
|
|
8005dae: 2201 movs r2, #1
|
|
8005db0: 711a strb r2, [r3, #4]
|
|
|
|
if (mem2->next != MEM_SIZE_ALIGNED) {
|
|
8005db2: 68fb ldr r3, [r7, #12]
|
|
8005db4: 881b ldrh r3, [r3, #0]
|
|
8005db6: f647 52e8 movw r2, #32232 ; 0x7de8
|
|
8005dba: 4293 cmp r3, r2
|
|
8005dbc: d00b beq.n 8005dd6 <mem_malloc+0x102>
|
|
ptr_to_mem(mem2->next)->prev = ptr2;
|
|
8005dbe: 68fb ldr r3, [r7, #12]
|
|
8005dc0: 881b ldrh r3, [r3, #0]
|
|
8005dc2: 4618 mov r0, r3
|
|
8005dc4: f7ff fcc2 bl 800574c <ptr_to_mem>
|
|
8005dc8: 4602 mov r2, r0
|
|
8005dca: 8a7b ldrh r3, [r7, #18]
|
|
8005dcc: 8053 strh r3, [r2, #2]
|
|
8005dce: e002 b.n 8005dd6 <mem_malloc+0x102>
|
|
* take care of this).
|
|
* -> near fit or exact fit: do not split, no mem2 creation
|
|
* also can't move mem->next directly behind mem, since mem->next
|
|
* will always be used at this point!
|
|
*/
|
|
mem->used = 1;
|
|
8005dd0: 697b ldr r3, [r7, #20]
|
|
8005dd2: 2201 movs r2, #1
|
|
8005dd4: 711a strb r2, [r3, #4]
|
|
MEM_STATS_INC_USED(used, mem->next - mem_to_ptr(mem));
|
|
}
|
|
#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
|
|
mem_malloc_adjust_lfree:
|
|
#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
|
|
if (mem == lfree) {
|
|
8005dd6: 4b38 ldr r3, [pc, #224] ; (8005eb8 <mem_malloc+0x1e4>)
|
|
8005dd8: 681b ldr r3, [r3, #0]
|
|
8005dda: 697a ldr r2, [r7, #20]
|
|
8005ddc: 429a cmp r2, r3
|
|
8005dde: d127 bne.n 8005e30 <mem_malloc+0x15c>
|
|
struct mem *cur = lfree;
|
|
8005de0: 4b35 ldr r3, [pc, #212] ; (8005eb8 <mem_malloc+0x1e4>)
|
|
8005de2: 681b ldr r3, [r3, #0]
|
|
8005de4: 61bb str r3, [r7, #24]
|
|
/* Find next free block after mem and update lowest free pointer */
|
|
while (cur->used && cur != ram_end) {
|
|
8005de6: e005 b.n 8005df4 <mem_malloc+0x120>
|
|
/* If mem_free or mem_trim have run, we have to restart since they
|
|
could have altered our current struct mem or lfree. */
|
|
goto mem_malloc_adjust_lfree;
|
|
}
|
|
#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
|
|
cur = ptr_to_mem(cur->next);
|
|
8005de8: 69bb ldr r3, [r7, #24]
|
|
8005dea: 881b ldrh r3, [r3, #0]
|
|
8005dec: 4618 mov r0, r3
|
|
8005dee: f7ff fcad bl 800574c <ptr_to_mem>
|
|
8005df2: 61b8 str r0, [r7, #24]
|
|
while (cur->used && cur != ram_end) {
|
|
8005df4: 69bb ldr r3, [r7, #24]
|
|
8005df6: 791b ldrb r3, [r3, #4]
|
|
8005df8: 2b00 cmp r3, #0
|
|
8005dfa: d004 beq.n 8005e06 <mem_malloc+0x132>
|
|
8005dfc: 4b32 ldr r3, [pc, #200] ; (8005ec8 <mem_malloc+0x1f4>)
|
|
8005dfe: 681b ldr r3, [r3, #0]
|
|
8005e00: 69ba ldr r2, [r7, #24]
|
|
8005e02: 429a cmp r2, r3
|
|
8005e04: d1f0 bne.n 8005de8 <mem_malloc+0x114>
|
|
}
|
|
lfree = cur;
|
|
8005e06: 4a2c ldr r2, [pc, #176] ; (8005eb8 <mem_malloc+0x1e4>)
|
|
8005e08: 69bb ldr r3, [r7, #24]
|
|
8005e0a: 6013 str r3, [r2, #0]
|
|
LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used)));
|
|
8005e0c: 4b2a ldr r3, [pc, #168] ; (8005eb8 <mem_malloc+0x1e4>)
|
|
8005e0e: 681a ldr r2, [r3, #0]
|
|
8005e10: 4b2d ldr r3, [pc, #180] ; (8005ec8 <mem_malloc+0x1f4>)
|
|
8005e12: 681b ldr r3, [r3, #0]
|
|
8005e14: 429a cmp r2, r3
|
|
8005e16: d00b beq.n 8005e30 <mem_malloc+0x15c>
|
|
8005e18: 4b27 ldr r3, [pc, #156] ; (8005eb8 <mem_malloc+0x1e4>)
|
|
8005e1a: 681b ldr r3, [r3, #0]
|
|
8005e1c: 791b ldrb r3, [r3, #4]
|
|
8005e1e: 2b00 cmp r3, #0
|
|
8005e20: d006 beq.n 8005e30 <mem_malloc+0x15c>
|
|
8005e22: 4b26 ldr r3, [pc, #152] ; (8005ebc <mem_malloc+0x1e8>)
|
|
8005e24: f240 32b5 movw r2, #949 ; 0x3b5
|
|
8005e28: 4928 ldr r1, [pc, #160] ; (8005ecc <mem_malloc+0x1f8>)
|
|
8005e2a: 4826 ldr r0, [pc, #152] ; (8005ec4 <mem_malloc+0x1f0>)
|
|
8005e2c: f00a fecc bl 8010bc8 <iprintf>
|
|
}
|
|
LWIP_MEM_ALLOC_UNPROTECT();
|
|
sys_mutex_unlock(&mem_mutex);
|
|
LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.",
|
|
8005e30: 8bba ldrh r2, [r7, #28]
|
|
8005e32: 697b ldr r3, [r7, #20]
|
|
8005e34: 4413 add r3, r2
|
|
8005e36: 3308 adds r3, #8
|
|
8005e38: 4a23 ldr r2, [pc, #140] ; (8005ec8 <mem_malloc+0x1f4>)
|
|
8005e3a: 6812 ldr r2, [r2, #0]
|
|
8005e3c: 4293 cmp r3, r2
|
|
8005e3e: d906 bls.n 8005e4e <mem_malloc+0x17a>
|
|
8005e40: 4b1e ldr r3, [pc, #120] ; (8005ebc <mem_malloc+0x1e8>)
|
|
8005e42: f240 32b9 movw r2, #953 ; 0x3b9
|
|
8005e46: 4922 ldr r1, [pc, #136] ; (8005ed0 <mem_malloc+0x1fc>)
|
|
8005e48: 481e ldr r0, [pc, #120] ; (8005ec4 <mem_malloc+0x1f0>)
|
|
8005e4a: f00a febd bl 8010bc8 <iprintf>
|
|
(mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);
|
|
LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
|
|
8005e4e: 697b ldr r3, [r7, #20]
|
|
8005e50: f003 0303 and.w r3, r3, #3
|
|
8005e54: 2b00 cmp r3, #0
|
|
8005e56: d006 beq.n 8005e66 <mem_malloc+0x192>
|
|
8005e58: 4b18 ldr r3, [pc, #96] ; (8005ebc <mem_malloc+0x1e8>)
|
|
8005e5a: f240 32bb movw r2, #955 ; 0x3bb
|
|
8005e5e: 491d ldr r1, [pc, #116] ; (8005ed4 <mem_malloc+0x200>)
|
|
8005e60: 4818 ldr r0, [pc, #96] ; (8005ec4 <mem_malloc+0x1f0>)
|
|
8005e62: f00a feb1 bl 8010bc8 <iprintf>
|
|
((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
|
|
LWIP_ASSERT("mem_malloc: sanity check alignment",
|
|
8005e66: 697b ldr r3, [r7, #20]
|
|
8005e68: f003 0303 and.w r3, r3, #3
|
|
8005e6c: 2b00 cmp r3, #0
|
|
8005e6e: d006 beq.n 8005e7e <mem_malloc+0x1aa>
|
|
8005e70: 4b12 ldr r3, [pc, #72] ; (8005ebc <mem_malloc+0x1e8>)
|
|
8005e72: f240 32bd movw r2, #957 ; 0x3bd
|
|
8005e76: 4918 ldr r1, [pc, #96] ; (8005ed8 <mem_malloc+0x204>)
|
|
8005e78: 4812 ldr r0, [pc, #72] ; (8005ec4 <mem_malloc+0x1f0>)
|
|
8005e7a: f00a fea5 bl 8010bc8 <iprintf>
|
|
|
|
#if MEM_OVERFLOW_CHECK
|
|
mem_overflow_init_element(mem, size_in);
|
|
#endif
|
|
MEM_SANITY();
|
|
return (u8_t *)mem + SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET;
|
|
8005e7e: 697b ldr r3, [r7, #20]
|
|
8005e80: 3308 adds r3, #8
|
|
8005e82: e015 b.n 8005eb0 <mem_malloc+0x1dc>
|
|
ptr = ptr_to_mem(ptr)->next) {
|
|
8005e84: 8bfb ldrh r3, [r7, #30]
|
|
8005e86: 4618 mov r0, r3
|
|
8005e88: f7ff fc60 bl 800574c <ptr_to_mem>
|
|
8005e8c: 4603 mov r3, r0
|
|
8005e8e: 881b ldrh r3, [r3, #0]
|
|
8005e90: 83fb strh r3, [r7, #30]
|
|
for (ptr = mem_to_ptr(lfree); ptr < MEM_SIZE_ALIGNED - size;
|
|
8005e92: 8bfa ldrh r2, [r7, #30]
|
|
8005e94: 8bb9 ldrh r1, [r7, #28]
|
|
8005e96: f647 53e8 movw r3, #32232 ; 0x7de8
|
|
8005e9a: 1a5b subs r3, r3, r1
|
|
8005e9c: 429a cmp r2, r3
|
|
8005e9e: f4ff af41 bcc.w 8005d24 <mem_malloc+0x50>
|
|
} while (local_mem_free_count != 0);
|
|
#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
|
|
MEM_STATS_INC(err);
|
|
LWIP_MEM_ALLOC_UNPROTECT();
|
|
sys_mutex_unlock(&mem_mutex);
|
|
LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
|
|
8005ea2: f9b7 301c ldrsh.w r3, [r7, #28]
|
|
8005ea6: 4619 mov r1, r3
|
|
8005ea8: 480c ldr r0, [pc, #48] ; (8005edc <mem_malloc+0x208>)
|
|
8005eaa: f00a fe8d bl 8010bc8 <iprintf>
|
|
return NULL;
|
|
8005eae: 2300 movs r3, #0
|
|
}
|
|
8005eb0: 4618 mov r0, r3
|
|
8005eb2: 3720 adds r7, #32
|
|
8005eb4: 46bd mov sp, r7
|
|
8005eb6: bd80 pop {r7, pc}
|
|
8005eb8: 24004c30 .word 0x24004c30
|
|
8005ebc: 08011ca0 .word 0x08011ca0
|
|
8005ec0: 08011ee0 .word 0x08011ee0
|
|
8005ec4: 08011ce8 .word 0x08011ce8
|
|
8005ec8: 24004c2c .word 0x24004c2c
|
|
8005ecc: 08011ef4 .word 0x08011ef4
|
|
8005ed0: 08011f10 .word 0x08011f10
|
|
8005ed4: 08011f40 .word 0x08011f40
|
|
8005ed8: 08011f70 .word 0x08011f70
|
|
8005edc: 08011f94 .word 0x08011f94
|
|
|
|
08005ee0 <memp_init_pool>:
|
|
*
|
|
* @param desc pool to initialize
|
|
*/
|
|
void
|
|
memp_init_pool(const struct memp_desc *desc)
|
|
{
|
|
8005ee0: b480 push {r7}
|
|
8005ee2: b085 sub sp, #20
|
|
8005ee4: af00 add r7, sp, #0
|
|
8005ee6: 6078 str r0, [r7, #4]
|
|
LWIP_UNUSED_ARG(desc);
|
|
#else
|
|
int i;
|
|
struct memp *memp;
|
|
|
|
*desc->tab = NULL;
|
|
8005ee8: 687b ldr r3, [r7, #4]
|
|
8005eea: 68db ldr r3, [r3, #12]
|
|
8005eec: 2200 movs r2, #0
|
|
8005eee: 601a str r2, [r3, #0]
|
|
memp = (struct memp *)LWIP_MEM_ALIGN(desc->base);
|
|
8005ef0: 687b ldr r3, [r7, #4]
|
|
8005ef2: 689b ldr r3, [r3, #8]
|
|
8005ef4: 3303 adds r3, #3
|
|
8005ef6: f023 0303 bic.w r3, r3, #3
|
|
8005efa: 60bb str r3, [r7, #8]
|
|
+ MEM_SANITY_REGION_AFTER_ALIGNED
|
|
#endif
|
|
));
|
|
#endif
|
|
/* create a linked list of memp elements */
|
|
for (i = 0; i < desc->num; ++i) {
|
|
8005efc: 2300 movs r3, #0
|
|
8005efe: 60fb str r3, [r7, #12]
|
|
8005f00: e011 b.n 8005f26 <memp_init_pool+0x46>
|
|
memp->next = *desc->tab;
|
|
8005f02: 687b ldr r3, [r7, #4]
|
|
8005f04: 68db ldr r3, [r3, #12]
|
|
8005f06: 681a ldr r2, [r3, #0]
|
|
8005f08: 68bb ldr r3, [r7, #8]
|
|
8005f0a: 601a str r2, [r3, #0]
|
|
*desc->tab = memp;
|
|
8005f0c: 687b ldr r3, [r7, #4]
|
|
8005f0e: 68db ldr r3, [r3, #12]
|
|
8005f10: 68ba ldr r2, [r7, #8]
|
|
8005f12: 601a str r2, [r3, #0]
|
|
#if MEMP_OVERFLOW_CHECK
|
|
memp_overflow_init_element(memp, desc);
|
|
#endif /* MEMP_OVERFLOW_CHECK */
|
|
/* cast through void* to get rid of alignment warnings */
|
|
memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size
|
|
8005f14: 687b ldr r3, [r7, #4]
|
|
8005f16: 889b ldrh r3, [r3, #4]
|
|
8005f18: 461a mov r2, r3
|
|
8005f1a: 68bb ldr r3, [r7, #8]
|
|
8005f1c: 4413 add r3, r2
|
|
8005f1e: 60bb str r3, [r7, #8]
|
|
for (i = 0; i < desc->num; ++i) {
|
|
8005f20: 68fb ldr r3, [r7, #12]
|
|
8005f22: 3301 adds r3, #1
|
|
8005f24: 60fb str r3, [r7, #12]
|
|
8005f26: 687b ldr r3, [r7, #4]
|
|
8005f28: 88db ldrh r3, [r3, #6]
|
|
8005f2a: 461a mov r2, r3
|
|
8005f2c: 68fb ldr r3, [r7, #12]
|
|
8005f2e: 4293 cmp r3, r2
|
|
8005f30: dbe7 blt.n 8005f02 <memp_init_pool+0x22>
|
|
#endif /* !MEMP_MEM_MALLOC */
|
|
|
|
#if MEMP_STATS && (defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY)
|
|
desc->stats->name = desc->desc;
|
|
#endif /* MEMP_STATS && (defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY) */
|
|
}
|
|
8005f32: bf00 nop
|
|
8005f34: bf00 nop
|
|
8005f36: 3714 adds r7, #20
|
|
8005f38: 46bd mov sp, r7
|
|
8005f3a: f85d 7b04 ldr.w r7, [sp], #4
|
|
8005f3e: 4770 bx lr
|
|
|
|
08005f40 <memp_init>:
|
|
*
|
|
* Carves out memp_memory into linked lists for each pool-type.
|
|
*/
|
|
void
|
|
memp_init(void)
|
|
{
|
|
8005f40: b580 push {r7, lr}
|
|
8005f42: b082 sub sp, #8
|
|
8005f44: af00 add r7, sp, #0
|
|
u16_t i;
|
|
|
|
/* for every pool: */
|
|
for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) {
|
|
8005f46: 2300 movs r3, #0
|
|
8005f48: 80fb strh r3, [r7, #6]
|
|
8005f4a: e009 b.n 8005f60 <memp_init+0x20>
|
|
memp_init_pool(memp_pools[i]);
|
|
8005f4c: 88fb ldrh r3, [r7, #6]
|
|
8005f4e: 4a08 ldr r2, [pc, #32] ; (8005f70 <memp_init+0x30>)
|
|
8005f50: f852 3023 ldr.w r3, [r2, r3, lsl #2]
|
|
8005f54: 4618 mov r0, r3
|
|
8005f56: f7ff ffc3 bl 8005ee0 <memp_init_pool>
|
|
for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) {
|
|
8005f5a: 88fb ldrh r3, [r7, #6]
|
|
8005f5c: 3301 adds r3, #1
|
|
8005f5e: 80fb strh r3, [r7, #6]
|
|
8005f60: 88fb ldrh r3, [r7, #6]
|
|
8005f62: 2b08 cmp r3, #8
|
|
8005f64: d9f2 bls.n 8005f4c <memp_init+0xc>
|
|
|
|
#if MEMP_OVERFLOW_CHECK >= 2
|
|
/* check everything a first time to see if it worked */
|
|
memp_overflow_check_all();
|
|
#endif /* MEMP_OVERFLOW_CHECK >= 2 */
|
|
}
|
|
8005f66: bf00 nop
|
|
8005f68: bf00 nop
|
|
8005f6a: 3708 adds r7, #8
|
|
8005f6c: 46bd mov sp, r7
|
|
8005f6e: bd80 pop {r7, pc}
|
|
8005f70: 08014d30 .word 0x08014d30
|
|
|
|
08005f74 <do_memp_malloc_pool>:
|
|
#if !MEMP_OVERFLOW_CHECK
|
|
do_memp_malloc_pool(const struct memp_desc *desc)
|
|
#else
|
|
do_memp_malloc_pool_fn(const struct memp_desc *desc, const char *file, const int line)
|
|
#endif
|
|
{
|
|
8005f74: b580 push {r7, lr}
|
|
8005f76: b084 sub sp, #16
|
|
8005f78: af00 add r7, sp, #0
|
|
8005f7a: 6078 str r0, [r7, #4]
|
|
memp = (struct memp *)mem_malloc(MEMP_SIZE + MEMP_ALIGN_SIZE(desc->size));
|
|
SYS_ARCH_PROTECT(old_level);
|
|
#else /* MEMP_MEM_MALLOC */
|
|
SYS_ARCH_PROTECT(old_level);
|
|
|
|
memp = *desc->tab;
|
|
8005f7c: 687b ldr r3, [r7, #4]
|
|
8005f7e: 68db ldr r3, [r3, #12]
|
|
8005f80: 681b ldr r3, [r3, #0]
|
|
8005f82: 60fb str r3, [r7, #12]
|
|
#endif /* MEMP_MEM_MALLOC */
|
|
|
|
if (memp != NULL) {
|
|
8005f84: 68fb ldr r3, [r7, #12]
|
|
8005f86: 2b00 cmp r3, #0
|
|
8005f88: d012 beq.n 8005fb0 <do_memp_malloc_pool+0x3c>
|
|
#if !MEMP_MEM_MALLOC
|
|
#if MEMP_OVERFLOW_CHECK == 1
|
|
memp_overflow_check_element(memp, desc);
|
|
#endif /* MEMP_OVERFLOW_CHECK */
|
|
|
|
*desc->tab = memp->next;
|
|
8005f8a: 687b ldr r3, [r7, #4]
|
|
8005f8c: 68db ldr r3, [r3, #12]
|
|
8005f8e: 68fa ldr r2, [r7, #12]
|
|
8005f90: 6812 ldr r2, [r2, #0]
|
|
8005f92: 601a str r2, [r3, #0]
|
|
memp->line = line;
|
|
#if MEMP_MEM_MALLOC
|
|
memp_overflow_init_element(memp, desc);
|
|
#endif /* MEMP_MEM_MALLOC */
|
|
#endif /* MEMP_OVERFLOW_CHECK */
|
|
LWIP_ASSERT("memp_malloc: memp properly aligned",
|
|
8005f94: 68fb ldr r3, [r7, #12]
|
|
8005f96: f003 0303 and.w r3, r3, #3
|
|
8005f9a: 2b00 cmp r3, #0
|
|
8005f9c: d006 beq.n 8005fac <do_memp_malloc_pool+0x38>
|
|
8005f9e: 4b0a ldr r3, [pc, #40] ; (8005fc8 <do_memp_malloc_pool+0x54>)
|
|
8005fa0: f44f 728c mov.w r2, #280 ; 0x118
|
|
8005fa4: 4909 ldr r1, [pc, #36] ; (8005fcc <do_memp_malloc_pool+0x58>)
|
|
8005fa6: 480a ldr r0, [pc, #40] ; (8005fd0 <do_memp_malloc_pool+0x5c>)
|
|
8005fa8: f00a fe0e bl 8010bc8 <iprintf>
|
|
desc->stats->max = desc->stats->used;
|
|
}
|
|
#endif
|
|
SYS_ARCH_UNPROTECT(old_level);
|
|
/* cast through u8_t* to get rid of alignment warnings */
|
|
return ((u8_t *)memp + MEMP_SIZE);
|
|
8005fac: 68fb ldr r3, [r7, #12]
|
|
8005fae: e006 b.n 8005fbe <do_memp_malloc_pool+0x4a>
|
|
} else {
|
|
#if MEMP_STATS
|
|
desc->stats->err++;
|
|
#endif
|
|
SYS_ARCH_UNPROTECT(old_level);
|
|
LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", desc->desc));
|
|
8005fb0: 687b ldr r3, [r7, #4]
|
|
8005fb2: 681b ldr r3, [r3, #0]
|
|
8005fb4: 4619 mov r1, r3
|
|
8005fb6: 4807 ldr r0, [pc, #28] ; (8005fd4 <do_memp_malloc_pool+0x60>)
|
|
8005fb8: f00a fe06 bl 8010bc8 <iprintf>
|
|
}
|
|
|
|
return NULL;
|
|
8005fbc: 2300 movs r3, #0
|
|
}
|
|
8005fbe: 4618 mov r0, r3
|
|
8005fc0: 3710 adds r7, #16
|
|
8005fc2: 46bd mov sp, r7
|
|
8005fc4: bd80 pop {r7, pc}
|
|
8005fc6: bf00 nop
|
|
8005fc8: 08012054 .word 0x08012054
|
|
8005fcc: 08012084 .word 0x08012084
|
|
8005fd0: 080120a8 .word 0x080120a8
|
|
8005fd4: 080120d0 .word 0x080120d0
|
|
|
|
08005fd8 <memp_malloc_pool>:
|
|
#if !MEMP_OVERFLOW_CHECK
|
|
memp_malloc_pool(const struct memp_desc *desc)
|
|
#else
|
|
memp_malloc_pool_fn(const struct memp_desc *desc, const char *file, const int line)
|
|
#endif
|
|
{
|
|
8005fd8: b580 push {r7, lr}
|
|
8005fda: b082 sub sp, #8
|
|
8005fdc: af00 add r7, sp, #0
|
|
8005fde: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("invalid pool desc", desc != NULL);
|
|
8005fe0: 687b ldr r3, [r7, #4]
|
|
8005fe2: 2b00 cmp r3, #0
|
|
8005fe4: d106 bne.n 8005ff4 <memp_malloc_pool+0x1c>
|
|
8005fe6: 4b0a ldr r3, [pc, #40] ; (8006010 <memp_malloc_pool+0x38>)
|
|
8005fe8: f44f 729e mov.w r2, #316 ; 0x13c
|
|
8005fec: 4909 ldr r1, [pc, #36] ; (8006014 <memp_malloc_pool+0x3c>)
|
|
8005fee: 480a ldr r0, [pc, #40] ; (8006018 <memp_malloc_pool+0x40>)
|
|
8005ff0: f00a fdea bl 8010bc8 <iprintf>
|
|
if (desc == NULL) {
|
|
8005ff4: 687b ldr r3, [r7, #4]
|
|
8005ff6: 2b00 cmp r3, #0
|
|
8005ff8: d101 bne.n 8005ffe <memp_malloc_pool+0x26>
|
|
return NULL;
|
|
8005ffa: 2300 movs r3, #0
|
|
8005ffc: e003 b.n 8006006 <memp_malloc_pool+0x2e>
|
|
}
|
|
|
|
#if !MEMP_OVERFLOW_CHECK
|
|
return do_memp_malloc_pool(desc);
|
|
8005ffe: 6878 ldr r0, [r7, #4]
|
|
8006000: f7ff ffb8 bl 8005f74 <do_memp_malloc_pool>
|
|
8006004: 4603 mov r3, r0
|
|
#else
|
|
return do_memp_malloc_pool_fn(desc, file, line);
|
|
#endif
|
|
}
|
|
8006006: 4618 mov r0, r3
|
|
8006008: 3708 adds r7, #8
|
|
800600a: 46bd mov sp, r7
|
|
800600c: bd80 pop {r7, pc}
|
|
800600e: bf00 nop
|
|
8006010: 08012054 .word 0x08012054
|
|
8006014: 080120f8 .word 0x080120f8
|
|
8006018: 080120a8 .word 0x080120a8
|
|
|
|
0800601c <memp_malloc>:
|
|
#if !MEMP_OVERFLOW_CHECK
|
|
memp_malloc(memp_t type)
|
|
#else
|
|
memp_malloc_fn(memp_t type, const char *file, const int line)
|
|
#endif
|
|
{
|
|
800601c: b580 push {r7, lr}
|
|
800601e: b084 sub sp, #16
|
|
8006020: af00 add r7, sp, #0
|
|
8006022: 4603 mov r3, r0
|
|
8006024: 71fb strb r3, [r7, #7]
|
|
void *memp;
|
|
LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
|
|
8006026: 79fb ldrb r3, [r7, #7]
|
|
8006028: 2b08 cmp r3, #8
|
|
800602a: d908 bls.n 800603e <memp_malloc+0x22>
|
|
800602c: 4b0a ldr r3, [pc, #40] ; (8006058 <memp_malloc+0x3c>)
|
|
800602e: f240 1257 movw r2, #343 ; 0x157
|
|
8006032: 490a ldr r1, [pc, #40] ; (800605c <memp_malloc+0x40>)
|
|
8006034: 480a ldr r0, [pc, #40] ; (8006060 <memp_malloc+0x44>)
|
|
8006036: f00a fdc7 bl 8010bc8 <iprintf>
|
|
800603a: 2300 movs r3, #0
|
|
800603c: e008 b.n 8006050 <memp_malloc+0x34>
|
|
#if MEMP_OVERFLOW_CHECK >= 2
|
|
memp_overflow_check_all();
|
|
#endif /* MEMP_OVERFLOW_CHECK >= 2 */
|
|
|
|
#if !MEMP_OVERFLOW_CHECK
|
|
memp = do_memp_malloc_pool(memp_pools[type]);
|
|
800603e: 79fb ldrb r3, [r7, #7]
|
|
8006040: 4a08 ldr r2, [pc, #32] ; (8006064 <memp_malloc+0x48>)
|
|
8006042: f852 3023 ldr.w r3, [r2, r3, lsl #2]
|
|
8006046: 4618 mov r0, r3
|
|
8006048: f7ff ff94 bl 8005f74 <do_memp_malloc_pool>
|
|
800604c: 60f8 str r0, [r7, #12]
|
|
#else
|
|
memp = do_memp_malloc_pool_fn(memp_pools[type], file, line);
|
|
#endif
|
|
|
|
return memp;
|
|
800604e: 68fb ldr r3, [r7, #12]
|
|
}
|
|
8006050: 4618 mov r0, r3
|
|
8006052: 3710 adds r7, #16
|
|
8006054: 46bd mov sp, r7
|
|
8006056: bd80 pop {r7, pc}
|
|
8006058: 08012054 .word 0x08012054
|
|
800605c: 0801210c .word 0x0801210c
|
|
8006060: 080120a8 .word 0x080120a8
|
|
8006064: 08014d30 .word 0x08014d30
|
|
|
|
08006068 <do_memp_free_pool>:
|
|
|
|
static void
|
|
do_memp_free_pool(const struct memp_desc *desc, void *mem)
|
|
{
|
|
8006068: b580 push {r7, lr}
|
|
800606a: b084 sub sp, #16
|
|
800606c: af00 add r7, sp, #0
|
|
800606e: 6078 str r0, [r7, #4]
|
|
8006070: 6039 str r1, [r7, #0]
|
|
struct memp *memp;
|
|
SYS_ARCH_DECL_PROTECT(old_level);
|
|
|
|
LWIP_ASSERT("memp_free: mem properly aligned",
|
|
8006072: 683b ldr r3, [r7, #0]
|
|
8006074: f003 0303 and.w r3, r3, #3
|
|
8006078: 2b00 cmp r3, #0
|
|
800607a: d006 beq.n 800608a <do_memp_free_pool+0x22>
|
|
800607c: 4b0a ldr r3, [pc, #40] ; (80060a8 <do_memp_free_pool+0x40>)
|
|
800607e: f44f 72b6 mov.w r2, #364 ; 0x16c
|
|
8006082: 490a ldr r1, [pc, #40] ; (80060ac <do_memp_free_pool+0x44>)
|
|
8006084: 480a ldr r0, [pc, #40] ; (80060b0 <do_memp_free_pool+0x48>)
|
|
8006086: f00a fd9f bl 8010bc8 <iprintf>
|
|
((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);
|
|
|
|
/* cast through void* to get rid of alignment warnings */
|
|
memp = (struct memp *)(void *)((u8_t *)mem - MEMP_SIZE);
|
|
800608a: 683b ldr r3, [r7, #0]
|
|
800608c: 60fb str r3, [r7, #12]
|
|
#if MEMP_MEM_MALLOC
|
|
LWIP_UNUSED_ARG(desc);
|
|
SYS_ARCH_UNPROTECT(old_level);
|
|
mem_free(memp);
|
|
#else /* MEMP_MEM_MALLOC */
|
|
memp->next = *desc->tab;
|
|
800608e: 687b ldr r3, [r7, #4]
|
|
8006090: 68db ldr r3, [r3, #12]
|
|
8006092: 681a ldr r2, [r3, #0]
|
|
8006094: 68fb ldr r3, [r7, #12]
|
|
8006096: 601a str r2, [r3, #0]
|
|
*desc->tab = memp;
|
|
8006098: 687b ldr r3, [r7, #4]
|
|
800609a: 68db ldr r3, [r3, #12]
|
|
800609c: 68fa ldr r2, [r7, #12]
|
|
800609e: 601a str r2, [r3, #0]
|
|
LWIP_ASSERT("memp sanity", memp_sanity(desc));
|
|
#endif /* MEMP_SANITY_CHECK */
|
|
|
|
SYS_ARCH_UNPROTECT(old_level);
|
|
#endif /* !MEMP_MEM_MALLOC */
|
|
}
|
|
80060a0: bf00 nop
|
|
80060a2: 3710 adds r7, #16
|
|
80060a4: 46bd mov sp, r7
|
|
80060a6: bd80 pop {r7, pc}
|
|
80060a8: 08012054 .word 0x08012054
|
|
80060ac: 0801212c .word 0x0801212c
|
|
80060b0: 080120a8 .word 0x080120a8
|
|
|
|
080060b4 <memp_free_pool>:
|
|
* @param desc the pool where to put mem
|
|
* @param mem the memp element to free
|
|
*/
|
|
void
|
|
memp_free_pool(const struct memp_desc *desc, void *mem)
|
|
{
|
|
80060b4: b580 push {r7, lr}
|
|
80060b6: b082 sub sp, #8
|
|
80060b8: af00 add r7, sp, #0
|
|
80060ba: 6078 str r0, [r7, #4]
|
|
80060bc: 6039 str r1, [r7, #0]
|
|
LWIP_ASSERT("invalid pool desc", desc != NULL);
|
|
80060be: 687b ldr r3, [r7, #4]
|
|
80060c0: 2b00 cmp r3, #0
|
|
80060c2: d106 bne.n 80060d2 <memp_free_pool+0x1e>
|
|
80060c4: 4b0a ldr r3, [pc, #40] ; (80060f0 <memp_free_pool+0x3c>)
|
|
80060c6: f240 1295 movw r2, #405 ; 0x195
|
|
80060ca: 490a ldr r1, [pc, #40] ; (80060f4 <memp_free_pool+0x40>)
|
|
80060cc: 480a ldr r0, [pc, #40] ; (80060f8 <memp_free_pool+0x44>)
|
|
80060ce: f00a fd7b bl 8010bc8 <iprintf>
|
|
if ((desc == NULL) || (mem == NULL)) {
|
|
80060d2: 687b ldr r3, [r7, #4]
|
|
80060d4: 2b00 cmp r3, #0
|
|
80060d6: d007 beq.n 80060e8 <memp_free_pool+0x34>
|
|
80060d8: 683b ldr r3, [r7, #0]
|
|
80060da: 2b00 cmp r3, #0
|
|
80060dc: d004 beq.n 80060e8 <memp_free_pool+0x34>
|
|
return;
|
|
}
|
|
|
|
do_memp_free_pool(desc, mem);
|
|
80060de: 6839 ldr r1, [r7, #0]
|
|
80060e0: 6878 ldr r0, [r7, #4]
|
|
80060e2: f7ff ffc1 bl 8006068 <do_memp_free_pool>
|
|
80060e6: e000 b.n 80060ea <memp_free_pool+0x36>
|
|
return;
|
|
80060e8: bf00 nop
|
|
}
|
|
80060ea: 3708 adds r7, #8
|
|
80060ec: 46bd mov sp, r7
|
|
80060ee: bd80 pop {r7, pc}
|
|
80060f0: 08012054 .word 0x08012054
|
|
80060f4: 080120f8 .word 0x080120f8
|
|
80060f8: 080120a8 .word 0x080120a8
|
|
|
|
080060fc <memp_free>:
|
|
* @param type the pool where to put mem
|
|
* @param mem the memp element to free
|
|
*/
|
|
void
|
|
memp_free(memp_t type, void *mem)
|
|
{
|
|
80060fc: b580 push {r7, lr}
|
|
80060fe: b082 sub sp, #8
|
|
8006100: af00 add r7, sp, #0
|
|
8006102: 4603 mov r3, r0
|
|
8006104: 6039 str r1, [r7, #0]
|
|
8006106: 71fb strb r3, [r7, #7]
|
|
#ifdef LWIP_HOOK_MEMP_AVAILABLE
|
|
struct memp *old_first;
|
|
#endif
|
|
|
|
LWIP_ERROR("memp_free: type < MEMP_MAX", (type < MEMP_MAX), return;);
|
|
8006108: 79fb ldrb r3, [r7, #7]
|
|
800610a: 2b08 cmp r3, #8
|
|
800610c: d907 bls.n 800611e <memp_free+0x22>
|
|
800610e: 4b0c ldr r3, [pc, #48] ; (8006140 <memp_free+0x44>)
|
|
8006110: f44f 72d5 mov.w r2, #426 ; 0x1aa
|
|
8006114: 490b ldr r1, [pc, #44] ; (8006144 <memp_free+0x48>)
|
|
8006116: 480c ldr r0, [pc, #48] ; (8006148 <memp_free+0x4c>)
|
|
8006118: f00a fd56 bl 8010bc8 <iprintf>
|
|
800611c: e00c b.n 8006138 <memp_free+0x3c>
|
|
|
|
if (mem == NULL) {
|
|
800611e: 683b ldr r3, [r7, #0]
|
|
8006120: 2b00 cmp r3, #0
|
|
8006122: d008 beq.n 8006136 <memp_free+0x3a>
|
|
|
|
#ifdef LWIP_HOOK_MEMP_AVAILABLE
|
|
old_first = *memp_pools[type]->tab;
|
|
#endif
|
|
|
|
do_memp_free_pool(memp_pools[type], mem);
|
|
8006124: 79fb ldrb r3, [r7, #7]
|
|
8006126: 4a09 ldr r2, [pc, #36] ; (800614c <memp_free+0x50>)
|
|
8006128: f852 3023 ldr.w r3, [r2, r3, lsl #2]
|
|
800612c: 6839 ldr r1, [r7, #0]
|
|
800612e: 4618 mov r0, r3
|
|
8006130: f7ff ff9a bl 8006068 <do_memp_free_pool>
|
|
8006134: e000 b.n 8006138 <memp_free+0x3c>
|
|
return;
|
|
8006136: bf00 nop
|
|
#ifdef LWIP_HOOK_MEMP_AVAILABLE
|
|
if (old_first == NULL) {
|
|
LWIP_HOOK_MEMP_AVAILABLE(type);
|
|
}
|
|
#endif
|
|
}
|
|
8006138: 3708 adds r7, #8
|
|
800613a: 46bd mov sp, r7
|
|
800613c: bd80 pop {r7, pc}
|
|
800613e: bf00 nop
|
|
8006140: 08012054 .word 0x08012054
|
|
8006144: 0801214c .word 0x0801214c
|
|
8006148: 080120a8 .word 0x080120a8
|
|
800614c: 08014d30 .word 0x08014d30
|
|
|
|
08006150 <netif_init>:
|
|
}
|
|
#endif /* LWIP_HAVE_LOOPIF */
|
|
|
|
void
|
|
netif_init(void)
|
|
{
|
|
8006150: b480 push {r7}
|
|
8006152: af00 add r7, sp, #0
|
|
|
|
netif_set_link_up(&loop_netif);
|
|
netif_set_up(&loop_netif);
|
|
|
|
#endif /* LWIP_HAVE_LOOPIF */
|
|
}
|
|
8006154: bf00 nop
|
|
8006156: 46bd mov sp, r7
|
|
8006158: f85d 7b04 ldr.w r7, [sp], #4
|
|
800615c: 4770 bx lr
|
|
...
|
|
|
|
08006160 <netif_add>:
|
|
netif_add(struct netif *netif,
|
|
#if LWIP_IPV4
|
|
const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,
|
|
#endif /* LWIP_IPV4 */
|
|
void *state, netif_init_fn init, netif_input_fn input)
|
|
{
|
|
8006160: b580 push {r7, lr}
|
|
8006162: b088 sub sp, #32
|
|
8006164: af02 add r7, sp, #8
|
|
8006166: 60f8 str r0, [r7, #12]
|
|
8006168: 60b9 str r1, [r7, #8]
|
|
800616a: 607a str r2, [r7, #4]
|
|
800616c: 603b str r3, [r7, #0]
|
|
LWIP_ASSERT("single netif already set", 0);
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
LWIP_ERROR("netif_add: invalid netif", netif != NULL, return NULL);
|
|
800616e: 68fb ldr r3, [r7, #12]
|
|
8006170: 2b00 cmp r3, #0
|
|
8006172: d108 bne.n 8006186 <netif_add+0x26>
|
|
8006174: 4b96 ldr r3, [pc, #600] ; (80063d0 <netif_add+0x270>)
|
|
8006176: f240 1227 movw r2, #295 ; 0x127
|
|
800617a: 4996 ldr r1, [pc, #600] ; (80063d4 <netif_add+0x274>)
|
|
800617c: 4896 ldr r0, [pc, #600] ; (80063d8 <netif_add+0x278>)
|
|
800617e: f00a fd23 bl 8010bc8 <iprintf>
|
|
8006182: 2300 movs r3, #0
|
|
8006184: e14c b.n 8006420 <netif_add+0x2c0>
|
|
LWIP_ERROR("netif_add: No init function given", init != NULL, return NULL);
|
|
8006186: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8006188: 2b00 cmp r3, #0
|
|
800618a: d108 bne.n 800619e <netif_add+0x3e>
|
|
800618c: 4b90 ldr r3, [pc, #576] ; (80063d0 <netif_add+0x270>)
|
|
800618e: f44f 7294 mov.w r2, #296 ; 0x128
|
|
8006192: 4992 ldr r1, [pc, #584] ; (80063dc <netif_add+0x27c>)
|
|
8006194: 4890 ldr r0, [pc, #576] ; (80063d8 <netif_add+0x278>)
|
|
8006196: f00a fd17 bl 8010bc8 <iprintf>
|
|
800619a: 2300 movs r3, #0
|
|
800619c: e140 b.n 8006420 <netif_add+0x2c0>
|
|
|
|
#if LWIP_IPV4
|
|
if (ipaddr == NULL) {
|
|
800619e: 68bb ldr r3, [r7, #8]
|
|
80061a0: 2b00 cmp r3, #0
|
|
80061a2: d101 bne.n 80061a8 <netif_add+0x48>
|
|
ipaddr = ip_2_ip4(IP4_ADDR_ANY);
|
|
80061a4: 4b8e ldr r3, [pc, #568] ; (80063e0 <netif_add+0x280>)
|
|
80061a6: 60bb str r3, [r7, #8]
|
|
}
|
|
if (netmask == NULL) {
|
|
80061a8: 687b ldr r3, [r7, #4]
|
|
80061aa: 2b00 cmp r3, #0
|
|
80061ac: d101 bne.n 80061b2 <netif_add+0x52>
|
|
netmask = ip_2_ip4(IP4_ADDR_ANY);
|
|
80061ae: 4b8c ldr r3, [pc, #560] ; (80063e0 <netif_add+0x280>)
|
|
80061b0: 607b str r3, [r7, #4]
|
|
}
|
|
if (gw == NULL) {
|
|
80061b2: 683b ldr r3, [r7, #0]
|
|
80061b4: 2b00 cmp r3, #0
|
|
80061b6: d101 bne.n 80061bc <netif_add+0x5c>
|
|
gw = ip_2_ip4(IP4_ADDR_ANY);
|
|
80061b8: 4b89 ldr r3, [pc, #548] ; (80063e0 <netif_add+0x280>)
|
|
80061ba: 603b str r3, [r7, #0]
|
|
}
|
|
|
|
/* reset new interface configuration state */
|
|
ip_addr_set_zero_ip4(&netif->ip_addr);
|
|
80061bc: 68fb ldr r3, [r7, #12]
|
|
80061be: 2200 movs r2, #0
|
|
80061c0: 605a str r2, [r3, #4]
|
|
ip_addr_set_zero_ip4(&netif->netmask);
|
|
80061c2: 68fb ldr r3, [r7, #12]
|
|
80061c4: 2200 movs r2, #0
|
|
80061c6: 609a str r2, [r3, #8]
|
|
ip_addr_set_zero_ip4(&netif->gw);
|
|
80061c8: 68fb ldr r3, [r7, #12]
|
|
80061ca: 2200 movs r2, #0
|
|
80061cc: 60da str r2, [r3, #12]
|
|
netif->output = netif_null_output_ip4;
|
|
80061ce: 68fb ldr r3, [r7, #12]
|
|
80061d0: 4a84 ldr r2, [pc, #528] ; (80063e4 <netif_add+0x284>)
|
|
80061d2: 615a str r2, [r3, #20]
|
|
#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */
|
|
}
|
|
netif->output_ip6 = netif_null_output_ip6;
|
|
#endif /* LWIP_IPV6 */
|
|
NETIF_SET_CHECKSUM_CTRL(netif, NETIF_CHECKSUM_ENABLE_ALL);
|
|
netif->mtu = 0;
|
|
80061d4: 68fb ldr r3, [r7, #12]
|
|
80061d6: 2200 movs r2, #0
|
|
80061d8: 849a strh r2, [r3, #36] ; 0x24
|
|
netif->flags = 0;
|
|
80061da: 68fb ldr r3, [r7, #12]
|
|
80061dc: 2200 movs r2, #0
|
|
80061de: f883 202d strb.w r2, [r3, #45] ; 0x2d
|
|
#endif /* LWIP_IPV6 */
|
|
#if LWIP_NETIF_STATUS_CALLBACK
|
|
netif->status_callback = NULL;
|
|
#endif /* LWIP_NETIF_STATUS_CALLBACK */
|
|
#if LWIP_NETIF_LINK_CALLBACK
|
|
netif->link_callback = NULL;
|
|
80061e2: 68fb ldr r3, [r7, #12]
|
|
80061e4: 2200 movs r2, #0
|
|
80061e6: 61da str r2, [r3, #28]
|
|
netif->loop_first = NULL;
|
|
netif->loop_last = NULL;
|
|
#endif /* ENABLE_LOOPBACK */
|
|
|
|
/* remember netif specific state information data */
|
|
netif->state = state;
|
|
80061e8: 68fb ldr r3, [r7, #12]
|
|
80061ea: 6a3a ldr r2, [r7, #32]
|
|
80061ec: 621a str r2, [r3, #32]
|
|
netif->num = netif_num;
|
|
80061ee: 4b7e ldr r3, [pc, #504] ; (80063e8 <netif_add+0x288>)
|
|
80061f0: 781a ldrb r2, [r3, #0]
|
|
80061f2: 68fb ldr r3, [r7, #12]
|
|
80061f4: f883 2030 strb.w r2, [r3, #48] ; 0x30
|
|
netif->input = input;
|
|
80061f8: 68fb ldr r3, [r7, #12]
|
|
80061fa: 6aba ldr r2, [r7, #40] ; 0x28
|
|
80061fc: 611a str r2, [r3, #16]
|
|
#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS
|
|
netif->loop_cnt_current = 0;
|
|
#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */
|
|
|
|
#if LWIP_IPV4
|
|
netif_set_addr(netif, ipaddr, netmask, gw);
|
|
80061fe: 683b ldr r3, [r7, #0]
|
|
8006200: 687a ldr r2, [r7, #4]
|
|
8006202: 68b9 ldr r1, [r7, #8]
|
|
8006204: 68f8 ldr r0, [r7, #12]
|
|
8006206: f000 f9f5 bl 80065f4 <netif_set_addr>
|
|
#endif /* LWIP_IPV4 */
|
|
|
|
/* call user specified initialization function for netif */
|
|
if (init(netif) != ERR_OK) {
|
|
800620a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800620c: 68f8 ldr r0, [r7, #12]
|
|
800620e: 4798 blx r3
|
|
8006210: 4603 mov r3, r0
|
|
8006212: 2b00 cmp r3, #0
|
|
8006214: d001 beq.n 800621a <netif_add+0xba>
|
|
return NULL;
|
|
8006216: 2300 movs r3, #0
|
|
8006218: e102 b.n 8006420 <netif_add+0x2c0>
|
|
*/
|
|
{
|
|
struct netif *netif2;
|
|
int num_netifs;
|
|
do {
|
|
if (netif->num == 255) {
|
|
800621a: 68fb ldr r3, [r7, #12]
|
|
800621c: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
8006220: 2bff cmp r3, #255 ; 0xff
|
|
8006222: d103 bne.n 800622c <netif_add+0xcc>
|
|
netif->num = 0;
|
|
8006224: 68fb ldr r3, [r7, #12]
|
|
8006226: 2200 movs r2, #0
|
|
8006228: f883 2030 strb.w r2, [r3, #48] ; 0x30
|
|
}
|
|
num_netifs = 0;
|
|
800622c: 2300 movs r3, #0
|
|
800622e: 613b str r3, [r7, #16]
|
|
for (netif2 = netif_list; netif2 != NULL; netif2 = netif2->next) {
|
|
8006230: 4b6e ldr r3, [pc, #440] ; (80063ec <netif_add+0x28c>)
|
|
8006232: 681b ldr r3, [r3, #0]
|
|
8006234: 617b str r3, [r7, #20]
|
|
8006236: e02b b.n 8006290 <netif_add+0x130>
|
|
LWIP_ASSERT("netif already added", netif2 != netif);
|
|
8006238: 697a ldr r2, [r7, #20]
|
|
800623a: 68fb ldr r3, [r7, #12]
|
|
800623c: 429a cmp r2, r3
|
|
800623e: d106 bne.n 800624e <netif_add+0xee>
|
|
8006240: 4b63 ldr r3, [pc, #396] ; (80063d0 <netif_add+0x270>)
|
|
8006242: f240 128b movw r2, #395 ; 0x18b
|
|
8006246: 496a ldr r1, [pc, #424] ; (80063f0 <netif_add+0x290>)
|
|
8006248: 4863 ldr r0, [pc, #396] ; (80063d8 <netif_add+0x278>)
|
|
800624a: f00a fcbd bl 8010bc8 <iprintf>
|
|
num_netifs++;
|
|
800624e: 693b ldr r3, [r7, #16]
|
|
8006250: 3301 adds r3, #1
|
|
8006252: 613b str r3, [r7, #16]
|
|
LWIP_ASSERT("too many netifs, max. supported number is 255", num_netifs <= 255);
|
|
8006254: 693b ldr r3, [r7, #16]
|
|
8006256: 2bff cmp r3, #255 ; 0xff
|
|
8006258: dd06 ble.n 8006268 <netif_add+0x108>
|
|
800625a: 4b5d ldr r3, [pc, #372] ; (80063d0 <netif_add+0x270>)
|
|
800625c: f240 128d movw r2, #397 ; 0x18d
|
|
8006260: 4964 ldr r1, [pc, #400] ; (80063f4 <netif_add+0x294>)
|
|
8006262: 485d ldr r0, [pc, #372] ; (80063d8 <netif_add+0x278>)
|
|
8006264: f00a fcb0 bl 8010bc8 <iprintf>
|
|
if (netif2->num == netif->num) {
|
|
8006268: 697b ldr r3, [r7, #20]
|
|
800626a: f893 2030 ldrb.w r2, [r3, #48] ; 0x30
|
|
800626e: 68fb ldr r3, [r7, #12]
|
|
8006270: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
8006274: 429a cmp r2, r3
|
|
8006276: d108 bne.n 800628a <netif_add+0x12a>
|
|
netif->num++;
|
|
8006278: 68fb ldr r3, [r7, #12]
|
|
800627a: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
800627e: 3301 adds r3, #1
|
|
8006280: b2da uxtb r2, r3
|
|
8006282: 68fb ldr r3, [r7, #12]
|
|
8006284: f883 2030 strb.w r2, [r3, #48] ; 0x30
|
|
break;
|
|
8006288: e005 b.n 8006296 <netif_add+0x136>
|
|
for (netif2 = netif_list; netif2 != NULL; netif2 = netif2->next) {
|
|
800628a: 697b ldr r3, [r7, #20]
|
|
800628c: 681b ldr r3, [r3, #0]
|
|
800628e: 617b str r3, [r7, #20]
|
|
8006290: 697b ldr r3, [r7, #20]
|
|
8006292: 2b00 cmp r3, #0
|
|
8006294: d1d0 bne.n 8006238 <netif_add+0xd8>
|
|
}
|
|
}
|
|
} while (netif2 != NULL);
|
|
8006296: 697b ldr r3, [r7, #20]
|
|
8006298: 2b00 cmp r3, #0
|
|
800629a: d1be bne.n 800621a <netif_add+0xba>
|
|
}
|
|
if (netif->num == 254) {
|
|
800629c: 68fb ldr r3, [r7, #12]
|
|
800629e: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
80062a2: 2bfe cmp r3, #254 ; 0xfe
|
|
80062a4: d103 bne.n 80062ae <netif_add+0x14e>
|
|
netif_num = 0;
|
|
80062a6: 4b50 ldr r3, [pc, #320] ; (80063e8 <netif_add+0x288>)
|
|
80062a8: 2200 movs r2, #0
|
|
80062aa: 701a strb r2, [r3, #0]
|
|
80062ac: e006 b.n 80062bc <netif_add+0x15c>
|
|
} else {
|
|
netif_num = (u8_t)(netif->num + 1);
|
|
80062ae: 68fb ldr r3, [r7, #12]
|
|
80062b0: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
80062b4: 3301 adds r3, #1
|
|
80062b6: b2da uxtb r2, r3
|
|
80062b8: 4b4b ldr r3, [pc, #300] ; (80063e8 <netif_add+0x288>)
|
|
80062ba: 701a strb r2, [r3, #0]
|
|
}
|
|
|
|
/* add this netif to the list */
|
|
netif->next = netif_list;
|
|
80062bc: 4b4b ldr r3, [pc, #300] ; (80063ec <netif_add+0x28c>)
|
|
80062be: 681a ldr r2, [r3, #0]
|
|
80062c0: 68fb ldr r3, [r7, #12]
|
|
80062c2: 601a str r2, [r3, #0]
|
|
netif_list = netif;
|
|
80062c4: 4a49 ldr r2, [pc, #292] ; (80063ec <netif_add+0x28c>)
|
|
80062c6: 68fb ldr r3, [r7, #12]
|
|
80062c8: 6013 str r3, [r2, #0]
|
|
if (netif->flags & NETIF_FLAG_IGMP) {
|
|
igmp_start(netif);
|
|
}
|
|
#endif /* LWIP_IGMP */
|
|
|
|
LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP",
|
|
80062ca: 68fb ldr r3, [r7, #12]
|
|
80062cc: f893 302e ldrb.w r3, [r3, #46] ; 0x2e
|
|
80062d0: 4619 mov r1, r3
|
|
80062d2: 68fb ldr r3, [r7, #12]
|
|
80062d4: f893 302f ldrb.w r3, [r3, #47] ; 0x2f
|
|
80062d8: 461a mov r2, r3
|
|
80062da: 4847 ldr r0, [pc, #284] ; (80063f8 <netif_add+0x298>)
|
|
80062dc: f00a fc74 bl 8010bc8 <iprintf>
|
|
netif->name[0], netif->name[1]));
|
|
#if LWIP_IPV4
|
|
LWIP_DEBUGF(NETIF_DEBUG, (" addr "));
|
|
80062e0: 4846 ldr r0, [pc, #280] ; (80063fc <netif_add+0x29c>)
|
|
80062e2: f00a fc71 bl 8010bc8 <iprintf>
|
|
ip4_addr_debug_print(NETIF_DEBUG, ipaddr);
|
|
80062e6: 68bb ldr r3, [r7, #8]
|
|
80062e8: 2b00 cmp r3, #0
|
|
80062ea: d003 beq.n 80062f4 <netif_add+0x194>
|
|
80062ec: 68bb ldr r3, [r7, #8]
|
|
80062ee: 781b ldrb r3, [r3, #0]
|
|
80062f0: 4619 mov r1, r3
|
|
80062f2: e000 b.n 80062f6 <netif_add+0x196>
|
|
80062f4: 2100 movs r1, #0
|
|
80062f6: 68bb ldr r3, [r7, #8]
|
|
80062f8: 2b00 cmp r3, #0
|
|
80062fa: d004 beq.n 8006306 <netif_add+0x1a6>
|
|
80062fc: 68bb ldr r3, [r7, #8]
|
|
80062fe: 3301 adds r3, #1
|
|
8006300: 781b ldrb r3, [r3, #0]
|
|
8006302: 461a mov r2, r3
|
|
8006304: e000 b.n 8006308 <netif_add+0x1a8>
|
|
8006306: 2200 movs r2, #0
|
|
8006308: 68bb ldr r3, [r7, #8]
|
|
800630a: 2b00 cmp r3, #0
|
|
800630c: d004 beq.n 8006318 <netif_add+0x1b8>
|
|
800630e: 68bb ldr r3, [r7, #8]
|
|
8006310: 3302 adds r3, #2
|
|
8006312: 781b ldrb r3, [r3, #0]
|
|
8006314: 4618 mov r0, r3
|
|
8006316: e000 b.n 800631a <netif_add+0x1ba>
|
|
8006318: 2000 movs r0, #0
|
|
800631a: 68bb ldr r3, [r7, #8]
|
|
800631c: 2b00 cmp r3, #0
|
|
800631e: d003 beq.n 8006328 <netif_add+0x1c8>
|
|
8006320: 68bb ldr r3, [r7, #8]
|
|
8006322: 3303 adds r3, #3
|
|
8006324: 781b ldrb r3, [r3, #0]
|
|
8006326: e000 b.n 800632a <netif_add+0x1ca>
|
|
8006328: 2300 movs r3, #0
|
|
800632a: 9300 str r3, [sp, #0]
|
|
800632c: 4603 mov r3, r0
|
|
800632e: 4834 ldr r0, [pc, #208] ; (8006400 <netif_add+0x2a0>)
|
|
8006330: f00a fc4a bl 8010bc8 <iprintf>
|
|
LWIP_DEBUGF(NETIF_DEBUG, (" netmask "));
|
|
8006334: 4833 ldr r0, [pc, #204] ; (8006404 <netif_add+0x2a4>)
|
|
8006336: f00a fc47 bl 8010bc8 <iprintf>
|
|
ip4_addr_debug_print(NETIF_DEBUG, netmask);
|
|
800633a: 687b ldr r3, [r7, #4]
|
|
800633c: 2b00 cmp r3, #0
|
|
800633e: d003 beq.n 8006348 <netif_add+0x1e8>
|
|
8006340: 687b ldr r3, [r7, #4]
|
|
8006342: 781b ldrb r3, [r3, #0]
|
|
8006344: 4619 mov r1, r3
|
|
8006346: e000 b.n 800634a <netif_add+0x1ea>
|
|
8006348: 2100 movs r1, #0
|
|
800634a: 687b ldr r3, [r7, #4]
|
|
800634c: 2b00 cmp r3, #0
|
|
800634e: d004 beq.n 800635a <netif_add+0x1fa>
|
|
8006350: 687b ldr r3, [r7, #4]
|
|
8006352: 3301 adds r3, #1
|
|
8006354: 781b ldrb r3, [r3, #0]
|
|
8006356: 461a mov r2, r3
|
|
8006358: e000 b.n 800635c <netif_add+0x1fc>
|
|
800635a: 2200 movs r2, #0
|
|
800635c: 687b ldr r3, [r7, #4]
|
|
800635e: 2b00 cmp r3, #0
|
|
8006360: d004 beq.n 800636c <netif_add+0x20c>
|
|
8006362: 687b ldr r3, [r7, #4]
|
|
8006364: 3302 adds r3, #2
|
|
8006366: 781b ldrb r3, [r3, #0]
|
|
8006368: 4618 mov r0, r3
|
|
800636a: e000 b.n 800636e <netif_add+0x20e>
|
|
800636c: 2000 movs r0, #0
|
|
800636e: 687b ldr r3, [r7, #4]
|
|
8006370: 2b00 cmp r3, #0
|
|
8006372: d003 beq.n 800637c <netif_add+0x21c>
|
|
8006374: 687b ldr r3, [r7, #4]
|
|
8006376: 3303 adds r3, #3
|
|
8006378: 781b ldrb r3, [r3, #0]
|
|
800637a: e000 b.n 800637e <netif_add+0x21e>
|
|
800637c: 2300 movs r3, #0
|
|
800637e: 9300 str r3, [sp, #0]
|
|
8006380: 4603 mov r3, r0
|
|
8006382: 481f ldr r0, [pc, #124] ; (8006400 <netif_add+0x2a0>)
|
|
8006384: f00a fc20 bl 8010bc8 <iprintf>
|
|
LWIP_DEBUGF(NETIF_DEBUG, (" gw "));
|
|
8006388: 481f ldr r0, [pc, #124] ; (8006408 <netif_add+0x2a8>)
|
|
800638a: f00a fc1d bl 8010bc8 <iprintf>
|
|
ip4_addr_debug_print(NETIF_DEBUG, gw);
|
|
800638e: 683b ldr r3, [r7, #0]
|
|
8006390: 2b00 cmp r3, #0
|
|
8006392: d003 beq.n 800639c <netif_add+0x23c>
|
|
8006394: 683b ldr r3, [r7, #0]
|
|
8006396: 781b ldrb r3, [r3, #0]
|
|
8006398: 4619 mov r1, r3
|
|
800639a: e000 b.n 800639e <netif_add+0x23e>
|
|
800639c: 2100 movs r1, #0
|
|
800639e: 683b ldr r3, [r7, #0]
|
|
80063a0: 2b00 cmp r3, #0
|
|
80063a2: d004 beq.n 80063ae <netif_add+0x24e>
|
|
80063a4: 683b ldr r3, [r7, #0]
|
|
80063a6: 3301 adds r3, #1
|
|
80063a8: 781b ldrb r3, [r3, #0]
|
|
80063aa: 461a mov r2, r3
|
|
80063ac: e000 b.n 80063b0 <netif_add+0x250>
|
|
80063ae: 2200 movs r2, #0
|
|
80063b0: 683b ldr r3, [r7, #0]
|
|
80063b2: 2b00 cmp r3, #0
|
|
80063b4: d004 beq.n 80063c0 <netif_add+0x260>
|
|
80063b6: 683b ldr r3, [r7, #0]
|
|
80063b8: 3302 adds r3, #2
|
|
80063ba: 781b ldrb r3, [r3, #0]
|
|
80063bc: 4618 mov r0, r3
|
|
80063be: e000 b.n 80063c2 <netif_add+0x262>
|
|
80063c0: 2000 movs r0, #0
|
|
80063c2: 683b ldr r3, [r7, #0]
|
|
80063c4: 2b00 cmp r3, #0
|
|
80063c6: d021 beq.n 800640c <netif_add+0x2ac>
|
|
80063c8: 683b ldr r3, [r7, #0]
|
|
80063ca: 3303 adds r3, #3
|
|
80063cc: 781b ldrb r3, [r3, #0]
|
|
80063ce: e01e b.n 800640e <netif_add+0x2ae>
|
|
80063d0: 08012168 .word 0x08012168
|
|
80063d4: 080121fc .word 0x080121fc
|
|
80063d8: 080121b8 .word 0x080121b8
|
|
80063dc: 08012218 .word 0x08012218
|
|
80063e0: 08014d94 .word 0x08014d94
|
|
80063e4: 080068f7 .word 0x080068f7
|
|
80063e8: 24007b68 .word 0x24007b68
|
|
80063ec: 24007b60 .word 0x24007b60
|
|
80063f0: 0801223c .word 0x0801223c
|
|
80063f4: 08012250 .word 0x08012250
|
|
80063f8: 08012280 .word 0x08012280
|
|
80063fc: 080122a0 .word 0x080122a0
|
|
8006400: 080122a8 .word 0x080122a8
|
|
8006404: 080122b8 .word 0x080122b8
|
|
8006408: 080122c4 .word 0x080122c4
|
|
800640c: 2300 movs r3, #0
|
|
800640e: 9300 str r3, [sp, #0]
|
|
8006410: 4603 mov r3, r0
|
|
8006412: 4805 ldr r0, [pc, #20] ; (8006428 <netif_add+0x2c8>)
|
|
8006414: f00a fbd8 bl 8010bc8 <iprintf>
|
|
#endif /* LWIP_IPV4 */
|
|
LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
|
|
8006418: 200a movs r0, #10
|
|
800641a: f00a fbe7 bl 8010bec <putchar>
|
|
|
|
netif_invoke_ext_callback(netif, LWIP_NSC_NETIF_ADDED, NULL);
|
|
|
|
return netif;
|
|
800641e: 68fb ldr r3, [r7, #12]
|
|
}
|
|
8006420: 4618 mov r0, r3
|
|
8006422: 3718 adds r7, #24
|
|
8006424: 46bd mov sp, r7
|
|
8006426: bd80 pop {r7, pc}
|
|
8006428: 080122a8 .word 0x080122a8
|
|
|
|
0800642c <netif_do_ip_addr_changed>:
|
|
|
|
static void
|
|
netif_do_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
|
|
{
|
|
800642c: b580 push {r7, lr}
|
|
800642e: b082 sub sp, #8
|
|
8006430: af00 add r7, sp, #0
|
|
8006432: 6078 str r0, [r7, #4]
|
|
8006434: 6039 str r1, [r7, #0]
|
|
#if LWIP_TCP
|
|
tcp_netif_ip_addr_changed(old_addr, new_addr);
|
|
8006436: 6839 ldr r1, [r7, #0]
|
|
8006438: 6878 ldr r0, [r7, #4]
|
|
800643a: f002 fd85 bl 8008f48 <tcp_netif_ip_addr_changed>
|
|
#endif /* LWIP_TCP */
|
|
#if LWIP_UDP
|
|
udp_netif_ip_addr_changed(old_addr, new_addr);
|
|
800643e: 6839 ldr r1, [r7, #0]
|
|
8006440: 6878 ldr r0, [r7, #4]
|
|
8006442: f007 fb2d bl 800daa0 <udp_netif_ip_addr_changed>
|
|
#endif /* LWIP_UDP */
|
|
#if LWIP_RAW
|
|
raw_netif_ip_addr_changed(old_addr, new_addr);
|
|
#endif /* LWIP_RAW */
|
|
}
|
|
8006446: bf00 nop
|
|
8006448: 3708 adds r7, #8
|
|
800644a: 46bd mov sp, r7
|
|
800644c: bd80 pop {r7, pc}
|
|
...
|
|
|
|
08006450 <netif_do_set_ipaddr>:
|
|
|
|
#if LWIP_IPV4
|
|
static int
|
|
netif_do_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr, ip_addr_t *old_addr)
|
|
{
|
|
8006450: b580 push {r7, lr}
|
|
8006452: b086 sub sp, #24
|
|
8006454: af00 add r7, sp, #0
|
|
8006456: 60f8 str r0, [r7, #12]
|
|
8006458: 60b9 str r1, [r7, #8]
|
|
800645a: 607a str r2, [r7, #4]
|
|
LWIP_ASSERT("invalid pointer", ipaddr != NULL);
|
|
800645c: 68bb ldr r3, [r7, #8]
|
|
800645e: 2b00 cmp r3, #0
|
|
8006460: d106 bne.n 8006470 <netif_do_set_ipaddr+0x20>
|
|
8006462: 4b1e ldr r3, [pc, #120] ; (80064dc <netif_do_set_ipaddr+0x8c>)
|
|
8006464: f240 12cb movw r2, #459 ; 0x1cb
|
|
8006468: 491d ldr r1, [pc, #116] ; (80064e0 <netif_do_set_ipaddr+0x90>)
|
|
800646a: 481e ldr r0, [pc, #120] ; (80064e4 <netif_do_set_ipaddr+0x94>)
|
|
800646c: f00a fbac bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("invalid pointer", old_addr != NULL);
|
|
8006470: 687b ldr r3, [r7, #4]
|
|
8006472: 2b00 cmp r3, #0
|
|
8006474: d106 bne.n 8006484 <netif_do_set_ipaddr+0x34>
|
|
8006476: 4b19 ldr r3, [pc, #100] ; (80064dc <netif_do_set_ipaddr+0x8c>)
|
|
8006478: f44f 72e6 mov.w r2, #460 ; 0x1cc
|
|
800647c: 4918 ldr r1, [pc, #96] ; (80064e0 <netif_do_set_ipaddr+0x90>)
|
|
800647e: 4819 ldr r0, [pc, #100] ; (80064e4 <netif_do_set_ipaddr+0x94>)
|
|
8006480: f00a fba2 bl 8010bc8 <iprintf>
|
|
|
|
/* address is actually being changed? */
|
|
if (ip4_addr_cmp(ipaddr, netif_ip4_addr(netif)) == 0) {
|
|
8006484: 68bb ldr r3, [r7, #8]
|
|
8006486: 681a ldr r2, [r3, #0]
|
|
8006488: 68fb ldr r3, [r7, #12]
|
|
800648a: 3304 adds r3, #4
|
|
800648c: 681b ldr r3, [r3, #0]
|
|
800648e: 429a cmp r2, r3
|
|
8006490: d01f beq.n 80064d2 <netif_do_set_ipaddr+0x82>
|
|
ip_addr_t new_addr;
|
|
*ip_2_ip4(&new_addr) = *ipaddr;
|
|
8006492: 68bb ldr r3, [r7, #8]
|
|
8006494: 681b ldr r3, [r3, #0]
|
|
8006496: 617b str r3, [r7, #20]
|
|
IP_SET_TYPE_VAL(new_addr, IPADDR_TYPE_V4);
|
|
|
|
ip_addr_copy(*old_addr, *netif_ip_addr4(netif));
|
|
8006498: 68fb ldr r3, [r7, #12]
|
|
800649a: 3304 adds r3, #4
|
|
800649c: 681a ldr r2, [r3, #0]
|
|
800649e: 687b ldr r3, [r7, #4]
|
|
80064a0: 601a str r2, [r3, #0]
|
|
|
|
LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
|
|
80064a2: 4811 ldr r0, [pc, #68] ; (80064e8 <netif_do_set_ipaddr+0x98>)
|
|
80064a4: f00a fbfe bl 8010ca4 <puts>
|
|
netif_do_ip_addr_changed(old_addr, &new_addr);
|
|
80064a8: f107 0314 add.w r3, r7, #20
|
|
80064ac: 4619 mov r1, r3
|
|
80064ae: 6878 ldr r0, [r7, #4]
|
|
80064b0: f7ff ffbc bl 800642c <netif_do_ip_addr_changed>
|
|
|
|
mib2_remove_ip4(netif);
|
|
mib2_remove_route_ip4(0, netif);
|
|
/* set new IP address to netif */
|
|
ip4_addr_set(ip_2_ip4(&netif->ip_addr), ipaddr);
|
|
80064b4: 68bb ldr r3, [r7, #8]
|
|
80064b6: 2b00 cmp r3, #0
|
|
80064b8: d002 beq.n 80064c0 <netif_do_set_ipaddr+0x70>
|
|
80064ba: 68bb ldr r3, [r7, #8]
|
|
80064bc: 681b ldr r3, [r3, #0]
|
|
80064be: e000 b.n 80064c2 <netif_do_set_ipaddr+0x72>
|
|
80064c0: 2300 movs r3, #0
|
|
80064c2: 68fa ldr r2, [r7, #12]
|
|
80064c4: 6053 str r3, [r2, #4]
|
|
IP_SET_TYPE_VAL(netif->ip_addr, IPADDR_TYPE_V4);
|
|
mib2_add_ip4(netif);
|
|
mib2_add_route_ip4(0, netif);
|
|
|
|
netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4);
|
|
80064c6: 2101 movs r1, #1
|
|
80064c8: 68f8 ldr r0, [r7, #12]
|
|
80064ca: f000 f92d bl 8006728 <netif_issue_reports>
|
|
|
|
NETIF_STATUS_CALLBACK(netif);
|
|
return 1; /* address changed */
|
|
80064ce: 2301 movs r3, #1
|
|
80064d0: e000 b.n 80064d4 <netif_do_set_ipaddr+0x84>
|
|
}
|
|
return 0; /* address unchanged */
|
|
80064d2: 2300 movs r3, #0
|
|
}
|
|
80064d4: 4618 mov r0, r3
|
|
80064d6: 3718 adds r7, #24
|
|
80064d8: 46bd mov sp, r7
|
|
80064da: bd80 pop {r7, pc}
|
|
80064dc: 08012168 .word 0x08012168
|
|
80064e0: 080122cc .word 0x080122cc
|
|
80064e4: 080121b8 .word 0x080121b8
|
|
80064e8: 080122dc .word 0x080122dc
|
|
|
|
080064ec <netif_do_set_netmask>:
|
|
}
|
|
}
|
|
|
|
static int
|
|
netif_do_set_netmask(struct netif *netif, const ip4_addr_t *netmask, ip_addr_t *old_nm)
|
|
{
|
|
80064ec: b5b0 push {r4, r5, r7, lr}
|
|
80064ee: b088 sub sp, #32
|
|
80064f0: af04 add r7, sp, #16
|
|
80064f2: 60f8 str r0, [r7, #12]
|
|
80064f4: 60b9 str r1, [r7, #8]
|
|
80064f6: 607a str r2, [r7, #4]
|
|
/* address is actually being changed? */
|
|
if (ip4_addr_cmp(netmask, netif_ip4_netmask(netif)) == 0) {
|
|
80064f8: 68bb ldr r3, [r7, #8]
|
|
80064fa: 681a ldr r2, [r3, #0]
|
|
80064fc: 68fb ldr r3, [r7, #12]
|
|
80064fe: 3308 adds r3, #8
|
|
8006500: 681b ldr r3, [r3, #0]
|
|
8006502: 429a cmp r2, r3
|
|
8006504: d02d beq.n 8006562 <netif_do_set_netmask+0x76>
|
|
#else
|
|
LWIP_UNUSED_ARG(old_nm);
|
|
#endif
|
|
mib2_remove_route_ip4(0, netif);
|
|
/* set new netmask to netif */
|
|
ip4_addr_set(ip_2_ip4(&netif->netmask), netmask);
|
|
8006506: 68bb ldr r3, [r7, #8]
|
|
8006508: 2b00 cmp r3, #0
|
|
800650a: d002 beq.n 8006512 <netif_do_set_netmask+0x26>
|
|
800650c: 68bb ldr r3, [r7, #8]
|
|
800650e: 681b ldr r3, [r3, #0]
|
|
8006510: e000 b.n 8006514 <netif_do_set_netmask+0x28>
|
|
8006512: 2300 movs r3, #0
|
|
8006514: 68fa ldr r2, [r7, #12]
|
|
8006516: 6093 str r3, [r2, #8]
|
|
IP_SET_TYPE_VAL(netif->netmask, IPADDR_TYPE_V4);
|
|
mib2_add_route_ip4(0, netif);
|
|
LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
|
|
8006518: 68fb ldr r3, [r7, #12]
|
|
800651a: f893 302e ldrb.w r3, [r3, #46] ; 0x2e
|
|
800651e: 4618 mov r0, r3
|
|
8006520: 68fb ldr r3, [r7, #12]
|
|
8006522: f893 302f ldrb.w r3, [r3, #47] ; 0x2f
|
|
8006526: 461c mov r4, r3
|
|
8006528: 68fb ldr r3, [r7, #12]
|
|
800652a: 3308 adds r3, #8
|
|
800652c: 781b ldrb r3, [r3, #0]
|
|
800652e: 461d mov r5, r3
|
|
8006530: 68fb ldr r3, [r7, #12]
|
|
8006532: 3308 adds r3, #8
|
|
8006534: 3301 adds r3, #1
|
|
8006536: 781b ldrb r3, [r3, #0]
|
|
8006538: 461a mov r2, r3
|
|
800653a: 68fb ldr r3, [r7, #12]
|
|
800653c: 3308 adds r3, #8
|
|
800653e: 3302 adds r3, #2
|
|
8006540: 781b ldrb r3, [r3, #0]
|
|
8006542: 4619 mov r1, r3
|
|
8006544: 68fb ldr r3, [r7, #12]
|
|
8006546: 3308 adds r3, #8
|
|
8006548: 3303 adds r3, #3
|
|
800654a: 781b ldrb r3, [r3, #0]
|
|
800654c: 9302 str r3, [sp, #8]
|
|
800654e: 9101 str r1, [sp, #4]
|
|
8006550: 9200 str r2, [sp, #0]
|
|
8006552: 462b mov r3, r5
|
|
8006554: 4622 mov r2, r4
|
|
8006556: 4601 mov r1, r0
|
|
8006558: 4804 ldr r0, [pc, #16] ; (800656c <netif_do_set_netmask+0x80>)
|
|
800655a: f00a fb35 bl 8010bc8 <iprintf>
|
|
netif->name[0], netif->name[1],
|
|
ip4_addr1_16(netif_ip4_netmask(netif)),
|
|
ip4_addr2_16(netif_ip4_netmask(netif)),
|
|
ip4_addr3_16(netif_ip4_netmask(netif)),
|
|
ip4_addr4_16(netif_ip4_netmask(netif))));
|
|
return 1; /* netmask changed */
|
|
800655e: 2301 movs r3, #1
|
|
8006560: e000 b.n 8006564 <netif_do_set_netmask+0x78>
|
|
}
|
|
return 0; /* netmask unchanged */
|
|
8006562: 2300 movs r3, #0
|
|
}
|
|
8006564: 4618 mov r0, r3
|
|
8006566: 3710 adds r7, #16
|
|
8006568: 46bd mov sp, r7
|
|
800656a: bdb0 pop {r4, r5, r7, pc}
|
|
800656c: 0801232c .word 0x0801232c
|
|
|
|
08006570 <netif_do_set_gw>:
|
|
}
|
|
}
|
|
|
|
static int
|
|
netif_do_set_gw(struct netif *netif, const ip4_addr_t *gw, ip_addr_t *old_gw)
|
|
{
|
|
8006570: b5b0 push {r4, r5, r7, lr}
|
|
8006572: b088 sub sp, #32
|
|
8006574: af04 add r7, sp, #16
|
|
8006576: 60f8 str r0, [r7, #12]
|
|
8006578: 60b9 str r1, [r7, #8]
|
|
800657a: 607a str r2, [r7, #4]
|
|
/* address is actually being changed? */
|
|
if (ip4_addr_cmp(gw, netif_ip4_gw(netif)) == 0) {
|
|
800657c: 68bb ldr r3, [r7, #8]
|
|
800657e: 681a ldr r2, [r3, #0]
|
|
8006580: 68fb ldr r3, [r7, #12]
|
|
8006582: 330c adds r3, #12
|
|
8006584: 681b ldr r3, [r3, #0]
|
|
8006586: 429a cmp r2, r3
|
|
8006588: d02d beq.n 80065e6 <netif_do_set_gw+0x76>
|
|
ip_addr_copy(*old_gw, *netif_ip_gw4(netif));
|
|
#else
|
|
LWIP_UNUSED_ARG(old_gw);
|
|
#endif
|
|
|
|
ip4_addr_set(ip_2_ip4(&netif->gw), gw);
|
|
800658a: 68bb ldr r3, [r7, #8]
|
|
800658c: 2b00 cmp r3, #0
|
|
800658e: d002 beq.n 8006596 <netif_do_set_gw+0x26>
|
|
8006590: 68bb ldr r3, [r7, #8]
|
|
8006592: 681b ldr r3, [r3, #0]
|
|
8006594: e000 b.n 8006598 <netif_do_set_gw+0x28>
|
|
8006596: 2300 movs r3, #0
|
|
8006598: 68fa ldr r2, [r7, #12]
|
|
800659a: 60d3 str r3, [r2, #12]
|
|
IP_SET_TYPE_VAL(netif->gw, IPADDR_TYPE_V4);
|
|
LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
|
|
800659c: 68fb ldr r3, [r7, #12]
|
|
800659e: f893 302e ldrb.w r3, [r3, #46] ; 0x2e
|
|
80065a2: 4618 mov r0, r3
|
|
80065a4: 68fb ldr r3, [r7, #12]
|
|
80065a6: f893 302f ldrb.w r3, [r3, #47] ; 0x2f
|
|
80065aa: 461c mov r4, r3
|
|
80065ac: 68fb ldr r3, [r7, #12]
|
|
80065ae: 330c adds r3, #12
|
|
80065b0: 781b ldrb r3, [r3, #0]
|
|
80065b2: 461d mov r5, r3
|
|
80065b4: 68fb ldr r3, [r7, #12]
|
|
80065b6: 330c adds r3, #12
|
|
80065b8: 3301 adds r3, #1
|
|
80065ba: 781b ldrb r3, [r3, #0]
|
|
80065bc: 461a mov r2, r3
|
|
80065be: 68fb ldr r3, [r7, #12]
|
|
80065c0: 330c adds r3, #12
|
|
80065c2: 3302 adds r3, #2
|
|
80065c4: 781b ldrb r3, [r3, #0]
|
|
80065c6: 4619 mov r1, r3
|
|
80065c8: 68fb ldr r3, [r7, #12]
|
|
80065ca: 330c adds r3, #12
|
|
80065cc: 3303 adds r3, #3
|
|
80065ce: 781b ldrb r3, [r3, #0]
|
|
80065d0: 9302 str r3, [sp, #8]
|
|
80065d2: 9101 str r1, [sp, #4]
|
|
80065d4: 9200 str r2, [sp, #0]
|
|
80065d6: 462b mov r3, r5
|
|
80065d8: 4622 mov r2, r4
|
|
80065da: 4601 mov r1, r0
|
|
80065dc: 4804 ldr r0, [pc, #16] ; (80065f0 <netif_do_set_gw+0x80>)
|
|
80065de: f00a faf3 bl 8010bc8 <iprintf>
|
|
netif->name[0], netif->name[1],
|
|
ip4_addr1_16(netif_ip4_gw(netif)),
|
|
ip4_addr2_16(netif_ip4_gw(netif)),
|
|
ip4_addr3_16(netif_ip4_gw(netif)),
|
|
ip4_addr4_16(netif_ip4_gw(netif))));
|
|
return 1; /* gateway changed */
|
|
80065e2: 2301 movs r3, #1
|
|
80065e4: e000 b.n 80065e8 <netif_do_set_gw+0x78>
|
|
}
|
|
return 0; /* gateway unchanged */
|
|
80065e6: 2300 movs r3, #0
|
|
}
|
|
80065e8: 4618 mov r0, r3
|
|
80065ea: 3710 adds r7, #16
|
|
80065ec: 46bd mov sp, r7
|
|
80065ee: bdb0 pop {r4, r5, r7, pc}
|
|
80065f0: 0801238c .word 0x0801238c
|
|
|
|
080065f4 <netif_set_addr>:
|
|
* @param gw the new default gateway
|
|
*/
|
|
void
|
|
netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask,
|
|
const ip4_addr_t *gw)
|
|
{
|
|
80065f4: b580 push {r7, lr}
|
|
80065f6: b088 sub sp, #32
|
|
80065f8: af00 add r7, sp, #0
|
|
80065fa: 60f8 str r0, [r7, #12]
|
|
80065fc: 60b9 str r1, [r7, #8]
|
|
80065fe: 607a str r2, [r7, #4]
|
|
8006600: 603b str r3, [r7, #0]
|
|
ip_addr_t old_nm_val;
|
|
ip_addr_t old_gw_val;
|
|
ip_addr_t *old_nm = &old_nm_val;
|
|
ip_addr_t *old_gw = &old_gw_val;
|
|
#else
|
|
ip_addr_t *old_nm = NULL;
|
|
8006602: 2300 movs r3, #0
|
|
8006604: 61fb str r3, [r7, #28]
|
|
ip_addr_t *old_gw = NULL;
|
|
8006606: 2300 movs r3, #0
|
|
8006608: 61bb str r3, [r7, #24]
|
|
int remove;
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
/* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
|
|
if (ipaddr == NULL) {
|
|
800660a: 68bb ldr r3, [r7, #8]
|
|
800660c: 2b00 cmp r3, #0
|
|
800660e: d101 bne.n 8006614 <netif_set_addr+0x20>
|
|
ipaddr = IP4_ADDR_ANY4;
|
|
8006610: 4b1c ldr r3, [pc, #112] ; (8006684 <netif_set_addr+0x90>)
|
|
8006612: 60bb str r3, [r7, #8]
|
|
}
|
|
if (netmask == NULL) {
|
|
8006614: 687b ldr r3, [r7, #4]
|
|
8006616: 2b00 cmp r3, #0
|
|
8006618: d101 bne.n 800661e <netif_set_addr+0x2a>
|
|
netmask = IP4_ADDR_ANY4;
|
|
800661a: 4b1a ldr r3, [pc, #104] ; (8006684 <netif_set_addr+0x90>)
|
|
800661c: 607b str r3, [r7, #4]
|
|
}
|
|
if (gw == NULL) {
|
|
800661e: 683b ldr r3, [r7, #0]
|
|
8006620: 2b00 cmp r3, #0
|
|
8006622: d101 bne.n 8006628 <netif_set_addr+0x34>
|
|
gw = IP4_ADDR_ANY4;
|
|
8006624: 4b17 ldr r3, [pc, #92] ; (8006684 <netif_set_addr+0x90>)
|
|
8006626: 603b str r3, [r7, #0]
|
|
}
|
|
|
|
remove = ip4_addr_isany(ipaddr);
|
|
8006628: 68bb ldr r3, [r7, #8]
|
|
800662a: 2b00 cmp r3, #0
|
|
800662c: d003 beq.n 8006636 <netif_set_addr+0x42>
|
|
800662e: 68bb ldr r3, [r7, #8]
|
|
8006630: 681b ldr r3, [r3, #0]
|
|
8006632: 2b00 cmp r3, #0
|
|
8006634: d101 bne.n 800663a <netif_set_addr+0x46>
|
|
8006636: 2301 movs r3, #1
|
|
8006638: e000 b.n 800663c <netif_set_addr+0x48>
|
|
800663a: 2300 movs r3, #0
|
|
800663c: 617b str r3, [r7, #20]
|
|
if (remove) {
|
|
800663e: 697b ldr r3, [r7, #20]
|
|
8006640: 2b00 cmp r3, #0
|
|
8006642: d006 beq.n 8006652 <netif_set_addr+0x5e>
|
|
/* when removing an address, we have to remove it *before* changing netmask/gw
|
|
to ensure that tcp RST segment can be sent correctly */
|
|
if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) {
|
|
8006644: f107 0310 add.w r3, r7, #16
|
|
8006648: 461a mov r2, r3
|
|
800664a: 68b9 ldr r1, [r7, #8]
|
|
800664c: 68f8 ldr r0, [r7, #12]
|
|
800664e: f7ff feff bl 8006450 <netif_do_set_ipaddr>
|
|
change_reason |= LWIP_NSC_IPV4_ADDRESS_CHANGED;
|
|
cb_args.ipv4_changed.old_address = &old_addr;
|
|
#endif
|
|
}
|
|
}
|
|
if (netif_do_set_netmask(netif, netmask, old_nm)) {
|
|
8006652: 69fa ldr r2, [r7, #28]
|
|
8006654: 6879 ldr r1, [r7, #4]
|
|
8006656: 68f8 ldr r0, [r7, #12]
|
|
8006658: f7ff ff48 bl 80064ec <netif_do_set_netmask>
|
|
#if LWIP_NETIF_EXT_STATUS_CALLBACK
|
|
change_reason |= LWIP_NSC_IPV4_NETMASK_CHANGED;
|
|
cb_args.ipv4_changed.old_netmask = old_nm;
|
|
#endif
|
|
}
|
|
if (netif_do_set_gw(netif, gw, old_gw)) {
|
|
800665c: 69ba ldr r2, [r7, #24]
|
|
800665e: 6839 ldr r1, [r7, #0]
|
|
8006660: 68f8 ldr r0, [r7, #12]
|
|
8006662: f7ff ff85 bl 8006570 <netif_do_set_gw>
|
|
#if LWIP_NETIF_EXT_STATUS_CALLBACK
|
|
change_reason |= LWIP_NSC_IPV4_GATEWAY_CHANGED;
|
|
cb_args.ipv4_changed.old_gw = old_gw;
|
|
#endif
|
|
}
|
|
if (!remove) {
|
|
8006666: 697b ldr r3, [r7, #20]
|
|
8006668: 2b00 cmp r3, #0
|
|
800666a: d106 bne.n 800667a <netif_set_addr+0x86>
|
|
/* set ipaddr last to ensure netmask/gw have been set when status callback is called */
|
|
if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) {
|
|
800666c: f107 0310 add.w r3, r7, #16
|
|
8006670: 461a mov r2, r3
|
|
8006672: 68b9 ldr r1, [r7, #8]
|
|
8006674: 68f8 ldr r0, [r7, #12]
|
|
8006676: f7ff feeb bl 8006450 <netif_do_set_ipaddr>
|
|
if (change_reason != LWIP_NSC_NONE) {
|
|
change_reason |= LWIP_NSC_IPV4_SETTINGS_CHANGED;
|
|
netif_invoke_ext_callback(netif, change_reason, &cb_args);
|
|
}
|
|
#endif
|
|
}
|
|
800667a: bf00 nop
|
|
800667c: 3720 adds r7, #32
|
|
800667e: 46bd mov sp, r7
|
|
8006680: bd80 pop {r7, pc}
|
|
8006682: bf00 nop
|
|
8006684: 08014d94 .word 0x08014d94
|
|
|
|
08006688 <netif_set_default>:
|
|
*
|
|
* @param netif the default network interface
|
|
*/
|
|
void
|
|
netif_set_default(struct netif *netif)
|
|
{
|
|
8006688: b580 push {r7, lr}
|
|
800668a: b082 sub sp, #8
|
|
800668c: af00 add r7, sp, #0
|
|
800668e: 6078 str r0, [r7, #4]
|
|
mib2_remove_route_ip4(1, netif);
|
|
} else {
|
|
/* install default route */
|
|
mib2_add_route_ip4(1, netif);
|
|
}
|
|
netif_default = netif;
|
|
8006690: 4a0d ldr r2, [pc, #52] ; (80066c8 <netif_set_default+0x40>)
|
|
8006692: 687b ldr r3, [r7, #4]
|
|
8006694: 6013 str r3, [r2, #0]
|
|
LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n",
|
|
8006696: 687b ldr r3, [r7, #4]
|
|
8006698: 2b00 cmp r3, #0
|
|
800669a: d004 beq.n 80066a6 <netif_set_default+0x1e>
|
|
800669c: 687b ldr r3, [r7, #4]
|
|
800669e: f893 302e ldrb.w r3, [r3, #46] ; 0x2e
|
|
80066a2: 4619 mov r1, r3
|
|
80066a4: e000 b.n 80066a8 <netif_set_default+0x20>
|
|
80066a6: 2127 movs r1, #39 ; 0x27
|
|
80066a8: 687b ldr r3, [r7, #4]
|
|
80066aa: 2b00 cmp r3, #0
|
|
80066ac: d003 beq.n 80066b6 <netif_set_default+0x2e>
|
|
80066ae: 687b ldr r3, [r7, #4]
|
|
80066b0: f893 302f ldrb.w r3, [r3, #47] ; 0x2f
|
|
80066b4: e000 b.n 80066b8 <netif_set_default+0x30>
|
|
80066b6: 2327 movs r3, #39 ; 0x27
|
|
80066b8: 461a mov r2, r3
|
|
80066ba: 4804 ldr r0, [pc, #16] ; (80066cc <netif_set_default+0x44>)
|
|
80066bc: f00a fa84 bl 8010bc8 <iprintf>
|
|
netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\''));
|
|
}
|
|
80066c0: bf00 nop
|
|
80066c2: 3708 adds r7, #8
|
|
80066c4: 46bd mov sp, r7
|
|
80066c6: bd80 pop {r7, pc}
|
|
80066c8: 24007b64 .word 0x24007b64
|
|
80066cc: 08012400 .word 0x08012400
|
|
|
|
080066d0 <netif_set_up>:
|
|
* Bring an interface up, available for processing
|
|
* traffic.
|
|
*/
|
|
void
|
|
netif_set_up(struct netif *netif)
|
|
{
|
|
80066d0: b580 push {r7, lr}
|
|
80066d2: b082 sub sp, #8
|
|
80066d4: af00 add r7, sp, #0
|
|
80066d6: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ERROR("netif_set_up: invalid netif", netif != NULL, return);
|
|
80066d8: 687b ldr r3, [r7, #4]
|
|
80066da: 2b00 cmp r3, #0
|
|
80066dc: d107 bne.n 80066ee <netif_set_up+0x1e>
|
|
80066de: 4b0f ldr r3, [pc, #60] ; (800671c <netif_set_up+0x4c>)
|
|
80066e0: f44f 7254 mov.w r2, #848 ; 0x350
|
|
80066e4: 490e ldr r1, [pc, #56] ; (8006720 <netif_set_up+0x50>)
|
|
80066e6: 480f ldr r0, [pc, #60] ; (8006724 <netif_set_up+0x54>)
|
|
80066e8: f00a fa6e bl 8010bc8 <iprintf>
|
|
80066ec: e013 b.n 8006716 <netif_set_up+0x46>
|
|
|
|
if (!(netif->flags & NETIF_FLAG_UP)) {
|
|
80066ee: 687b ldr r3, [r7, #4]
|
|
80066f0: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
80066f4: f003 0301 and.w r3, r3, #1
|
|
80066f8: 2b00 cmp r3, #0
|
|
80066fa: d10c bne.n 8006716 <netif_set_up+0x46>
|
|
netif_set_flags(netif, NETIF_FLAG_UP);
|
|
80066fc: 687b ldr r3, [r7, #4]
|
|
80066fe: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
8006702: f043 0301 orr.w r3, r3, #1
|
|
8006706: b2da uxtb r2, r3
|
|
8006708: 687b ldr r3, [r7, #4]
|
|
800670a: f883 202d strb.w r2, [r3, #45] ; 0x2d
|
|
args.status_changed.state = 1;
|
|
netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args);
|
|
}
|
|
#endif
|
|
|
|
netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
|
|
800670e: 2103 movs r1, #3
|
|
8006710: 6878 ldr r0, [r7, #4]
|
|
8006712: f000 f809 bl 8006728 <netif_issue_reports>
|
|
#if LWIP_IPV6
|
|
nd6_restart_netif(netif);
|
|
#endif /* LWIP_IPV6 */
|
|
}
|
|
}
|
|
8006716: 3708 adds r7, #8
|
|
8006718: 46bd mov sp, r7
|
|
800671a: bd80 pop {r7, pc}
|
|
800671c: 08012168 .word 0x08012168
|
|
8006720: 08012428 .word 0x08012428
|
|
8006724: 080121b8 .word 0x080121b8
|
|
|
|
08006728 <netif_issue_reports>:
|
|
|
|
/** Send ARP/IGMP/MLD/RS events, e.g. on link-up/netif-up or addr-change
|
|
*/
|
|
static void
|
|
netif_issue_reports(struct netif *netif, u8_t report_type)
|
|
{
|
|
8006728: b580 push {r7, lr}
|
|
800672a: b082 sub sp, #8
|
|
800672c: af00 add r7, sp, #0
|
|
800672e: 6078 str r0, [r7, #4]
|
|
8006730: 460b mov r3, r1
|
|
8006732: 70fb strb r3, [r7, #3]
|
|
LWIP_ASSERT("netif_issue_reports: invalid netif", netif != NULL);
|
|
8006734: 687b ldr r3, [r7, #4]
|
|
8006736: 2b00 cmp r3, #0
|
|
8006738: d106 bne.n 8006748 <netif_issue_reports+0x20>
|
|
800673a: 4b18 ldr r3, [pc, #96] ; (800679c <netif_issue_reports+0x74>)
|
|
800673c: f240 326d movw r2, #877 ; 0x36d
|
|
8006740: 4917 ldr r1, [pc, #92] ; (80067a0 <netif_issue_reports+0x78>)
|
|
8006742: 4818 ldr r0, [pc, #96] ; (80067a4 <netif_issue_reports+0x7c>)
|
|
8006744: f00a fa40 bl 8010bc8 <iprintf>
|
|
|
|
/* Only send reports when both link and admin states are up */
|
|
if (!(netif->flags & NETIF_FLAG_LINK_UP) ||
|
|
8006748: 687b ldr r3, [r7, #4]
|
|
800674a: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800674e: f003 0304 and.w r3, r3, #4
|
|
8006752: 2b00 cmp r3, #0
|
|
8006754: d01e beq.n 8006794 <netif_issue_reports+0x6c>
|
|
!(netif->flags & NETIF_FLAG_UP)) {
|
|
8006756: 687b ldr r3, [r7, #4]
|
|
8006758: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800675c: f003 0301 and.w r3, r3, #1
|
|
if (!(netif->flags & NETIF_FLAG_LINK_UP) ||
|
|
8006760: 2b00 cmp r3, #0
|
|
8006762: d017 beq.n 8006794 <netif_issue_reports+0x6c>
|
|
return;
|
|
}
|
|
|
|
#if LWIP_IPV4
|
|
if ((report_type & NETIF_REPORT_TYPE_IPV4) &&
|
|
8006764: 78fb ldrb r3, [r7, #3]
|
|
8006766: f003 0301 and.w r3, r3, #1
|
|
800676a: 2b00 cmp r3, #0
|
|
800676c: d013 beq.n 8006796 <netif_issue_reports+0x6e>
|
|
!ip4_addr_isany_val(*netif_ip4_addr(netif))) {
|
|
800676e: 687b ldr r3, [r7, #4]
|
|
8006770: 3304 adds r3, #4
|
|
8006772: 681b ldr r3, [r3, #0]
|
|
if ((report_type & NETIF_REPORT_TYPE_IPV4) &&
|
|
8006774: 2b00 cmp r3, #0
|
|
8006776: d00e beq.n 8006796 <netif_issue_reports+0x6e>
|
|
#if LWIP_ARP
|
|
/* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
|
|
if (netif->flags & (NETIF_FLAG_ETHARP)) {
|
|
8006778: 687b ldr r3, [r7, #4]
|
|
800677a: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800677e: f003 0308 and.w r3, r3, #8
|
|
8006782: 2b00 cmp r3, #0
|
|
8006784: d007 beq.n 8006796 <netif_issue_reports+0x6e>
|
|
etharp_gratuitous(netif);
|
|
8006786: 687b ldr r3, [r7, #4]
|
|
8006788: 3304 adds r3, #4
|
|
800678a: 4619 mov r1, r3
|
|
800678c: 6878 ldr r0, [r7, #4]
|
|
800678e: f008 f91f bl 800e9d0 <etharp_request>
|
|
8006792: e000 b.n 8006796 <netif_issue_reports+0x6e>
|
|
return;
|
|
8006794: bf00 nop
|
|
/* send mld memberships */
|
|
mld6_report_groups(netif);
|
|
#endif /* LWIP_IPV6_MLD */
|
|
}
|
|
#endif /* LWIP_IPV6 */
|
|
}
|
|
8006796: 3708 adds r7, #8
|
|
8006798: 46bd mov sp, r7
|
|
800679a: bd80 pop {r7, pc}
|
|
800679c: 08012168 .word 0x08012168
|
|
80067a0: 08012444 .word 0x08012444
|
|
80067a4: 080121b8 .word 0x080121b8
|
|
|
|
080067a8 <netif_set_down>:
|
|
* @ingroup netif
|
|
* Bring an interface down, disabling any traffic processing.
|
|
*/
|
|
void
|
|
netif_set_down(struct netif *netif)
|
|
{
|
|
80067a8: b580 push {r7, lr}
|
|
80067aa: b082 sub sp, #8
|
|
80067ac: af00 add r7, sp, #0
|
|
80067ae: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ERROR("netif_set_down: invalid netif", netif != NULL, return);
|
|
80067b0: 687b ldr r3, [r7, #4]
|
|
80067b2: 2b00 cmp r3, #0
|
|
80067b4: d107 bne.n 80067c6 <netif_set_down+0x1e>
|
|
80067b6: 4b12 ldr r3, [pc, #72] ; (8006800 <netif_set_down+0x58>)
|
|
80067b8: f240 329b movw r2, #923 ; 0x39b
|
|
80067bc: 4911 ldr r1, [pc, #68] ; (8006804 <netif_set_down+0x5c>)
|
|
80067be: 4812 ldr r0, [pc, #72] ; (8006808 <netif_set_down+0x60>)
|
|
80067c0: f00a fa02 bl 8010bc8 <iprintf>
|
|
80067c4: e019 b.n 80067fa <netif_set_down+0x52>
|
|
|
|
if (netif->flags & NETIF_FLAG_UP) {
|
|
80067c6: 687b ldr r3, [r7, #4]
|
|
80067c8: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
80067cc: f003 0301 and.w r3, r3, #1
|
|
80067d0: 2b00 cmp r3, #0
|
|
80067d2: d012 beq.n 80067fa <netif_set_down+0x52>
|
|
args.status_changed.state = 0;
|
|
netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args);
|
|
}
|
|
#endif
|
|
|
|
netif_clear_flags(netif, NETIF_FLAG_UP);
|
|
80067d4: 687b ldr r3, [r7, #4]
|
|
80067d6: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
80067da: f023 0301 bic.w r3, r3, #1
|
|
80067de: b2da uxtb r2, r3
|
|
80067e0: 687b ldr r3, [r7, #4]
|
|
80067e2: f883 202d strb.w r2, [r3, #45] ; 0x2d
|
|
MIB2_COPY_SYSUPTIME_TO(&netif->ts);
|
|
|
|
#if LWIP_IPV4 && LWIP_ARP
|
|
if (netif->flags & NETIF_FLAG_ETHARP) {
|
|
80067e6: 687b ldr r3, [r7, #4]
|
|
80067e8: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
80067ec: f003 0308 and.w r3, r3, #8
|
|
80067f0: 2b00 cmp r3, #0
|
|
80067f2: d002 beq.n 80067fa <netif_set_down+0x52>
|
|
etharp_cleanup_netif(netif);
|
|
80067f4: 6878 ldr r0, [r7, #4]
|
|
80067f6: f007 fca9 bl 800e14c <etharp_cleanup_netif>
|
|
nd6_cleanup_netif(netif);
|
|
#endif /* LWIP_IPV6 */
|
|
|
|
NETIF_STATUS_CALLBACK(netif);
|
|
}
|
|
}
|
|
80067fa: 3708 adds r7, #8
|
|
80067fc: 46bd mov sp, r7
|
|
80067fe: bd80 pop {r7, pc}
|
|
8006800: 08012168 .word 0x08012168
|
|
8006804: 08012468 .word 0x08012468
|
|
8006808: 080121b8 .word 0x080121b8
|
|
|
|
0800680c <netif_set_link_up>:
|
|
* @ingroup netif
|
|
* Called by a driver when its link goes up
|
|
*/
|
|
void
|
|
netif_set_link_up(struct netif *netif)
|
|
{
|
|
800680c: b580 push {r7, lr}
|
|
800680e: b082 sub sp, #8
|
|
8006810: af00 add r7, sp, #0
|
|
8006812: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ERROR("netif_set_link_up: invalid netif", netif != NULL, return);
|
|
8006814: 687b ldr r3, [r7, #4]
|
|
8006816: 2b00 cmp r3, #0
|
|
8006818: d107 bne.n 800682a <netif_set_link_up+0x1e>
|
|
800681a: 4b13 ldr r3, [pc, #76] ; (8006868 <netif_set_link_up+0x5c>)
|
|
800681c: f44f 7278 mov.w r2, #992 ; 0x3e0
|
|
8006820: 4912 ldr r1, [pc, #72] ; (800686c <netif_set_link_up+0x60>)
|
|
8006822: 4813 ldr r0, [pc, #76] ; (8006870 <netif_set_link_up+0x64>)
|
|
8006824: f00a f9d0 bl 8010bc8 <iprintf>
|
|
8006828: e01b b.n 8006862 <netif_set_link_up+0x56>
|
|
|
|
if (!(netif->flags & NETIF_FLAG_LINK_UP)) {
|
|
800682a: 687b ldr r3, [r7, #4]
|
|
800682c: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
8006830: f003 0304 and.w r3, r3, #4
|
|
8006834: 2b00 cmp r3, #0
|
|
8006836: d114 bne.n 8006862 <netif_set_link_up+0x56>
|
|
netif_set_flags(netif, NETIF_FLAG_LINK_UP);
|
|
8006838: 687b ldr r3, [r7, #4]
|
|
800683a: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800683e: f043 0304 orr.w r3, r3, #4
|
|
8006842: b2da uxtb r2, r3
|
|
8006844: 687b ldr r3, [r7, #4]
|
|
8006846: f883 202d strb.w r2, [r3, #45] ; 0x2d
|
|
|
|
#if LWIP_AUTOIP
|
|
autoip_network_changed(netif);
|
|
#endif /* LWIP_AUTOIP */
|
|
|
|
netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
|
|
800684a: 2103 movs r1, #3
|
|
800684c: 6878 ldr r0, [r7, #4]
|
|
800684e: f7ff ff6b bl 8006728 <netif_issue_reports>
|
|
#if LWIP_IPV6
|
|
nd6_restart_netif(netif);
|
|
#endif /* LWIP_IPV6 */
|
|
|
|
NETIF_LINK_CALLBACK(netif);
|
|
8006852: 687b ldr r3, [r7, #4]
|
|
8006854: 69db ldr r3, [r3, #28]
|
|
8006856: 2b00 cmp r3, #0
|
|
8006858: d003 beq.n 8006862 <netif_set_link_up+0x56>
|
|
800685a: 687b ldr r3, [r7, #4]
|
|
800685c: 69db ldr r3, [r3, #28]
|
|
800685e: 6878 ldr r0, [r7, #4]
|
|
8006860: 4798 blx r3
|
|
args.link_changed.state = 1;
|
|
netif_invoke_ext_callback(netif, LWIP_NSC_LINK_CHANGED, &args);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
8006862: 3708 adds r7, #8
|
|
8006864: 46bd mov sp, r7
|
|
8006866: bd80 pop {r7, pc}
|
|
8006868: 08012168 .word 0x08012168
|
|
800686c: 08012488 .word 0x08012488
|
|
8006870: 080121b8 .word 0x080121b8
|
|
|
|
08006874 <netif_set_link_down>:
|
|
* @ingroup netif
|
|
* Called by a driver when its link goes down
|
|
*/
|
|
void
|
|
netif_set_link_down(struct netif *netif)
|
|
{
|
|
8006874: b580 push {r7, lr}
|
|
8006876: b082 sub sp, #8
|
|
8006878: af00 add r7, sp, #0
|
|
800687a: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ERROR("netif_set_link_down: invalid netif", netif != NULL, return);
|
|
800687c: 687b ldr r3, [r7, #4]
|
|
800687e: 2b00 cmp r3, #0
|
|
8006880: d107 bne.n 8006892 <netif_set_link_down+0x1e>
|
|
8006882: 4b11 ldr r3, [pc, #68] ; (80068c8 <netif_set_link_down+0x54>)
|
|
8006884: f240 4206 movw r2, #1030 ; 0x406
|
|
8006888: 4910 ldr r1, [pc, #64] ; (80068cc <netif_set_link_down+0x58>)
|
|
800688a: 4811 ldr r0, [pc, #68] ; (80068d0 <netif_set_link_down+0x5c>)
|
|
800688c: f00a f99c bl 8010bc8 <iprintf>
|
|
8006890: e017 b.n 80068c2 <netif_set_link_down+0x4e>
|
|
|
|
if (netif->flags & NETIF_FLAG_LINK_UP) {
|
|
8006892: 687b ldr r3, [r7, #4]
|
|
8006894: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
8006898: f003 0304 and.w r3, r3, #4
|
|
800689c: 2b00 cmp r3, #0
|
|
800689e: d010 beq.n 80068c2 <netif_set_link_down+0x4e>
|
|
netif_clear_flags(netif, NETIF_FLAG_LINK_UP);
|
|
80068a0: 687b ldr r3, [r7, #4]
|
|
80068a2: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
80068a6: f023 0304 bic.w r3, r3, #4
|
|
80068aa: b2da uxtb r2, r3
|
|
80068ac: 687b ldr r3, [r7, #4]
|
|
80068ae: f883 202d strb.w r2, [r3, #45] ; 0x2d
|
|
NETIF_LINK_CALLBACK(netif);
|
|
80068b2: 687b ldr r3, [r7, #4]
|
|
80068b4: 69db ldr r3, [r3, #28]
|
|
80068b6: 2b00 cmp r3, #0
|
|
80068b8: d003 beq.n 80068c2 <netif_set_link_down+0x4e>
|
|
80068ba: 687b ldr r3, [r7, #4]
|
|
80068bc: 69db ldr r3, [r3, #28]
|
|
80068be: 6878 ldr r0, [r7, #4]
|
|
80068c0: 4798 blx r3
|
|
args.link_changed.state = 0;
|
|
netif_invoke_ext_callback(netif, LWIP_NSC_LINK_CHANGED, &args);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
80068c2: 3708 adds r7, #8
|
|
80068c4: 46bd mov sp, r7
|
|
80068c6: bd80 pop {r7, pc}
|
|
80068c8: 08012168 .word 0x08012168
|
|
80068cc: 080124ac .word 0x080124ac
|
|
80068d0: 080121b8 .word 0x080121b8
|
|
|
|
080068d4 <netif_set_link_callback>:
|
|
* @ingroup netif
|
|
* Set callback to be called when link is brought up/down
|
|
*/
|
|
void
|
|
netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback)
|
|
{
|
|
80068d4: b480 push {r7}
|
|
80068d6: b083 sub sp, #12
|
|
80068d8: af00 add r7, sp, #0
|
|
80068da: 6078 str r0, [r7, #4]
|
|
80068dc: 6039 str r1, [r7, #0]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
if (netif) {
|
|
80068de: 687b ldr r3, [r7, #4]
|
|
80068e0: 2b00 cmp r3, #0
|
|
80068e2: d002 beq.n 80068ea <netif_set_link_callback+0x16>
|
|
netif->link_callback = link_callback;
|
|
80068e4: 687b ldr r3, [r7, #4]
|
|
80068e6: 683a ldr r2, [r7, #0]
|
|
80068e8: 61da str r2, [r3, #28]
|
|
}
|
|
}
|
|
80068ea: bf00 nop
|
|
80068ec: 370c adds r7, #12
|
|
80068ee: 46bd mov sp, r7
|
|
80068f0: f85d 7b04 ldr.w r7, [sp], #4
|
|
80068f4: 4770 bx lr
|
|
|
|
080068f6 <netif_null_output_ip4>:
|
|
#if LWIP_IPV4
|
|
/** Dummy IPv4 output function for netifs not supporting IPv4
|
|
*/
|
|
static err_t
|
|
netif_null_output_ip4(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr)
|
|
{
|
|
80068f6: b480 push {r7}
|
|
80068f8: b085 sub sp, #20
|
|
80068fa: af00 add r7, sp, #0
|
|
80068fc: 60f8 str r0, [r7, #12]
|
|
80068fe: 60b9 str r1, [r7, #8]
|
|
8006900: 607a str r2, [r7, #4]
|
|
LWIP_UNUSED_ARG(netif);
|
|
LWIP_UNUSED_ARG(p);
|
|
LWIP_UNUSED_ARG(ipaddr);
|
|
|
|
return ERR_IF;
|
|
8006902: f06f 030b mvn.w r3, #11
|
|
}
|
|
8006906: 4618 mov r0, r3
|
|
8006908: 3714 adds r7, #20
|
|
800690a: 46bd mov sp, r7
|
|
800690c: f85d 7b04 ldr.w r7, [sp], #4
|
|
8006910: 4770 bx lr
|
|
...
|
|
|
|
08006914 <netif_get_by_index>:
|
|
*
|
|
* @param idx index of netif to find
|
|
*/
|
|
struct netif *
|
|
netif_get_by_index(u8_t idx)
|
|
{
|
|
8006914: b480 push {r7}
|
|
8006916: b085 sub sp, #20
|
|
8006918: af00 add r7, sp, #0
|
|
800691a: 4603 mov r3, r0
|
|
800691c: 71fb strb r3, [r7, #7]
|
|
struct netif *netif;
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
if (idx != NETIF_NO_INDEX) {
|
|
800691e: 79fb ldrb r3, [r7, #7]
|
|
8006920: 2b00 cmp r3, #0
|
|
8006922: d013 beq.n 800694c <netif_get_by_index+0x38>
|
|
NETIF_FOREACH(netif) {
|
|
8006924: 4b0d ldr r3, [pc, #52] ; (800695c <netif_get_by_index+0x48>)
|
|
8006926: 681b ldr r3, [r3, #0]
|
|
8006928: 60fb str r3, [r7, #12]
|
|
800692a: e00c b.n 8006946 <netif_get_by_index+0x32>
|
|
if (idx == netif_get_index(netif)) {
|
|
800692c: 68fb ldr r3, [r7, #12]
|
|
800692e: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
8006932: 3301 adds r3, #1
|
|
8006934: b2db uxtb r3, r3
|
|
8006936: 79fa ldrb r2, [r7, #7]
|
|
8006938: 429a cmp r2, r3
|
|
800693a: d101 bne.n 8006940 <netif_get_by_index+0x2c>
|
|
return netif; /* found! */
|
|
800693c: 68fb ldr r3, [r7, #12]
|
|
800693e: e006 b.n 800694e <netif_get_by_index+0x3a>
|
|
NETIF_FOREACH(netif) {
|
|
8006940: 68fb ldr r3, [r7, #12]
|
|
8006942: 681b ldr r3, [r3, #0]
|
|
8006944: 60fb str r3, [r7, #12]
|
|
8006946: 68fb ldr r3, [r7, #12]
|
|
8006948: 2b00 cmp r3, #0
|
|
800694a: d1ef bne.n 800692c <netif_get_by_index+0x18>
|
|
}
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
800694c: 2300 movs r3, #0
|
|
}
|
|
800694e: 4618 mov r0, r3
|
|
8006950: 3714 adds r7, #20
|
|
8006952: 46bd mov sp, r7
|
|
8006954: f85d 7b04 ldr.w r7, [sp], #4
|
|
8006958: 4770 bx lr
|
|
800695a: bf00 nop
|
|
800695c: 24007b60 .word 0x24007b60
|
|
|
|
08006960 <pbuf_free_ooseq>:
|
|
#if !NO_SYS
|
|
static
|
|
#endif /* !NO_SYS */
|
|
void
|
|
pbuf_free_ooseq(void)
|
|
{
|
|
8006960: b580 push {r7, lr}
|
|
8006962: b082 sub sp, #8
|
|
8006964: af00 add r7, sp, #0
|
|
struct tcp_pcb *pcb;
|
|
SYS_ARCH_SET(pbuf_free_ooseq_pending, 0);
|
|
8006966: 4b0c ldr r3, [pc, #48] ; (8006998 <pbuf_free_ooseq+0x38>)
|
|
8006968: 2200 movs r2, #0
|
|
800696a: 701a strb r2, [r3, #0]
|
|
|
|
for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) {
|
|
800696c: 4b0b ldr r3, [pc, #44] ; (800699c <pbuf_free_ooseq+0x3c>)
|
|
800696e: 681b ldr r3, [r3, #0]
|
|
8006970: 607b str r3, [r7, #4]
|
|
8006972: e00a b.n 800698a <pbuf_free_ooseq+0x2a>
|
|
if (pcb->ooseq != NULL) {
|
|
8006974: 687b ldr r3, [r7, #4]
|
|
8006976: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
8006978: 2b00 cmp r3, #0
|
|
800697a: d003 beq.n 8006984 <pbuf_free_ooseq+0x24>
|
|
/** Free the ooseq pbufs of one PCB only */
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free_ooseq: freeing out-of-sequence pbufs\n"));
|
|
tcp_free_ooseq(pcb);
|
|
800697c: 6878 ldr r0, [r7, #4]
|
|
800697e: f002 fb21 bl 8008fc4 <tcp_free_ooseq>
|
|
return;
|
|
8006982: e005 b.n 8006990 <pbuf_free_ooseq+0x30>
|
|
for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) {
|
|
8006984: 687b ldr r3, [r7, #4]
|
|
8006986: 68db ldr r3, [r3, #12]
|
|
8006988: 607b str r3, [r7, #4]
|
|
800698a: 687b ldr r3, [r7, #4]
|
|
800698c: 2b00 cmp r3, #0
|
|
800698e: d1f1 bne.n 8006974 <pbuf_free_ooseq+0x14>
|
|
}
|
|
}
|
|
}
|
|
8006990: 3708 adds r7, #8
|
|
8006992: 46bd mov sp, r7
|
|
8006994: bd80 pop {r7, pc}
|
|
8006996: bf00 nop
|
|
8006998: 24007b69 .word 0x24007b69
|
|
800699c: 24007b78 .word 0x24007b78
|
|
|
|
080069a0 <pbuf_pool_is_empty>:
|
|
#endif /* !NO_SYS */
|
|
|
|
/** Queue a call to pbuf_free_ooseq if not already queued. */
|
|
static void
|
|
pbuf_pool_is_empty(void)
|
|
{
|
|
80069a0: b480 push {r7}
|
|
80069a2: af00 add r7, sp, #0
|
|
#ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL
|
|
SYS_ARCH_SET(pbuf_free_ooseq_pending, 1);
|
|
80069a4: 4b03 ldr r3, [pc, #12] ; (80069b4 <pbuf_pool_is_empty+0x14>)
|
|
80069a6: 2201 movs r2, #1
|
|
80069a8: 701a strb r2, [r3, #0]
|
|
if (!queued) {
|
|
/* queue a call to pbuf_free_ooseq if not already queued */
|
|
PBUF_POOL_FREE_OOSEQ_QUEUE_CALL();
|
|
}
|
|
#endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */
|
|
}
|
|
80069aa: bf00 nop
|
|
80069ac: 46bd mov sp, r7
|
|
80069ae: f85d 7b04 ldr.w r7, [sp], #4
|
|
80069b2: 4770 bx lr
|
|
80069b4: 24007b69 .word 0x24007b69
|
|
|
|
080069b8 <pbuf_init_alloced_pbuf>:
|
|
#endif /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */
|
|
|
|
/* Initialize members of struct pbuf after allocation */
|
|
static void
|
|
pbuf_init_alloced_pbuf(struct pbuf *p, void *payload, u16_t tot_len, u16_t len, pbuf_type type, u8_t flags)
|
|
{
|
|
80069b8: b480 push {r7}
|
|
80069ba: b085 sub sp, #20
|
|
80069bc: af00 add r7, sp, #0
|
|
80069be: 60f8 str r0, [r7, #12]
|
|
80069c0: 60b9 str r1, [r7, #8]
|
|
80069c2: 4611 mov r1, r2
|
|
80069c4: 461a mov r2, r3
|
|
80069c6: 460b mov r3, r1
|
|
80069c8: 80fb strh r3, [r7, #6]
|
|
80069ca: 4613 mov r3, r2
|
|
80069cc: 80bb strh r3, [r7, #4]
|
|
p->next = NULL;
|
|
80069ce: 68fb ldr r3, [r7, #12]
|
|
80069d0: 2200 movs r2, #0
|
|
80069d2: 601a str r2, [r3, #0]
|
|
p->payload = payload;
|
|
80069d4: 68fb ldr r3, [r7, #12]
|
|
80069d6: 68ba ldr r2, [r7, #8]
|
|
80069d8: 605a str r2, [r3, #4]
|
|
p->tot_len = tot_len;
|
|
80069da: 68fb ldr r3, [r7, #12]
|
|
80069dc: 88fa ldrh r2, [r7, #6]
|
|
80069de: 811a strh r2, [r3, #8]
|
|
p->len = len;
|
|
80069e0: 68fb ldr r3, [r7, #12]
|
|
80069e2: 88ba ldrh r2, [r7, #4]
|
|
80069e4: 815a strh r2, [r3, #10]
|
|
p->type_internal = (u8_t)type;
|
|
80069e6: 8b3b ldrh r3, [r7, #24]
|
|
80069e8: b2da uxtb r2, r3
|
|
80069ea: 68fb ldr r3, [r7, #12]
|
|
80069ec: 731a strb r2, [r3, #12]
|
|
p->flags = flags;
|
|
80069ee: 68fb ldr r3, [r7, #12]
|
|
80069f0: 7f3a ldrb r2, [r7, #28]
|
|
80069f2: 735a strb r2, [r3, #13]
|
|
p->ref = 1;
|
|
80069f4: 68fb ldr r3, [r7, #12]
|
|
80069f6: 2201 movs r2, #1
|
|
80069f8: 739a strb r2, [r3, #14]
|
|
p->if_idx = NETIF_NO_INDEX;
|
|
80069fa: 68fb ldr r3, [r7, #12]
|
|
80069fc: 2200 movs r2, #0
|
|
80069fe: 73da strb r2, [r3, #15]
|
|
}
|
|
8006a00: bf00 nop
|
|
8006a02: 3714 adds r7, #20
|
|
8006a04: 46bd mov sp, r7
|
|
8006a06: f85d 7b04 ldr.w r7, [sp], #4
|
|
8006a0a: 4770 bx lr
|
|
|
|
08006a0c <pbuf_alloc>:
|
|
* @return the allocated pbuf. If multiple pbufs where allocated, this
|
|
* is the first pbuf of a pbuf chain.
|
|
*/
|
|
struct pbuf *
|
|
pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
|
|
{
|
|
8006a0c: b580 push {r7, lr}
|
|
8006a0e: b08c sub sp, #48 ; 0x30
|
|
8006a10: af02 add r7, sp, #8
|
|
8006a12: 4603 mov r3, r0
|
|
8006a14: 71fb strb r3, [r7, #7]
|
|
8006a16: 460b mov r3, r1
|
|
8006a18: 80bb strh r3, [r7, #4]
|
|
8006a1a: 4613 mov r3, r2
|
|
8006a1c: 807b strh r3, [r7, #2]
|
|
struct pbuf *p;
|
|
u16_t offset = (u16_t)layer;
|
|
8006a1e: 79fb ldrb r3, [r7, #7]
|
|
8006a20: 847b strh r3, [r7, #34] ; 0x22
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length));
|
|
|
|
switch (type) {
|
|
8006a22: 887b ldrh r3, [r7, #2]
|
|
8006a24: f5b3 7f20 cmp.w r3, #640 ; 0x280
|
|
8006a28: d07f beq.n 8006b2a <pbuf_alloc+0x11e>
|
|
8006a2a: f5b3 7f20 cmp.w r3, #640 ; 0x280
|
|
8006a2e: f300 80c8 bgt.w 8006bc2 <pbuf_alloc+0x1b6>
|
|
8006a32: f5b3 7fc1 cmp.w r3, #386 ; 0x182
|
|
8006a36: d010 beq.n 8006a5a <pbuf_alloc+0x4e>
|
|
8006a38: f5b3 7fc1 cmp.w r3, #386 ; 0x182
|
|
8006a3c: f300 80c1 bgt.w 8006bc2 <pbuf_alloc+0x1b6>
|
|
8006a40: 2b01 cmp r3, #1
|
|
8006a42: d002 beq.n 8006a4a <pbuf_alloc+0x3e>
|
|
8006a44: 2b41 cmp r3, #65 ; 0x41
|
|
8006a46: f040 80bc bne.w 8006bc2 <pbuf_alloc+0x1b6>
|
|
case PBUF_REF: /* fall through */
|
|
case PBUF_ROM:
|
|
p = pbuf_alloc_reference(NULL, length, type);
|
|
8006a4a: 887a ldrh r2, [r7, #2]
|
|
8006a4c: 88bb ldrh r3, [r7, #4]
|
|
8006a4e: 4619 mov r1, r3
|
|
8006a50: 2000 movs r0, #0
|
|
8006a52: f000 f8d1 bl 8006bf8 <pbuf_alloc_reference>
|
|
8006a56: 6278 str r0, [r7, #36] ; 0x24
|
|
break;
|
|
8006a58: e0bd b.n 8006bd6 <pbuf_alloc+0x1ca>
|
|
case PBUF_POOL: {
|
|
struct pbuf *q, *last;
|
|
u16_t rem_len; /* remaining length */
|
|
p = NULL;
|
|
8006a5a: 2300 movs r3, #0
|
|
8006a5c: 627b str r3, [r7, #36] ; 0x24
|
|
last = NULL;
|
|
8006a5e: 2300 movs r3, #0
|
|
8006a60: 61fb str r3, [r7, #28]
|
|
rem_len = length;
|
|
8006a62: 88bb ldrh r3, [r7, #4]
|
|
8006a64: 837b strh r3, [r7, #26]
|
|
do {
|
|
u16_t qlen;
|
|
q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
|
|
8006a66: 2008 movs r0, #8
|
|
8006a68: f7ff fad8 bl 800601c <memp_malloc>
|
|
8006a6c: 6138 str r0, [r7, #16]
|
|
if (q == NULL) {
|
|
8006a6e: 693b ldr r3, [r7, #16]
|
|
8006a70: 2b00 cmp r3, #0
|
|
8006a72: d109 bne.n 8006a88 <pbuf_alloc+0x7c>
|
|
PBUF_POOL_IS_EMPTY();
|
|
8006a74: f7ff ff94 bl 80069a0 <pbuf_pool_is_empty>
|
|
/* free chain so far allocated */
|
|
if (p) {
|
|
8006a78: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8006a7a: 2b00 cmp r3, #0
|
|
8006a7c: d002 beq.n 8006a84 <pbuf_alloc+0x78>
|
|
pbuf_free(p);
|
|
8006a7e: 6a78 ldr r0, [r7, #36] ; 0x24
|
|
8006a80: f000 faa8 bl 8006fd4 <pbuf_free>
|
|
}
|
|
/* bail out unsuccessfully */
|
|
return NULL;
|
|
8006a84: 2300 movs r3, #0
|
|
8006a86: e0a7 b.n 8006bd8 <pbuf_alloc+0x1cc>
|
|
}
|
|
qlen = LWIP_MIN(rem_len, (u16_t)(PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)));
|
|
8006a88: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
8006a8a: 3303 adds r3, #3
|
|
8006a8c: b29b uxth r3, r3
|
|
8006a8e: f023 0303 bic.w r3, r3, #3
|
|
8006a92: b29b uxth r3, r3
|
|
8006a94: f5c3 7314 rsb r3, r3, #592 ; 0x250
|
|
8006a98: b29b uxth r3, r3
|
|
8006a9a: 8b7a ldrh r2, [r7, #26]
|
|
8006a9c: 4293 cmp r3, r2
|
|
8006a9e: bf28 it cs
|
|
8006aa0: 4613 movcs r3, r2
|
|
8006aa2: 81fb strh r3, [r7, #14]
|
|
pbuf_init_alloced_pbuf(q, LWIP_MEM_ALIGN((void *)((u8_t *)q + SIZEOF_STRUCT_PBUF + offset)),
|
|
8006aa4: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
8006aa6: 3310 adds r3, #16
|
|
8006aa8: 693a ldr r2, [r7, #16]
|
|
8006aaa: 4413 add r3, r2
|
|
8006aac: 3303 adds r3, #3
|
|
8006aae: f023 0303 bic.w r3, r3, #3
|
|
8006ab2: 4618 mov r0, r3
|
|
8006ab4: 89f9 ldrh r1, [r7, #14]
|
|
8006ab6: 8b7a ldrh r2, [r7, #26]
|
|
8006ab8: 2300 movs r3, #0
|
|
8006aba: 9301 str r3, [sp, #4]
|
|
8006abc: 887b ldrh r3, [r7, #2]
|
|
8006abe: 9300 str r3, [sp, #0]
|
|
8006ac0: 460b mov r3, r1
|
|
8006ac2: 4601 mov r1, r0
|
|
8006ac4: 6938 ldr r0, [r7, #16]
|
|
8006ac6: f7ff ff77 bl 80069b8 <pbuf_init_alloced_pbuf>
|
|
rem_len, qlen, type, 0);
|
|
LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
|
|
8006aca: 693b ldr r3, [r7, #16]
|
|
8006acc: 685b ldr r3, [r3, #4]
|
|
8006ace: f003 0303 and.w r3, r3, #3
|
|
8006ad2: 2b00 cmp r3, #0
|
|
8006ad4: d006 beq.n 8006ae4 <pbuf_alloc+0xd8>
|
|
8006ad6: 4b42 ldr r3, [pc, #264] ; (8006be0 <pbuf_alloc+0x1d4>)
|
|
8006ad8: f44f 7280 mov.w r2, #256 ; 0x100
|
|
8006adc: 4941 ldr r1, [pc, #260] ; (8006be4 <pbuf_alloc+0x1d8>)
|
|
8006ade: 4842 ldr r0, [pc, #264] ; (8006be8 <pbuf_alloc+0x1dc>)
|
|
8006ae0: f00a f872 bl 8010bc8 <iprintf>
|
|
((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
|
|
LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
|
|
8006ae4: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
8006ae6: 3303 adds r3, #3
|
|
8006ae8: f023 0303 bic.w r3, r3, #3
|
|
8006aec: f5b3 7f14 cmp.w r3, #592 ; 0x250
|
|
8006af0: d106 bne.n 8006b00 <pbuf_alloc+0xf4>
|
|
8006af2: 4b3b ldr r3, [pc, #236] ; (8006be0 <pbuf_alloc+0x1d4>)
|
|
8006af4: f44f 7281 mov.w r2, #258 ; 0x102
|
|
8006af8: 493c ldr r1, [pc, #240] ; (8006bec <pbuf_alloc+0x1e0>)
|
|
8006afa: 483b ldr r0, [pc, #236] ; (8006be8 <pbuf_alloc+0x1dc>)
|
|
8006afc: f00a f864 bl 8010bc8 <iprintf>
|
|
(PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
|
|
if (p == NULL) {
|
|
8006b00: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8006b02: 2b00 cmp r3, #0
|
|
8006b04: d102 bne.n 8006b0c <pbuf_alloc+0x100>
|
|
/* allocated head of pbuf chain (into p) */
|
|
p = q;
|
|
8006b06: 693b ldr r3, [r7, #16]
|
|
8006b08: 627b str r3, [r7, #36] ; 0x24
|
|
8006b0a: e002 b.n 8006b12 <pbuf_alloc+0x106>
|
|
} else {
|
|
/* make previous pbuf point to this pbuf */
|
|
last->next = q;
|
|
8006b0c: 69fb ldr r3, [r7, #28]
|
|
8006b0e: 693a ldr r2, [r7, #16]
|
|
8006b10: 601a str r2, [r3, #0]
|
|
}
|
|
last = q;
|
|
8006b12: 693b ldr r3, [r7, #16]
|
|
8006b14: 61fb str r3, [r7, #28]
|
|
rem_len = (u16_t)(rem_len - qlen);
|
|
8006b16: 8b7a ldrh r2, [r7, #26]
|
|
8006b18: 89fb ldrh r3, [r7, #14]
|
|
8006b1a: 1ad3 subs r3, r2, r3
|
|
8006b1c: 837b strh r3, [r7, #26]
|
|
offset = 0;
|
|
8006b1e: 2300 movs r3, #0
|
|
8006b20: 847b strh r3, [r7, #34] ; 0x22
|
|
} while (rem_len > 0);
|
|
8006b22: 8b7b ldrh r3, [r7, #26]
|
|
8006b24: 2b00 cmp r3, #0
|
|
8006b26: d19e bne.n 8006a66 <pbuf_alloc+0x5a>
|
|
break;
|
|
8006b28: e055 b.n 8006bd6 <pbuf_alloc+0x1ca>
|
|
}
|
|
case PBUF_RAM: {
|
|
u16_t payload_len = (u16_t)(LWIP_MEM_ALIGN_SIZE(offset) + LWIP_MEM_ALIGN_SIZE(length));
|
|
8006b2a: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
8006b2c: 3303 adds r3, #3
|
|
8006b2e: b29b uxth r3, r3
|
|
8006b30: f023 0303 bic.w r3, r3, #3
|
|
8006b34: b29a uxth r2, r3
|
|
8006b36: 88bb ldrh r3, [r7, #4]
|
|
8006b38: 3303 adds r3, #3
|
|
8006b3a: b29b uxth r3, r3
|
|
8006b3c: f023 0303 bic.w r3, r3, #3
|
|
8006b40: b29b uxth r3, r3
|
|
8006b42: 4413 add r3, r2
|
|
8006b44: 833b strh r3, [r7, #24]
|
|
mem_size_t alloc_len = (mem_size_t)(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF) + payload_len);
|
|
8006b46: 8b3b ldrh r3, [r7, #24]
|
|
8006b48: 3310 adds r3, #16
|
|
8006b4a: 82fb strh r3, [r7, #22]
|
|
|
|
/* bug #50040: Check for integer overflow when calculating alloc_len */
|
|
if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) ||
|
|
8006b4c: 8b3a ldrh r2, [r7, #24]
|
|
8006b4e: 88bb ldrh r3, [r7, #4]
|
|
8006b50: 3303 adds r3, #3
|
|
8006b52: f023 0303 bic.w r3, r3, #3
|
|
8006b56: 429a cmp r2, r3
|
|
8006b58: d306 bcc.n 8006b68 <pbuf_alloc+0x15c>
|
|
(alloc_len < LWIP_MEM_ALIGN_SIZE(length))) {
|
|
8006b5a: 8afa ldrh r2, [r7, #22]
|
|
8006b5c: 88bb ldrh r3, [r7, #4]
|
|
8006b5e: 3303 adds r3, #3
|
|
8006b60: f023 0303 bic.w r3, r3, #3
|
|
if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) ||
|
|
8006b64: 429a cmp r2, r3
|
|
8006b66: d201 bcs.n 8006b6c <pbuf_alloc+0x160>
|
|
return NULL;
|
|
8006b68: 2300 movs r3, #0
|
|
8006b6a: e035 b.n 8006bd8 <pbuf_alloc+0x1cc>
|
|
}
|
|
|
|
/* If pbuf is to be allocated in RAM, allocate memory for it. */
|
|
p = (struct pbuf *)mem_malloc(alloc_len);
|
|
8006b6c: 8afb ldrh r3, [r7, #22]
|
|
8006b6e: 4618 mov r0, r3
|
|
8006b70: f7ff f8b0 bl 8005cd4 <mem_malloc>
|
|
8006b74: 6278 str r0, [r7, #36] ; 0x24
|
|
if (p == NULL) {
|
|
8006b76: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8006b78: 2b00 cmp r3, #0
|
|
8006b7a: d101 bne.n 8006b80 <pbuf_alloc+0x174>
|
|
return NULL;
|
|
8006b7c: 2300 movs r3, #0
|
|
8006b7e: e02b b.n 8006bd8 <pbuf_alloc+0x1cc>
|
|
}
|
|
pbuf_init_alloced_pbuf(p, LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)),
|
|
8006b80: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
8006b82: 3310 adds r3, #16
|
|
8006b84: 6a7a ldr r2, [r7, #36] ; 0x24
|
|
8006b86: 4413 add r3, r2
|
|
8006b88: 3303 adds r3, #3
|
|
8006b8a: f023 0303 bic.w r3, r3, #3
|
|
8006b8e: 4618 mov r0, r3
|
|
8006b90: 88b9 ldrh r1, [r7, #4]
|
|
8006b92: 88ba ldrh r2, [r7, #4]
|
|
8006b94: 2300 movs r3, #0
|
|
8006b96: 9301 str r3, [sp, #4]
|
|
8006b98: 887b ldrh r3, [r7, #2]
|
|
8006b9a: 9300 str r3, [sp, #0]
|
|
8006b9c: 460b mov r3, r1
|
|
8006b9e: 4601 mov r1, r0
|
|
8006ba0: 6a78 ldr r0, [r7, #36] ; 0x24
|
|
8006ba2: f7ff ff09 bl 80069b8 <pbuf_init_alloced_pbuf>
|
|
length, length, type, 0);
|
|
LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned",
|
|
8006ba6: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8006ba8: 685b ldr r3, [r3, #4]
|
|
8006baa: f003 0303 and.w r3, r3, #3
|
|
8006bae: 2b00 cmp r3, #0
|
|
8006bb0: d010 beq.n 8006bd4 <pbuf_alloc+0x1c8>
|
|
8006bb2: 4b0b ldr r3, [pc, #44] ; (8006be0 <pbuf_alloc+0x1d4>)
|
|
8006bb4: f44f 7291 mov.w r2, #290 ; 0x122
|
|
8006bb8: 490d ldr r1, [pc, #52] ; (8006bf0 <pbuf_alloc+0x1e4>)
|
|
8006bba: 480b ldr r0, [pc, #44] ; (8006be8 <pbuf_alloc+0x1dc>)
|
|
8006bbc: f00a f804 bl 8010bc8 <iprintf>
|
|
((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
|
|
break;
|
|
8006bc0: e008 b.n 8006bd4 <pbuf_alloc+0x1c8>
|
|
}
|
|
default:
|
|
LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
|
|
8006bc2: 4b07 ldr r3, [pc, #28] ; (8006be0 <pbuf_alloc+0x1d4>)
|
|
8006bc4: f240 1227 movw r2, #295 ; 0x127
|
|
8006bc8: 490a ldr r1, [pc, #40] ; (8006bf4 <pbuf_alloc+0x1e8>)
|
|
8006bca: 4807 ldr r0, [pc, #28] ; (8006be8 <pbuf_alloc+0x1dc>)
|
|
8006bcc: f009 fffc bl 8010bc8 <iprintf>
|
|
return NULL;
|
|
8006bd0: 2300 movs r3, #0
|
|
8006bd2: e001 b.n 8006bd8 <pbuf_alloc+0x1cc>
|
|
break;
|
|
8006bd4: bf00 nop
|
|
}
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
|
|
return p;
|
|
8006bd6: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
}
|
|
8006bd8: 4618 mov r0, r3
|
|
8006bda: 3728 adds r7, #40 ; 0x28
|
|
8006bdc: 46bd mov sp, r7
|
|
8006bde: bd80 pop {r7, pc}
|
|
8006be0: 08012508 .word 0x08012508
|
|
8006be4: 08012538 .word 0x08012538
|
|
8006be8: 08012568 .word 0x08012568
|
|
8006bec: 08012590 .word 0x08012590
|
|
8006bf0: 080125c4 .word 0x080125c4
|
|
8006bf4: 080125f0 .word 0x080125f0
|
|
|
|
08006bf8 <pbuf_alloc_reference>:
|
|
*
|
|
* @return the allocated pbuf.
|
|
*/
|
|
struct pbuf *
|
|
pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type)
|
|
{
|
|
8006bf8: b580 push {r7, lr}
|
|
8006bfa: b086 sub sp, #24
|
|
8006bfc: af02 add r7, sp, #8
|
|
8006bfe: 6078 str r0, [r7, #4]
|
|
8006c00: 460b mov r3, r1
|
|
8006c02: 807b strh r3, [r7, #2]
|
|
8006c04: 4613 mov r3, r2
|
|
8006c06: 803b strh r3, [r7, #0]
|
|
struct pbuf *p;
|
|
LWIP_ASSERT("invalid pbuf_type", (type == PBUF_REF) || (type == PBUF_ROM));
|
|
8006c08: 883b ldrh r3, [r7, #0]
|
|
8006c0a: 2b41 cmp r3, #65 ; 0x41
|
|
8006c0c: d009 beq.n 8006c22 <pbuf_alloc_reference+0x2a>
|
|
8006c0e: 883b ldrh r3, [r7, #0]
|
|
8006c10: 2b01 cmp r3, #1
|
|
8006c12: d006 beq.n 8006c22 <pbuf_alloc_reference+0x2a>
|
|
8006c14: 4b0f ldr r3, [pc, #60] ; (8006c54 <pbuf_alloc_reference+0x5c>)
|
|
8006c16: f44f 72a5 mov.w r2, #330 ; 0x14a
|
|
8006c1a: 490f ldr r1, [pc, #60] ; (8006c58 <pbuf_alloc_reference+0x60>)
|
|
8006c1c: 480f ldr r0, [pc, #60] ; (8006c5c <pbuf_alloc_reference+0x64>)
|
|
8006c1e: f009 ffd3 bl 8010bc8 <iprintf>
|
|
/* only allocate memory for the pbuf structure */
|
|
p = (struct pbuf *)memp_malloc(MEMP_PBUF);
|
|
8006c22: 2007 movs r0, #7
|
|
8006c24: f7ff f9fa bl 800601c <memp_malloc>
|
|
8006c28: 60f8 str r0, [r7, #12]
|
|
if (p == NULL) {
|
|
8006c2a: 68fb ldr r3, [r7, #12]
|
|
8006c2c: 2b00 cmp r3, #0
|
|
8006c2e: d101 bne.n 8006c34 <pbuf_alloc_reference+0x3c>
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
|
|
("pbuf_alloc_reference: Could not allocate MEMP_PBUF for PBUF_%s.\n",
|
|
(type == PBUF_ROM) ? "ROM" : "REF"));
|
|
return NULL;
|
|
8006c30: 2300 movs r3, #0
|
|
8006c32: e00b b.n 8006c4c <pbuf_alloc_reference+0x54>
|
|
}
|
|
pbuf_init_alloced_pbuf(p, payload, length, length, type, 0);
|
|
8006c34: 8879 ldrh r1, [r7, #2]
|
|
8006c36: 887a ldrh r2, [r7, #2]
|
|
8006c38: 2300 movs r3, #0
|
|
8006c3a: 9301 str r3, [sp, #4]
|
|
8006c3c: 883b ldrh r3, [r7, #0]
|
|
8006c3e: 9300 str r3, [sp, #0]
|
|
8006c40: 460b mov r3, r1
|
|
8006c42: 6879 ldr r1, [r7, #4]
|
|
8006c44: 68f8 ldr r0, [r7, #12]
|
|
8006c46: f7ff feb7 bl 80069b8 <pbuf_init_alloced_pbuf>
|
|
return p;
|
|
8006c4a: 68fb ldr r3, [r7, #12]
|
|
}
|
|
8006c4c: 4618 mov r0, r3
|
|
8006c4e: 3710 adds r7, #16
|
|
8006c50: 46bd mov sp, r7
|
|
8006c52: bd80 pop {r7, pc}
|
|
8006c54: 08012508 .word 0x08012508
|
|
8006c58: 0801260c .word 0x0801260c
|
|
8006c5c: 08012568 .word 0x08012568
|
|
|
|
08006c60 <pbuf_alloced_custom>:
|
|
* big enough to hold 'length' plus the header size
|
|
*/
|
|
struct pbuf *
|
|
pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p,
|
|
void *payload_mem, u16_t payload_mem_len)
|
|
{
|
|
8006c60: b580 push {r7, lr}
|
|
8006c62: b088 sub sp, #32
|
|
8006c64: af02 add r7, sp, #8
|
|
8006c66: 607b str r3, [r7, #4]
|
|
8006c68: 4603 mov r3, r0
|
|
8006c6a: 73fb strb r3, [r7, #15]
|
|
8006c6c: 460b mov r3, r1
|
|
8006c6e: 81bb strh r3, [r7, #12]
|
|
8006c70: 4613 mov r3, r2
|
|
8006c72: 817b strh r3, [r7, #10]
|
|
u16_t offset = (u16_t)l;
|
|
8006c74: 7bfb ldrb r3, [r7, #15]
|
|
8006c76: 827b strh r3, [r7, #18]
|
|
void *payload;
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloced_custom(length=%"U16_F")\n", length));
|
|
|
|
if (LWIP_MEM_ALIGN_SIZE(offset) + length > payload_mem_len) {
|
|
8006c78: 8a7b ldrh r3, [r7, #18]
|
|
8006c7a: 3303 adds r3, #3
|
|
8006c7c: f023 0203 bic.w r2, r3, #3
|
|
8006c80: 89bb ldrh r3, [r7, #12]
|
|
8006c82: 441a add r2, r3
|
|
8006c84: 8cbb ldrh r3, [r7, #36] ; 0x24
|
|
8006c86: 429a cmp r2, r3
|
|
8006c88: d901 bls.n 8006c8e <pbuf_alloced_custom+0x2e>
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_WARNING, ("pbuf_alloced_custom(length=%"U16_F") buffer too short\n", length));
|
|
return NULL;
|
|
8006c8a: 2300 movs r3, #0
|
|
8006c8c: e018 b.n 8006cc0 <pbuf_alloced_custom+0x60>
|
|
}
|
|
|
|
if (payload_mem != NULL) {
|
|
8006c8e: 6a3b ldr r3, [r7, #32]
|
|
8006c90: 2b00 cmp r3, #0
|
|
8006c92: d007 beq.n 8006ca4 <pbuf_alloced_custom+0x44>
|
|
payload = (u8_t *)payload_mem + LWIP_MEM_ALIGN_SIZE(offset);
|
|
8006c94: 8a7b ldrh r3, [r7, #18]
|
|
8006c96: 3303 adds r3, #3
|
|
8006c98: f023 0303 bic.w r3, r3, #3
|
|
8006c9c: 6a3a ldr r2, [r7, #32]
|
|
8006c9e: 4413 add r3, r2
|
|
8006ca0: 617b str r3, [r7, #20]
|
|
8006ca2: e001 b.n 8006ca8 <pbuf_alloced_custom+0x48>
|
|
} else {
|
|
payload = NULL;
|
|
8006ca4: 2300 movs r3, #0
|
|
8006ca6: 617b str r3, [r7, #20]
|
|
}
|
|
pbuf_init_alloced_pbuf(&p->pbuf, payload, length, length, type, PBUF_FLAG_IS_CUSTOM);
|
|
8006ca8: 6878 ldr r0, [r7, #4]
|
|
8006caa: 89b9 ldrh r1, [r7, #12]
|
|
8006cac: 89ba ldrh r2, [r7, #12]
|
|
8006cae: 2302 movs r3, #2
|
|
8006cb0: 9301 str r3, [sp, #4]
|
|
8006cb2: 897b ldrh r3, [r7, #10]
|
|
8006cb4: 9300 str r3, [sp, #0]
|
|
8006cb6: 460b mov r3, r1
|
|
8006cb8: 6979 ldr r1, [r7, #20]
|
|
8006cba: f7ff fe7d bl 80069b8 <pbuf_init_alloced_pbuf>
|
|
return &p->pbuf;
|
|
8006cbe: 687b ldr r3, [r7, #4]
|
|
}
|
|
8006cc0: 4618 mov r0, r3
|
|
8006cc2: 3718 adds r7, #24
|
|
8006cc4: 46bd mov sp, r7
|
|
8006cc6: bd80 pop {r7, pc}
|
|
|
|
08006cc8 <pbuf_realloc>:
|
|
*
|
|
* @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain).
|
|
*/
|
|
void
|
|
pbuf_realloc(struct pbuf *p, u16_t new_len)
|
|
{
|
|
8006cc8: b580 push {r7, lr}
|
|
8006cca: b084 sub sp, #16
|
|
8006ccc: af00 add r7, sp, #0
|
|
8006cce: 6078 str r0, [r7, #4]
|
|
8006cd0: 460b mov r3, r1
|
|
8006cd2: 807b strh r3, [r7, #2]
|
|
struct pbuf *q;
|
|
u16_t rem_len; /* remaining length */
|
|
u16_t shrink;
|
|
|
|
LWIP_ASSERT("pbuf_realloc: p != NULL", p != NULL);
|
|
8006cd4: 687b ldr r3, [r7, #4]
|
|
8006cd6: 2b00 cmp r3, #0
|
|
8006cd8: d106 bne.n 8006ce8 <pbuf_realloc+0x20>
|
|
8006cda: 4b3a ldr r3, [pc, #232] ; (8006dc4 <pbuf_realloc+0xfc>)
|
|
8006cdc: f44f 72cc mov.w r2, #408 ; 0x198
|
|
8006ce0: 4939 ldr r1, [pc, #228] ; (8006dc8 <pbuf_realloc+0x100>)
|
|
8006ce2: 483a ldr r0, [pc, #232] ; (8006dcc <pbuf_realloc+0x104>)
|
|
8006ce4: f009 ff70 bl 8010bc8 <iprintf>
|
|
|
|
/* desired length larger than current length? */
|
|
if (new_len >= p->tot_len) {
|
|
8006ce8: 687b ldr r3, [r7, #4]
|
|
8006cea: 891b ldrh r3, [r3, #8]
|
|
8006cec: 887a ldrh r2, [r7, #2]
|
|
8006cee: 429a cmp r2, r3
|
|
8006cf0: d263 bcs.n 8006dba <pbuf_realloc+0xf2>
|
|
return;
|
|
}
|
|
|
|
/* the pbuf chain grows by (new_len - p->tot_len) bytes
|
|
* (which may be negative in case of shrinking) */
|
|
shrink = (u16_t)(p->tot_len - new_len);
|
|
8006cf2: 687b ldr r3, [r7, #4]
|
|
8006cf4: 891a ldrh r2, [r3, #8]
|
|
8006cf6: 887b ldrh r3, [r7, #2]
|
|
8006cf8: 1ad3 subs r3, r2, r3
|
|
8006cfa: 813b strh r3, [r7, #8]
|
|
|
|
/* first, step over any pbufs that should remain in the chain */
|
|
rem_len = new_len;
|
|
8006cfc: 887b ldrh r3, [r7, #2]
|
|
8006cfe: 817b strh r3, [r7, #10]
|
|
q = p;
|
|
8006d00: 687b ldr r3, [r7, #4]
|
|
8006d02: 60fb str r3, [r7, #12]
|
|
/* should this pbuf be kept? */
|
|
while (rem_len > q->len) {
|
|
8006d04: e018 b.n 8006d38 <pbuf_realloc+0x70>
|
|
/* decrease remaining length by pbuf length */
|
|
rem_len = (u16_t)(rem_len - q->len);
|
|
8006d06: 68fb ldr r3, [r7, #12]
|
|
8006d08: 895b ldrh r3, [r3, #10]
|
|
8006d0a: 897a ldrh r2, [r7, #10]
|
|
8006d0c: 1ad3 subs r3, r2, r3
|
|
8006d0e: 817b strh r3, [r7, #10]
|
|
/* decrease total length indicator */
|
|
q->tot_len = (u16_t)(q->tot_len - shrink);
|
|
8006d10: 68fb ldr r3, [r7, #12]
|
|
8006d12: 891a ldrh r2, [r3, #8]
|
|
8006d14: 893b ldrh r3, [r7, #8]
|
|
8006d16: 1ad3 subs r3, r2, r3
|
|
8006d18: b29a uxth r2, r3
|
|
8006d1a: 68fb ldr r3, [r7, #12]
|
|
8006d1c: 811a strh r2, [r3, #8]
|
|
/* proceed to next pbuf in chain */
|
|
q = q->next;
|
|
8006d1e: 68fb ldr r3, [r7, #12]
|
|
8006d20: 681b ldr r3, [r3, #0]
|
|
8006d22: 60fb str r3, [r7, #12]
|
|
LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL);
|
|
8006d24: 68fb ldr r3, [r7, #12]
|
|
8006d26: 2b00 cmp r3, #0
|
|
8006d28: d106 bne.n 8006d38 <pbuf_realloc+0x70>
|
|
8006d2a: 4b26 ldr r3, [pc, #152] ; (8006dc4 <pbuf_realloc+0xfc>)
|
|
8006d2c: f240 12af movw r2, #431 ; 0x1af
|
|
8006d30: 4927 ldr r1, [pc, #156] ; (8006dd0 <pbuf_realloc+0x108>)
|
|
8006d32: 4826 ldr r0, [pc, #152] ; (8006dcc <pbuf_realloc+0x104>)
|
|
8006d34: f009 ff48 bl 8010bc8 <iprintf>
|
|
while (rem_len > q->len) {
|
|
8006d38: 68fb ldr r3, [r7, #12]
|
|
8006d3a: 895b ldrh r3, [r3, #10]
|
|
8006d3c: 897a ldrh r2, [r7, #10]
|
|
8006d3e: 429a cmp r2, r3
|
|
8006d40: d8e1 bhi.n 8006d06 <pbuf_realloc+0x3e>
|
|
/* we have now reached the new last pbuf (in q) */
|
|
/* rem_len == desired length for pbuf q */
|
|
|
|
/* shrink allocated memory for PBUF_RAM */
|
|
/* (other types merely adjust their length fields */
|
|
if (pbuf_match_allocsrc(q, PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) && (rem_len != q->len)
|
|
8006d42: 68fb ldr r3, [r7, #12]
|
|
8006d44: 7b1b ldrb r3, [r3, #12]
|
|
8006d46: f003 030f and.w r3, r3, #15
|
|
8006d4a: 2b00 cmp r3, #0
|
|
8006d4c: d121 bne.n 8006d92 <pbuf_realloc+0xca>
|
|
8006d4e: 68fb ldr r3, [r7, #12]
|
|
8006d50: 895b ldrh r3, [r3, #10]
|
|
8006d52: 897a ldrh r2, [r7, #10]
|
|
8006d54: 429a cmp r2, r3
|
|
8006d56: d01c beq.n 8006d92 <pbuf_realloc+0xca>
|
|
#if LWIP_SUPPORT_CUSTOM_PBUF
|
|
&& ((q->flags & PBUF_FLAG_IS_CUSTOM) == 0)
|
|
8006d58: 68fb ldr r3, [r7, #12]
|
|
8006d5a: 7b5b ldrb r3, [r3, #13]
|
|
8006d5c: f003 0302 and.w r3, r3, #2
|
|
8006d60: 2b00 cmp r3, #0
|
|
8006d62: d116 bne.n 8006d92 <pbuf_realloc+0xca>
|
|
#endif /* LWIP_SUPPORT_CUSTOM_PBUF */
|
|
) {
|
|
/* reallocate and adjust the length of the pbuf that will be split */
|
|
q = (struct pbuf *)mem_trim(q, (mem_size_t)(((u8_t *)q->payload - (u8_t *)q) + rem_len));
|
|
8006d64: 68fb ldr r3, [r7, #12]
|
|
8006d66: 685a ldr r2, [r3, #4]
|
|
8006d68: 68fb ldr r3, [r7, #12]
|
|
8006d6a: 1ad3 subs r3, r2, r3
|
|
8006d6c: b29a uxth r2, r3
|
|
8006d6e: 897b ldrh r3, [r7, #10]
|
|
8006d70: 4413 add r3, r2
|
|
8006d72: b29b uxth r3, r3
|
|
8006d74: 4619 mov r1, r3
|
|
8006d76: 68f8 ldr r0, [r7, #12]
|
|
8006d78: f7fe fea6 bl 8005ac8 <mem_trim>
|
|
8006d7c: 60f8 str r0, [r7, #12]
|
|
LWIP_ASSERT("mem_trim returned q == NULL", q != NULL);
|
|
8006d7e: 68fb ldr r3, [r7, #12]
|
|
8006d80: 2b00 cmp r3, #0
|
|
8006d82: d106 bne.n 8006d92 <pbuf_realloc+0xca>
|
|
8006d84: 4b0f ldr r3, [pc, #60] ; (8006dc4 <pbuf_realloc+0xfc>)
|
|
8006d86: f240 12bd movw r2, #445 ; 0x1bd
|
|
8006d8a: 4912 ldr r1, [pc, #72] ; (8006dd4 <pbuf_realloc+0x10c>)
|
|
8006d8c: 480f ldr r0, [pc, #60] ; (8006dcc <pbuf_realloc+0x104>)
|
|
8006d8e: f009 ff1b bl 8010bc8 <iprintf>
|
|
}
|
|
/* adjust length fields for new last pbuf */
|
|
q->len = rem_len;
|
|
8006d92: 68fb ldr r3, [r7, #12]
|
|
8006d94: 897a ldrh r2, [r7, #10]
|
|
8006d96: 815a strh r2, [r3, #10]
|
|
q->tot_len = q->len;
|
|
8006d98: 68fb ldr r3, [r7, #12]
|
|
8006d9a: 895a ldrh r2, [r3, #10]
|
|
8006d9c: 68fb ldr r3, [r7, #12]
|
|
8006d9e: 811a strh r2, [r3, #8]
|
|
|
|
/* any remaining pbufs in chain? */
|
|
if (q->next != NULL) {
|
|
8006da0: 68fb ldr r3, [r7, #12]
|
|
8006da2: 681b ldr r3, [r3, #0]
|
|
8006da4: 2b00 cmp r3, #0
|
|
8006da6: d004 beq.n 8006db2 <pbuf_realloc+0xea>
|
|
/* free remaining pbufs in chain */
|
|
pbuf_free(q->next);
|
|
8006da8: 68fb ldr r3, [r7, #12]
|
|
8006daa: 681b ldr r3, [r3, #0]
|
|
8006dac: 4618 mov r0, r3
|
|
8006dae: f000 f911 bl 8006fd4 <pbuf_free>
|
|
}
|
|
/* q is last packet in chain */
|
|
q->next = NULL;
|
|
8006db2: 68fb ldr r3, [r7, #12]
|
|
8006db4: 2200 movs r2, #0
|
|
8006db6: 601a str r2, [r3, #0]
|
|
8006db8: e000 b.n 8006dbc <pbuf_realloc+0xf4>
|
|
return;
|
|
8006dba: bf00 nop
|
|
|
|
}
|
|
8006dbc: 3710 adds r7, #16
|
|
8006dbe: 46bd mov sp, r7
|
|
8006dc0: bd80 pop {r7, pc}
|
|
8006dc2: bf00 nop
|
|
8006dc4: 08012508 .word 0x08012508
|
|
8006dc8: 08012620 .word 0x08012620
|
|
8006dcc: 08012568 .word 0x08012568
|
|
8006dd0: 08012638 .word 0x08012638
|
|
8006dd4: 08012650 .word 0x08012650
|
|
|
|
08006dd8 <pbuf_add_header_impl>:
|
|
* @return non-zero on failure, zero on success.
|
|
*
|
|
*/
|
|
static u8_t
|
|
pbuf_add_header_impl(struct pbuf *p, size_t header_size_increment, u8_t force)
|
|
{
|
|
8006dd8: b580 push {r7, lr}
|
|
8006dda: b086 sub sp, #24
|
|
8006ddc: af00 add r7, sp, #0
|
|
8006dde: 60f8 str r0, [r7, #12]
|
|
8006de0: 60b9 str r1, [r7, #8]
|
|
8006de2: 4613 mov r3, r2
|
|
8006de4: 71fb strb r3, [r7, #7]
|
|
u16_t type_internal;
|
|
void *payload;
|
|
u16_t increment_magnitude;
|
|
|
|
LWIP_ASSERT("p != NULL", p != NULL);
|
|
8006de6: 68fb ldr r3, [r7, #12]
|
|
8006de8: 2b00 cmp r3, #0
|
|
8006dea: d106 bne.n 8006dfa <pbuf_add_header_impl+0x22>
|
|
8006dec: 4b2b ldr r3, [pc, #172] ; (8006e9c <pbuf_add_header_impl+0xc4>)
|
|
8006dee: f240 12df movw r2, #479 ; 0x1df
|
|
8006df2: 492b ldr r1, [pc, #172] ; (8006ea0 <pbuf_add_header_impl+0xc8>)
|
|
8006df4: 482b ldr r0, [pc, #172] ; (8006ea4 <pbuf_add_header_impl+0xcc>)
|
|
8006df6: f009 fee7 bl 8010bc8 <iprintf>
|
|
if ((p == NULL) || (header_size_increment > 0xFFFF)) {
|
|
8006dfa: 68fb ldr r3, [r7, #12]
|
|
8006dfc: 2b00 cmp r3, #0
|
|
8006dfe: d003 beq.n 8006e08 <pbuf_add_header_impl+0x30>
|
|
8006e00: 68bb ldr r3, [r7, #8]
|
|
8006e02: f5b3 3f80 cmp.w r3, #65536 ; 0x10000
|
|
8006e06: d301 bcc.n 8006e0c <pbuf_add_header_impl+0x34>
|
|
return 1;
|
|
8006e08: 2301 movs r3, #1
|
|
8006e0a: e043 b.n 8006e94 <pbuf_add_header_impl+0xbc>
|
|
}
|
|
if (header_size_increment == 0) {
|
|
8006e0c: 68bb ldr r3, [r7, #8]
|
|
8006e0e: 2b00 cmp r3, #0
|
|
8006e10: d101 bne.n 8006e16 <pbuf_add_header_impl+0x3e>
|
|
return 0;
|
|
8006e12: 2300 movs r3, #0
|
|
8006e14: e03e b.n 8006e94 <pbuf_add_header_impl+0xbc>
|
|
}
|
|
|
|
increment_magnitude = (u16_t)header_size_increment;
|
|
8006e16: 68bb ldr r3, [r7, #8]
|
|
8006e18: 827b strh r3, [r7, #18]
|
|
/* Do not allow tot_len to wrap as a result. */
|
|
if ((u16_t)(increment_magnitude + p->tot_len) < increment_magnitude) {
|
|
8006e1a: 68fb ldr r3, [r7, #12]
|
|
8006e1c: 891a ldrh r2, [r3, #8]
|
|
8006e1e: 8a7b ldrh r3, [r7, #18]
|
|
8006e20: 4413 add r3, r2
|
|
8006e22: b29b uxth r3, r3
|
|
8006e24: 8a7a ldrh r2, [r7, #18]
|
|
8006e26: 429a cmp r2, r3
|
|
8006e28: d901 bls.n 8006e2e <pbuf_add_header_impl+0x56>
|
|
return 1;
|
|
8006e2a: 2301 movs r3, #1
|
|
8006e2c: e032 b.n 8006e94 <pbuf_add_header_impl+0xbc>
|
|
}
|
|
|
|
type_internal = p->type_internal;
|
|
8006e2e: 68fb ldr r3, [r7, #12]
|
|
8006e30: 7b1b ldrb r3, [r3, #12]
|
|
8006e32: 823b strh r3, [r7, #16]
|
|
|
|
/* pbuf types containing payloads? */
|
|
if (type_internal & PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS) {
|
|
8006e34: 8a3b ldrh r3, [r7, #16]
|
|
8006e36: f003 0380 and.w r3, r3, #128 ; 0x80
|
|
8006e3a: 2b00 cmp r3, #0
|
|
8006e3c: d00c beq.n 8006e58 <pbuf_add_header_impl+0x80>
|
|
/* set new payload pointer */
|
|
payload = (u8_t *)p->payload - header_size_increment;
|
|
8006e3e: 68fb ldr r3, [r7, #12]
|
|
8006e40: 685a ldr r2, [r3, #4]
|
|
8006e42: 68bb ldr r3, [r7, #8]
|
|
8006e44: 425b negs r3, r3
|
|
8006e46: 4413 add r3, r2
|
|
8006e48: 617b str r3, [r7, #20]
|
|
/* boundary check fails? */
|
|
if ((u8_t *)payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) {
|
|
8006e4a: 68fb ldr r3, [r7, #12]
|
|
8006e4c: 3310 adds r3, #16
|
|
8006e4e: 697a ldr r2, [r7, #20]
|
|
8006e50: 429a cmp r2, r3
|
|
8006e52: d20d bcs.n 8006e70 <pbuf_add_header_impl+0x98>
|
|
LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE,
|
|
("pbuf_add_header: failed as %p < %p (not enough space for new header size)\n",
|
|
(void *)payload, (void *)((u8_t *)p + SIZEOF_STRUCT_PBUF)));
|
|
/* bail out unsuccessfully */
|
|
return 1;
|
|
8006e54: 2301 movs r3, #1
|
|
8006e56: e01d b.n 8006e94 <pbuf_add_header_impl+0xbc>
|
|
}
|
|
/* pbuf types referring to external payloads? */
|
|
} else {
|
|
/* hide a header in the payload? */
|
|
if (force) {
|
|
8006e58: 79fb ldrb r3, [r7, #7]
|
|
8006e5a: 2b00 cmp r3, #0
|
|
8006e5c: d006 beq.n 8006e6c <pbuf_add_header_impl+0x94>
|
|
payload = (u8_t *)p->payload - header_size_increment;
|
|
8006e5e: 68fb ldr r3, [r7, #12]
|
|
8006e60: 685a ldr r2, [r3, #4]
|
|
8006e62: 68bb ldr r3, [r7, #8]
|
|
8006e64: 425b negs r3, r3
|
|
8006e66: 4413 add r3, r2
|
|
8006e68: 617b str r3, [r7, #20]
|
|
8006e6a: e001 b.n 8006e70 <pbuf_add_header_impl+0x98>
|
|
} else {
|
|
/* cannot expand payload to front (yet!)
|
|
* bail out unsuccessfully */
|
|
return 1;
|
|
8006e6c: 2301 movs r3, #1
|
|
8006e6e: e011 b.n 8006e94 <pbuf_add_header_impl+0xbc>
|
|
}
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_add_header: old %p new %p (%"U16_F")\n",
|
|
(void *)p->payload, (void *)payload, increment_magnitude));
|
|
|
|
/* modify pbuf fields */
|
|
p->payload = payload;
|
|
8006e70: 68fb ldr r3, [r7, #12]
|
|
8006e72: 697a ldr r2, [r7, #20]
|
|
8006e74: 605a str r2, [r3, #4]
|
|
p->len = (u16_t)(p->len + increment_magnitude);
|
|
8006e76: 68fb ldr r3, [r7, #12]
|
|
8006e78: 895a ldrh r2, [r3, #10]
|
|
8006e7a: 8a7b ldrh r3, [r7, #18]
|
|
8006e7c: 4413 add r3, r2
|
|
8006e7e: b29a uxth r2, r3
|
|
8006e80: 68fb ldr r3, [r7, #12]
|
|
8006e82: 815a strh r2, [r3, #10]
|
|
p->tot_len = (u16_t)(p->tot_len + increment_magnitude);
|
|
8006e84: 68fb ldr r3, [r7, #12]
|
|
8006e86: 891a ldrh r2, [r3, #8]
|
|
8006e88: 8a7b ldrh r3, [r7, #18]
|
|
8006e8a: 4413 add r3, r2
|
|
8006e8c: b29a uxth r2, r3
|
|
8006e8e: 68fb ldr r3, [r7, #12]
|
|
8006e90: 811a strh r2, [r3, #8]
|
|
|
|
|
|
return 0;
|
|
8006e92: 2300 movs r3, #0
|
|
}
|
|
8006e94: 4618 mov r0, r3
|
|
8006e96: 3718 adds r7, #24
|
|
8006e98: 46bd mov sp, r7
|
|
8006e9a: bd80 pop {r7, pc}
|
|
8006e9c: 08012508 .word 0x08012508
|
|
8006ea0: 0801266c .word 0x0801266c
|
|
8006ea4: 08012568 .word 0x08012568
|
|
|
|
08006ea8 <pbuf_add_header>:
|
|
* @return non-zero on failure, zero on success.
|
|
*
|
|
*/
|
|
u8_t
|
|
pbuf_add_header(struct pbuf *p, size_t header_size_increment)
|
|
{
|
|
8006ea8: b580 push {r7, lr}
|
|
8006eaa: b082 sub sp, #8
|
|
8006eac: af00 add r7, sp, #0
|
|
8006eae: 6078 str r0, [r7, #4]
|
|
8006eb0: 6039 str r1, [r7, #0]
|
|
return pbuf_add_header_impl(p, header_size_increment, 0);
|
|
8006eb2: 2200 movs r2, #0
|
|
8006eb4: 6839 ldr r1, [r7, #0]
|
|
8006eb6: 6878 ldr r0, [r7, #4]
|
|
8006eb8: f7ff ff8e bl 8006dd8 <pbuf_add_header_impl>
|
|
8006ebc: 4603 mov r3, r0
|
|
}
|
|
8006ebe: 4618 mov r0, r3
|
|
8006ec0: 3708 adds r7, #8
|
|
8006ec2: 46bd mov sp, r7
|
|
8006ec4: bd80 pop {r7, pc}
|
|
...
|
|
|
|
08006ec8 <pbuf_remove_header>:
|
|
* @return non-zero on failure, zero on success.
|
|
*
|
|
*/
|
|
u8_t
|
|
pbuf_remove_header(struct pbuf *p, size_t header_size_decrement)
|
|
{
|
|
8006ec8: b580 push {r7, lr}
|
|
8006eca: b084 sub sp, #16
|
|
8006ecc: af00 add r7, sp, #0
|
|
8006ece: 6078 str r0, [r7, #4]
|
|
8006ed0: 6039 str r1, [r7, #0]
|
|
void *payload;
|
|
u16_t increment_magnitude;
|
|
|
|
LWIP_ASSERT("p != NULL", p != NULL);
|
|
8006ed2: 687b ldr r3, [r7, #4]
|
|
8006ed4: 2b00 cmp r3, #0
|
|
8006ed6: d106 bne.n 8006ee6 <pbuf_remove_header+0x1e>
|
|
8006ed8: 4b20 ldr r3, [pc, #128] ; (8006f5c <pbuf_remove_header+0x94>)
|
|
8006eda: f240 224b movw r2, #587 ; 0x24b
|
|
8006ede: 4920 ldr r1, [pc, #128] ; (8006f60 <pbuf_remove_header+0x98>)
|
|
8006ee0: 4820 ldr r0, [pc, #128] ; (8006f64 <pbuf_remove_header+0x9c>)
|
|
8006ee2: f009 fe71 bl 8010bc8 <iprintf>
|
|
if ((p == NULL) || (header_size_decrement > 0xFFFF)) {
|
|
8006ee6: 687b ldr r3, [r7, #4]
|
|
8006ee8: 2b00 cmp r3, #0
|
|
8006eea: d003 beq.n 8006ef4 <pbuf_remove_header+0x2c>
|
|
8006eec: 683b ldr r3, [r7, #0]
|
|
8006eee: f5b3 3f80 cmp.w r3, #65536 ; 0x10000
|
|
8006ef2: d301 bcc.n 8006ef8 <pbuf_remove_header+0x30>
|
|
return 1;
|
|
8006ef4: 2301 movs r3, #1
|
|
8006ef6: e02c b.n 8006f52 <pbuf_remove_header+0x8a>
|
|
}
|
|
if (header_size_decrement == 0) {
|
|
8006ef8: 683b ldr r3, [r7, #0]
|
|
8006efa: 2b00 cmp r3, #0
|
|
8006efc: d101 bne.n 8006f02 <pbuf_remove_header+0x3a>
|
|
return 0;
|
|
8006efe: 2300 movs r3, #0
|
|
8006f00: e027 b.n 8006f52 <pbuf_remove_header+0x8a>
|
|
}
|
|
|
|
increment_magnitude = (u16_t)header_size_decrement;
|
|
8006f02: 683b ldr r3, [r7, #0]
|
|
8006f04: 81fb strh r3, [r7, #14]
|
|
/* Check that we aren't going to move off the end of the pbuf */
|
|
LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
|
|
8006f06: 687b ldr r3, [r7, #4]
|
|
8006f08: 895b ldrh r3, [r3, #10]
|
|
8006f0a: 89fa ldrh r2, [r7, #14]
|
|
8006f0c: 429a cmp r2, r3
|
|
8006f0e: d908 bls.n 8006f22 <pbuf_remove_header+0x5a>
|
|
8006f10: 4b12 ldr r3, [pc, #72] ; (8006f5c <pbuf_remove_header+0x94>)
|
|
8006f12: f240 2255 movw r2, #597 ; 0x255
|
|
8006f16: 4914 ldr r1, [pc, #80] ; (8006f68 <pbuf_remove_header+0xa0>)
|
|
8006f18: 4812 ldr r0, [pc, #72] ; (8006f64 <pbuf_remove_header+0x9c>)
|
|
8006f1a: f009 fe55 bl 8010bc8 <iprintf>
|
|
8006f1e: 2301 movs r3, #1
|
|
8006f20: e017 b.n 8006f52 <pbuf_remove_header+0x8a>
|
|
|
|
/* remember current payload pointer */
|
|
payload = p->payload;
|
|
8006f22: 687b ldr r3, [r7, #4]
|
|
8006f24: 685b ldr r3, [r3, #4]
|
|
8006f26: 60bb str r3, [r7, #8]
|
|
LWIP_UNUSED_ARG(payload); /* only used in LWIP_DEBUGF below */
|
|
|
|
/* increase payload pointer (guarded by length check above) */
|
|
p->payload = (u8_t *)p->payload + header_size_decrement;
|
|
8006f28: 687b ldr r3, [r7, #4]
|
|
8006f2a: 685a ldr r2, [r3, #4]
|
|
8006f2c: 683b ldr r3, [r7, #0]
|
|
8006f2e: 441a add r2, r3
|
|
8006f30: 687b ldr r3, [r7, #4]
|
|
8006f32: 605a str r2, [r3, #4]
|
|
/* modify pbuf length fields */
|
|
p->len = (u16_t)(p->len - increment_magnitude);
|
|
8006f34: 687b ldr r3, [r7, #4]
|
|
8006f36: 895a ldrh r2, [r3, #10]
|
|
8006f38: 89fb ldrh r3, [r7, #14]
|
|
8006f3a: 1ad3 subs r3, r2, r3
|
|
8006f3c: b29a uxth r2, r3
|
|
8006f3e: 687b ldr r3, [r7, #4]
|
|
8006f40: 815a strh r2, [r3, #10]
|
|
p->tot_len = (u16_t)(p->tot_len - increment_magnitude);
|
|
8006f42: 687b ldr r3, [r7, #4]
|
|
8006f44: 891a ldrh r2, [r3, #8]
|
|
8006f46: 89fb ldrh r3, [r7, #14]
|
|
8006f48: 1ad3 subs r3, r2, r3
|
|
8006f4a: b29a uxth r2, r3
|
|
8006f4c: 687b ldr r3, [r7, #4]
|
|
8006f4e: 811a strh r2, [r3, #8]
|
|
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_remove_header: old %p new %p (%"U16_F")\n",
|
|
(void *)payload, (void *)p->payload, increment_magnitude));
|
|
|
|
return 0;
|
|
8006f50: 2300 movs r3, #0
|
|
}
|
|
8006f52: 4618 mov r0, r3
|
|
8006f54: 3710 adds r7, #16
|
|
8006f56: 46bd mov sp, r7
|
|
8006f58: bd80 pop {r7, pc}
|
|
8006f5a: bf00 nop
|
|
8006f5c: 08012508 .word 0x08012508
|
|
8006f60: 0801266c .word 0x0801266c
|
|
8006f64: 08012568 .word 0x08012568
|
|
8006f68: 08012678 .word 0x08012678
|
|
|
|
08006f6c <pbuf_header_impl>:
|
|
|
|
static u8_t
|
|
pbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force)
|
|
{
|
|
8006f6c: b580 push {r7, lr}
|
|
8006f6e: b082 sub sp, #8
|
|
8006f70: af00 add r7, sp, #0
|
|
8006f72: 6078 str r0, [r7, #4]
|
|
8006f74: 460b mov r3, r1
|
|
8006f76: 807b strh r3, [r7, #2]
|
|
8006f78: 4613 mov r3, r2
|
|
8006f7a: 707b strb r3, [r7, #1]
|
|
if (header_size_increment < 0) {
|
|
8006f7c: f9b7 3002 ldrsh.w r3, [r7, #2]
|
|
8006f80: 2b00 cmp r3, #0
|
|
8006f82: da08 bge.n 8006f96 <pbuf_header_impl+0x2a>
|
|
return pbuf_remove_header(p, (size_t) - header_size_increment);
|
|
8006f84: f9b7 3002 ldrsh.w r3, [r7, #2]
|
|
8006f88: 425b negs r3, r3
|
|
8006f8a: 4619 mov r1, r3
|
|
8006f8c: 6878 ldr r0, [r7, #4]
|
|
8006f8e: f7ff ff9b bl 8006ec8 <pbuf_remove_header>
|
|
8006f92: 4603 mov r3, r0
|
|
8006f94: e007 b.n 8006fa6 <pbuf_header_impl+0x3a>
|
|
} else {
|
|
return pbuf_add_header_impl(p, (size_t)header_size_increment, force);
|
|
8006f96: f9b7 3002 ldrsh.w r3, [r7, #2]
|
|
8006f9a: 787a ldrb r2, [r7, #1]
|
|
8006f9c: 4619 mov r1, r3
|
|
8006f9e: 6878 ldr r0, [r7, #4]
|
|
8006fa0: f7ff ff1a bl 8006dd8 <pbuf_add_header_impl>
|
|
8006fa4: 4603 mov r3, r0
|
|
}
|
|
}
|
|
8006fa6: 4618 mov r0, r3
|
|
8006fa8: 3708 adds r7, #8
|
|
8006faa: 46bd mov sp, r7
|
|
8006fac: bd80 pop {r7, pc}
|
|
|
|
08006fae <pbuf_header_force>:
|
|
* Same as pbuf_header but does not check if 'header_size > 0' is allowed.
|
|
* This is used internally only, to allow PBUF_REF for RX.
|
|
*/
|
|
u8_t
|
|
pbuf_header_force(struct pbuf *p, s16_t header_size_increment)
|
|
{
|
|
8006fae: b580 push {r7, lr}
|
|
8006fb0: b082 sub sp, #8
|
|
8006fb2: af00 add r7, sp, #0
|
|
8006fb4: 6078 str r0, [r7, #4]
|
|
8006fb6: 460b mov r3, r1
|
|
8006fb8: 807b strh r3, [r7, #2]
|
|
return pbuf_header_impl(p, header_size_increment, 1);
|
|
8006fba: f9b7 3002 ldrsh.w r3, [r7, #2]
|
|
8006fbe: 2201 movs r2, #1
|
|
8006fc0: 4619 mov r1, r3
|
|
8006fc2: 6878 ldr r0, [r7, #4]
|
|
8006fc4: f7ff ffd2 bl 8006f6c <pbuf_header_impl>
|
|
8006fc8: 4603 mov r3, r0
|
|
}
|
|
8006fca: 4618 mov r0, r3
|
|
8006fcc: 3708 adds r7, #8
|
|
8006fce: 46bd mov sp, r7
|
|
8006fd0: bd80 pop {r7, pc}
|
|
...
|
|
|
|
08006fd4 <pbuf_free>:
|
|
* 1->1->1 becomes .......
|
|
*
|
|
*/
|
|
u8_t
|
|
pbuf_free(struct pbuf *p)
|
|
{
|
|
8006fd4: b580 push {r7, lr}
|
|
8006fd6: b086 sub sp, #24
|
|
8006fd8: af00 add r7, sp, #0
|
|
8006fda: 6078 str r0, [r7, #4]
|
|
u8_t alloc_src;
|
|
struct pbuf *q;
|
|
u8_t count;
|
|
|
|
if (p == NULL) {
|
|
8006fdc: 687b ldr r3, [r7, #4]
|
|
8006fde: 2b00 cmp r3, #0
|
|
8006fe0: d10b bne.n 8006ffa <pbuf_free+0x26>
|
|
LWIP_ASSERT("p != NULL", p != NULL);
|
|
8006fe2: 687b ldr r3, [r7, #4]
|
|
8006fe4: 2b00 cmp r3, #0
|
|
8006fe6: d106 bne.n 8006ff6 <pbuf_free+0x22>
|
|
8006fe8: 4b38 ldr r3, [pc, #224] ; (80070cc <pbuf_free+0xf8>)
|
|
8006fea: f44f 7237 mov.w r2, #732 ; 0x2dc
|
|
8006fee: 4938 ldr r1, [pc, #224] ; (80070d0 <pbuf_free+0xfc>)
|
|
8006ff0: 4838 ldr r0, [pc, #224] ; (80070d4 <pbuf_free+0x100>)
|
|
8006ff2: f009 fde9 bl 8010bc8 <iprintf>
|
|
/* if assertions are disabled, proceed with debug output */
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
|
|
("pbuf_free(p == NULL) was called.\n"));
|
|
return 0;
|
|
8006ff6: 2300 movs r3, #0
|
|
8006ff8: e063 b.n 80070c2 <pbuf_free+0xee>
|
|
}
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free(%p)\n", (void *)p));
|
|
|
|
PERF_START;
|
|
|
|
count = 0;
|
|
8006ffa: 2300 movs r3, #0
|
|
8006ffc: 75fb strb r3, [r7, #23]
|
|
/* de-allocate all consecutive pbufs from the head of the chain that
|
|
* obtain a zero reference count after decrementing*/
|
|
while (p != NULL) {
|
|
8006ffe: e05c b.n 80070ba <pbuf_free+0xe6>
|
|
/* Since decrementing ref cannot be guaranteed to be a single machine operation
|
|
* we must protect it. We put the new ref into a local variable to prevent
|
|
* further protection. */
|
|
SYS_ARCH_PROTECT(old_level);
|
|
/* all pbufs in a chain are referenced at least once */
|
|
LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
|
|
8007000: 687b ldr r3, [r7, #4]
|
|
8007002: 7b9b ldrb r3, [r3, #14]
|
|
8007004: 2b00 cmp r3, #0
|
|
8007006: d106 bne.n 8007016 <pbuf_free+0x42>
|
|
8007008: 4b30 ldr r3, [pc, #192] ; (80070cc <pbuf_free+0xf8>)
|
|
800700a: f240 22f1 movw r2, #753 ; 0x2f1
|
|
800700e: 4932 ldr r1, [pc, #200] ; (80070d8 <pbuf_free+0x104>)
|
|
8007010: 4830 ldr r0, [pc, #192] ; (80070d4 <pbuf_free+0x100>)
|
|
8007012: f009 fdd9 bl 8010bc8 <iprintf>
|
|
/* decrease reference count (number of pointers to pbuf) */
|
|
ref = --(p->ref);
|
|
8007016: 687b ldr r3, [r7, #4]
|
|
8007018: 7b9b ldrb r3, [r3, #14]
|
|
800701a: 3b01 subs r3, #1
|
|
800701c: b2da uxtb r2, r3
|
|
800701e: 687b ldr r3, [r7, #4]
|
|
8007020: 739a strb r2, [r3, #14]
|
|
8007022: 687b ldr r3, [r7, #4]
|
|
8007024: 7b9b ldrb r3, [r3, #14]
|
|
8007026: 75bb strb r3, [r7, #22]
|
|
SYS_ARCH_UNPROTECT(old_level);
|
|
/* this pbuf is no longer referenced to? */
|
|
if (ref == 0) {
|
|
8007028: 7dbb ldrb r3, [r7, #22]
|
|
800702a: 2b00 cmp r3, #0
|
|
800702c: d143 bne.n 80070b6 <pbuf_free+0xe2>
|
|
/* remember next pbuf in chain for next iteration */
|
|
q = p->next;
|
|
800702e: 687b ldr r3, [r7, #4]
|
|
8007030: 681b ldr r3, [r3, #0]
|
|
8007032: 613b str r3, [r7, #16]
|
|
LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p));
|
|
alloc_src = pbuf_get_allocsrc(p);
|
|
8007034: 687b ldr r3, [r7, #4]
|
|
8007036: 7b1b ldrb r3, [r3, #12]
|
|
8007038: f003 030f and.w r3, r3, #15
|
|
800703c: 73fb strb r3, [r7, #15]
|
|
#if LWIP_SUPPORT_CUSTOM_PBUF
|
|
/* is this a custom pbuf? */
|
|
if ((p->flags & PBUF_FLAG_IS_CUSTOM) != 0) {
|
|
800703e: 687b ldr r3, [r7, #4]
|
|
8007040: 7b5b ldrb r3, [r3, #13]
|
|
8007042: f003 0302 and.w r3, r3, #2
|
|
8007046: 2b00 cmp r3, #0
|
|
8007048: d011 beq.n 800706e <pbuf_free+0x9a>
|
|
struct pbuf_custom *pc = (struct pbuf_custom *)p;
|
|
800704a: 687b ldr r3, [r7, #4]
|
|
800704c: 60bb str r3, [r7, #8]
|
|
LWIP_ASSERT("pc->custom_free_function != NULL", pc->custom_free_function != NULL);
|
|
800704e: 68bb ldr r3, [r7, #8]
|
|
8007050: 691b ldr r3, [r3, #16]
|
|
8007052: 2b00 cmp r3, #0
|
|
8007054: d106 bne.n 8007064 <pbuf_free+0x90>
|
|
8007056: 4b1d ldr r3, [pc, #116] ; (80070cc <pbuf_free+0xf8>)
|
|
8007058: f240 22ff movw r2, #767 ; 0x2ff
|
|
800705c: 491f ldr r1, [pc, #124] ; (80070dc <pbuf_free+0x108>)
|
|
800705e: 481d ldr r0, [pc, #116] ; (80070d4 <pbuf_free+0x100>)
|
|
8007060: f009 fdb2 bl 8010bc8 <iprintf>
|
|
pc->custom_free_function(p);
|
|
8007064: 68bb ldr r3, [r7, #8]
|
|
8007066: 691b ldr r3, [r3, #16]
|
|
8007068: 6878 ldr r0, [r7, #4]
|
|
800706a: 4798 blx r3
|
|
800706c: e01d b.n 80070aa <pbuf_free+0xd6>
|
|
} else
|
|
#endif /* LWIP_SUPPORT_CUSTOM_PBUF */
|
|
{
|
|
/* is this a pbuf from the pool? */
|
|
if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL) {
|
|
800706e: 7bfb ldrb r3, [r7, #15]
|
|
8007070: 2b02 cmp r3, #2
|
|
8007072: d104 bne.n 800707e <pbuf_free+0xaa>
|
|
memp_free(MEMP_PBUF_POOL, p);
|
|
8007074: 6879 ldr r1, [r7, #4]
|
|
8007076: 2008 movs r0, #8
|
|
8007078: f7ff f840 bl 80060fc <memp_free>
|
|
800707c: e015 b.n 80070aa <pbuf_free+0xd6>
|
|
/* is this a ROM or RAM referencing pbuf? */
|
|
} else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF) {
|
|
800707e: 7bfb ldrb r3, [r7, #15]
|
|
8007080: 2b01 cmp r3, #1
|
|
8007082: d104 bne.n 800708e <pbuf_free+0xba>
|
|
memp_free(MEMP_PBUF, p);
|
|
8007084: 6879 ldr r1, [r7, #4]
|
|
8007086: 2007 movs r0, #7
|
|
8007088: f7ff f838 bl 80060fc <memp_free>
|
|
800708c: e00d b.n 80070aa <pbuf_free+0xd6>
|
|
/* type == PBUF_RAM */
|
|
} else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) {
|
|
800708e: 7bfb ldrb r3, [r7, #15]
|
|
8007090: 2b00 cmp r3, #0
|
|
8007092: d103 bne.n 800709c <pbuf_free+0xc8>
|
|
mem_free(p);
|
|
8007094: 6878 ldr r0, [r7, #4]
|
|
8007096: f7fe fc99 bl 80059cc <mem_free>
|
|
800709a: e006 b.n 80070aa <pbuf_free+0xd6>
|
|
} else {
|
|
/* @todo: support freeing other types */
|
|
LWIP_ASSERT("invalid pbuf type", 0);
|
|
800709c: 4b0b ldr r3, [pc, #44] ; (80070cc <pbuf_free+0xf8>)
|
|
800709e: f240 320f movw r2, #783 ; 0x30f
|
|
80070a2: 490f ldr r1, [pc, #60] ; (80070e0 <pbuf_free+0x10c>)
|
|
80070a4: 480b ldr r0, [pc, #44] ; (80070d4 <pbuf_free+0x100>)
|
|
80070a6: f009 fd8f bl 8010bc8 <iprintf>
|
|
}
|
|
}
|
|
count++;
|
|
80070aa: 7dfb ldrb r3, [r7, #23]
|
|
80070ac: 3301 adds r3, #1
|
|
80070ae: 75fb strb r3, [r7, #23]
|
|
/* proceed to next pbuf */
|
|
p = q;
|
|
80070b0: 693b ldr r3, [r7, #16]
|
|
80070b2: 607b str r3, [r7, #4]
|
|
80070b4: e001 b.n 80070ba <pbuf_free+0xe6>
|
|
/* p->ref > 0, this pbuf is still referenced to */
|
|
/* (and so the remaining pbufs in chain as well) */
|
|
} else {
|
|
LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, (u16_t)ref));
|
|
/* stop walking through the chain */
|
|
p = NULL;
|
|
80070b6: 2300 movs r3, #0
|
|
80070b8: 607b str r3, [r7, #4]
|
|
while (p != NULL) {
|
|
80070ba: 687b ldr r3, [r7, #4]
|
|
80070bc: 2b00 cmp r3, #0
|
|
80070be: d19f bne.n 8007000 <pbuf_free+0x2c>
|
|
}
|
|
}
|
|
PERF_STOP("pbuf_free");
|
|
/* return number of de-allocated pbufs */
|
|
return count;
|
|
80070c0: 7dfb ldrb r3, [r7, #23]
|
|
}
|
|
80070c2: 4618 mov r0, r3
|
|
80070c4: 3718 adds r7, #24
|
|
80070c6: 46bd mov sp, r7
|
|
80070c8: bd80 pop {r7, pc}
|
|
80070ca: bf00 nop
|
|
80070cc: 08012508 .word 0x08012508
|
|
80070d0: 0801266c .word 0x0801266c
|
|
80070d4: 08012568 .word 0x08012568
|
|
80070d8: 08012698 .word 0x08012698
|
|
80070dc: 080126b0 .word 0x080126b0
|
|
80070e0: 080126d4 .word 0x080126d4
|
|
|
|
080070e4 <pbuf_clen>:
|
|
* @param p first pbuf of chain
|
|
* @return the number of pbufs in a chain
|
|
*/
|
|
u16_t
|
|
pbuf_clen(const struct pbuf *p)
|
|
{
|
|
80070e4: b480 push {r7}
|
|
80070e6: b085 sub sp, #20
|
|
80070e8: af00 add r7, sp, #0
|
|
80070ea: 6078 str r0, [r7, #4]
|
|
u16_t len;
|
|
|
|
len = 0;
|
|
80070ec: 2300 movs r3, #0
|
|
80070ee: 81fb strh r3, [r7, #14]
|
|
while (p != NULL) {
|
|
80070f0: e005 b.n 80070fe <pbuf_clen+0x1a>
|
|
++len;
|
|
80070f2: 89fb ldrh r3, [r7, #14]
|
|
80070f4: 3301 adds r3, #1
|
|
80070f6: 81fb strh r3, [r7, #14]
|
|
p = p->next;
|
|
80070f8: 687b ldr r3, [r7, #4]
|
|
80070fa: 681b ldr r3, [r3, #0]
|
|
80070fc: 607b str r3, [r7, #4]
|
|
while (p != NULL) {
|
|
80070fe: 687b ldr r3, [r7, #4]
|
|
8007100: 2b00 cmp r3, #0
|
|
8007102: d1f6 bne.n 80070f2 <pbuf_clen+0xe>
|
|
}
|
|
return len;
|
|
8007104: 89fb ldrh r3, [r7, #14]
|
|
}
|
|
8007106: 4618 mov r0, r3
|
|
8007108: 3714 adds r7, #20
|
|
800710a: 46bd mov sp, r7
|
|
800710c: f85d 7b04 ldr.w r7, [sp], #4
|
|
8007110: 4770 bx lr
|
|
...
|
|
|
|
08007114 <pbuf_ref>:
|
|
* @param p pbuf to increase reference counter of
|
|
*
|
|
*/
|
|
void
|
|
pbuf_ref(struct pbuf *p)
|
|
{
|
|
8007114: b580 push {r7, lr}
|
|
8007116: b082 sub sp, #8
|
|
8007118: af00 add r7, sp, #0
|
|
800711a: 6078 str r0, [r7, #4]
|
|
/* pbuf given? */
|
|
if (p != NULL) {
|
|
800711c: 687b ldr r3, [r7, #4]
|
|
800711e: 2b00 cmp r3, #0
|
|
8007120: d010 beq.n 8007144 <pbuf_ref+0x30>
|
|
SYS_ARCH_SET(p->ref, (LWIP_PBUF_REF_T)(p->ref + 1));
|
|
8007122: 687b ldr r3, [r7, #4]
|
|
8007124: 7b9b ldrb r3, [r3, #14]
|
|
8007126: 3301 adds r3, #1
|
|
8007128: b2da uxtb r2, r3
|
|
800712a: 687b ldr r3, [r7, #4]
|
|
800712c: 739a strb r2, [r3, #14]
|
|
LWIP_ASSERT("pbuf ref overflow", p->ref > 0);
|
|
800712e: 687b ldr r3, [r7, #4]
|
|
8007130: 7b9b ldrb r3, [r3, #14]
|
|
8007132: 2b00 cmp r3, #0
|
|
8007134: d106 bne.n 8007144 <pbuf_ref+0x30>
|
|
8007136: 4b05 ldr r3, [pc, #20] ; (800714c <pbuf_ref+0x38>)
|
|
8007138: f240 3242 movw r2, #834 ; 0x342
|
|
800713c: 4904 ldr r1, [pc, #16] ; (8007150 <pbuf_ref+0x3c>)
|
|
800713e: 4805 ldr r0, [pc, #20] ; (8007154 <pbuf_ref+0x40>)
|
|
8007140: f009 fd42 bl 8010bc8 <iprintf>
|
|
}
|
|
}
|
|
8007144: bf00 nop
|
|
8007146: 3708 adds r7, #8
|
|
8007148: 46bd mov sp, r7
|
|
800714a: bd80 pop {r7, pc}
|
|
800714c: 08012508 .word 0x08012508
|
|
8007150: 080126e8 .word 0x080126e8
|
|
8007154: 08012568 .word 0x08012568
|
|
|
|
08007158 <pbuf_cat>:
|
|
*
|
|
* @see pbuf_chain()
|
|
*/
|
|
void
|
|
pbuf_cat(struct pbuf *h, struct pbuf *t)
|
|
{
|
|
8007158: b580 push {r7, lr}
|
|
800715a: b084 sub sp, #16
|
|
800715c: af00 add r7, sp, #0
|
|
800715e: 6078 str r0, [r7, #4]
|
|
8007160: 6039 str r1, [r7, #0]
|
|
struct pbuf *p;
|
|
|
|
LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)",
|
|
8007162: 687b ldr r3, [r7, #4]
|
|
8007164: 2b00 cmp r3, #0
|
|
8007166: d002 beq.n 800716e <pbuf_cat+0x16>
|
|
8007168: 683b ldr r3, [r7, #0]
|
|
800716a: 2b00 cmp r3, #0
|
|
800716c: d107 bne.n 800717e <pbuf_cat+0x26>
|
|
800716e: 4b20 ldr r3, [pc, #128] ; (80071f0 <pbuf_cat+0x98>)
|
|
8007170: f240 3259 movw r2, #857 ; 0x359
|
|
8007174: 491f ldr r1, [pc, #124] ; (80071f4 <pbuf_cat+0x9c>)
|
|
8007176: 4820 ldr r0, [pc, #128] ; (80071f8 <pbuf_cat+0xa0>)
|
|
8007178: f009 fd26 bl 8010bc8 <iprintf>
|
|
800717c: e034 b.n 80071e8 <pbuf_cat+0x90>
|
|
((h != NULL) && (t != NULL)), return;);
|
|
|
|
/* proceed to last pbuf of chain */
|
|
for (p = h; p->next != NULL; p = p->next) {
|
|
800717e: 687b ldr r3, [r7, #4]
|
|
8007180: 60fb str r3, [r7, #12]
|
|
8007182: e00a b.n 800719a <pbuf_cat+0x42>
|
|
/* add total length of second chain to all totals of first chain */
|
|
p->tot_len = (u16_t)(p->tot_len + t->tot_len);
|
|
8007184: 68fb ldr r3, [r7, #12]
|
|
8007186: 891a ldrh r2, [r3, #8]
|
|
8007188: 683b ldr r3, [r7, #0]
|
|
800718a: 891b ldrh r3, [r3, #8]
|
|
800718c: 4413 add r3, r2
|
|
800718e: b29a uxth r2, r3
|
|
8007190: 68fb ldr r3, [r7, #12]
|
|
8007192: 811a strh r2, [r3, #8]
|
|
for (p = h; p->next != NULL; p = p->next) {
|
|
8007194: 68fb ldr r3, [r7, #12]
|
|
8007196: 681b ldr r3, [r3, #0]
|
|
8007198: 60fb str r3, [r7, #12]
|
|
800719a: 68fb ldr r3, [r7, #12]
|
|
800719c: 681b ldr r3, [r3, #0]
|
|
800719e: 2b00 cmp r3, #0
|
|
80071a0: d1f0 bne.n 8007184 <pbuf_cat+0x2c>
|
|
}
|
|
/* { p is last pbuf of first h chain, p->next == NULL } */
|
|
LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
|
|
80071a2: 68fb ldr r3, [r7, #12]
|
|
80071a4: 891a ldrh r2, [r3, #8]
|
|
80071a6: 68fb ldr r3, [r7, #12]
|
|
80071a8: 895b ldrh r3, [r3, #10]
|
|
80071aa: 429a cmp r2, r3
|
|
80071ac: d006 beq.n 80071bc <pbuf_cat+0x64>
|
|
80071ae: 4b10 ldr r3, [pc, #64] ; (80071f0 <pbuf_cat+0x98>)
|
|
80071b0: f240 3262 movw r2, #866 ; 0x362
|
|
80071b4: 4911 ldr r1, [pc, #68] ; (80071fc <pbuf_cat+0xa4>)
|
|
80071b6: 4810 ldr r0, [pc, #64] ; (80071f8 <pbuf_cat+0xa0>)
|
|
80071b8: f009 fd06 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("p->next == NULL", p->next == NULL);
|
|
80071bc: 68fb ldr r3, [r7, #12]
|
|
80071be: 681b ldr r3, [r3, #0]
|
|
80071c0: 2b00 cmp r3, #0
|
|
80071c2: d006 beq.n 80071d2 <pbuf_cat+0x7a>
|
|
80071c4: 4b0a ldr r3, [pc, #40] ; (80071f0 <pbuf_cat+0x98>)
|
|
80071c6: f240 3263 movw r2, #867 ; 0x363
|
|
80071ca: 490d ldr r1, [pc, #52] ; (8007200 <pbuf_cat+0xa8>)
|
|
80071cc: 480a ldr r0, [pc, #40] ; (80071f8 <pbuf_cat+0xa0>)
|
|
80071ce: f009 fcfb bl 8010bc8 <iprintf>
|
|
/* add total length of second chain to last pbuf total of first chain */
|
|
p->tot_len = (u16_t)(p->tot_len + t->tot_len);
|
|
80071d2: 68fb ldr r3, [r7, #12]
|
|
80071d4: 891a ldrh r2, [r3, #8]
|
|
80071d6: 683b ldr r3, [r7, #0]
|
|
80071d8: 891b ldrh r3, [r3, #8]
|
|
80071da: 4413 add r3, r2
|
|
80071dc: b29a uxth r2, r3
|
|
80071de: 68fb ldr r3, [r7, #12]
|
|
80071e0: 811a strh r2, [r3, #8]
|
|
/* chain last pbuf of head (p) with first of tail (t) */
|
|
p->next = t;
|
|
80071e2: 68fb ldr r3, [r7, #12]
|
|
80071e4: 683a ldr r2, [r7, #0]
|
|
80071e6: 601a str r2, [r3, #0]
|
|
/* p->next now references t, but the caller will drop its reference to t,
|
|
* so netto there is no change to the reference count of t.
|
|
*/
|
|
}
|
|
80071e8: 3710 adds r7, #16
|
|
80071ea: 46bd mov sp, r7
|
|
80071ec: bd80 pop {r7, pc}
|
|
80071ee: bf00 nop
|
|
80071f0: 08012508 .word 0x08012508
|
|
80071f4: 080126fc .word 0x080126fc
|
|
80071f8: 08012568 .word 0x08012568
|
|
80071fc: 08012734 .word 0x08012734
|
|
8007200: 08012764 .word 0x08012764
|
|
|
|
08007204 <pbuf_copy>:
|
|
* ERR_ARG if one of the pbufs is NULL or p_to is not big
|
|
* enough to hold p_from
|
|
*/
|
|
err_t
|
|
pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from)
|
|
{
|
|
8007204: b580 push {r7, lr}
|
|
8007206: b086 sub sp, #24
|
|
8007208: af00 add r7, sp, #0
|
|
800720a: 6078 str r0, [r7, #4]
|
|
800720c: 6039 str r1, [r7, #0]
|
|
size_t offset_to = 0, offset_from = 0, len;
|
|
800720e: 2300 movs r3, #0
|
|
8007210: 617b str r3, [r7, #20]
|
|
8007212: 2300 movs r3, #0
|
|
8007214: 613b str r3, [r7, #16]
|
|
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n",
|
|
(const void *)p_to, (const void *)p_from));
|
|
|
|
/* is the target big enough to hold the source? */
|
|
LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) &&
|
|
8007216: 687b ldr r3, [r7, #4]
|
|
8007218: 2b00 cmp r3, #0
|
|
800721a: d008 beq.n 800722e <pbuf_copy+0x2a>
|
|
800721c: 683b ldr r3, [r7, #0]
|
|
800721e: 2b00 cmp r3, #0
|
|
8007220: d005 beq.n 800722e <pbuf_copy+0x2a>
|
|
8007222: 687b ldr r3, [r7, #4]
|
|
8007224: 891a ldrh r2, [r3, #8]
|
|
8007226: 683b ldr r3, [r7, #0]
|
|
8007228: 891b ldrh r3, [r3, #8]
|
|
800722a: 429a cmp r2, r3
|
|
800722c: d209 bcs.n 8007242 <pbuf_copy+0x3e>
|
|
800722e: 4b57 ldr r3, [pc, #348] ; (800738c <pbuf_copy+0x188>)
|
|
8007230: f240 32c9 movw r2, #969 ; 0x3c9
|
|
8007234: 4956 ldr r1, [pc, #344] ; (8007390 <pbuf_copy+0x18c>)
|
|
8007236: 4857 ldr r0, [pc, #348] ; (8007394 <pbuf_copy+0x190>)
|
|
8007238: f009 fcc6 bl 8010bc8 <iprintf>
|
|
800723c: f06f 030f mvn.w r3, #15
|
|
8007240: e09f b.n 8007382 <pbuf_copy+0x17e>
|
|
(p_from != NULL) && (p_to->tot_len >= p_from->tot_len)), return ERR_ARG;);
|
|
|
|
/* iterate through pbuf chain */
|
|
do {
|
|
/* copy one part of the original chain */
|
|
if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
|
|
8007242: 687b ldr r3, [r7, #4]
|
|
8007244: 895b ldrh r3, [r3, #10]
|
|
8007246: 461a mov r2, r3
|
|
8007248: 697b ldr r3, [r7, #20]
|
|
800724a: 1ad2 subs r2, r2, r3
|
|
800724c: 683b ldr r3, [r7, #0]
|
|
800724e: 895b ldrh r3, [r3, #10]
|
|
8007250: 4619 mov r1, r3
|
|
8007252: 693b ldr r3, [r7, #16]
|
|
8007254: 1acb subs r3, r1, r3
|
|
8007256: 429a cmp r2, r3
|
|
8007258: d306 bcc.n 8007268 <pbuf_copy+0x64>
|
|
/* complete current p_from fits into current p_to */
|
|
len = p_from->len - offset_from;
|
|
800725a: 683b ldr r3, [r7, #0]
|
|
800725c: 895b ldrh r3, [r3, #10]
|
|
800725e: 461a mov r2, r3
|
|
8007260: 693b ldr r3, [r7, #16]
|
|
8007262: 1ad3 subs r3, r2, r3
|
|
8007264: 60fb str r3, [r7, #12]
|
|
8007266: e005 b.n 8007274 <pbuf_copy+0x70>
|
|
} else {
|
|
/* current p_from does not fit into current p_to */
|
|
len = p_to->len - offset_to;
|
|
8007268: 687b ldr r3, [r7, #4]
|
|
800726a: 895b ldrh r3, [r3, #10]
|
|
800726c: 461a mov r2, r3
|
|
800726e: 697b ldr r3, [r7, #20]
|
|
8007270: 1ad3 subs r3, r2, r3
|
|
8007272: 60fb str r3, [r7, #12]
|
|
}
|
|
MEMCPY((u8_t *)p_to->payload + offset_to, (u8_t *)p_from->payload + offset_from, len);
|
|
8007274: 687b ldr r3, [r7, #4]
|
|
8007276: 685a ldr r2, [r3, #4]
|
|
8007278: 697b ldr r3, [r7, #20]
|
|
800727a: 18d0 adds r0, r2, r3
|
|
800727c: 683b ldr r3, [r7, #0]
|
|
800727e: 685a ldr r2, [r3, #4]
|
|
8007280: 693b ldr r3, [r7, #16]
|
|
8007282: 4413 add r3, r2
|
|
8007284: 68fa ldr r2, [r7, #12]
|
|
8007286: 4619 mov r1, r3
|
|
8007288: f009 fe7f bl 8010f8a <memcpy>
|
|
offset_to += len;
|
|
800728c: 697a ldr r2, [r7, #20]
|
|
800728e: 68fb ldr r3, [r7, #12]
|
|
8007290: 4413 add r3, r2
|
|
8007292: 617b str r3, [r7, #20]
|
|
offset_from += len;
|
|
8007294: 693a ldr r2, [r7, #16]
|
|
8007296: 68fb ldr r3, [r7, #12]
|
|
8007298: 4413 add r3, r2
|
|
800729a: 613b str r3, [r7, #16]
|
|
LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
|
|
800729c: 687b ldr r3, [r7, #4]
|
|
800729e: 895b ldrh r3, [r3, #10]
|
|
80072a0: 461a mov r2, r3
|
|
80072a2: 697b ldr r3, [r7, #20]
|
|
80072a4: 4293 cmp r3, r2
|
|
80072a6: d906 bls.n 80072b6 <pbuf_copy+0xb2>
|
|
80072a8: 4b38 ldr r3, [pc, #224] ; (800738c <pbuf_copy+0x188>)
|
|
80072aa: f240 32d9 movw r2, #985 ; 0x3d9
|
|
80072ae: 493a ldr r1, [pc, #232] ; (8007398 <pbuf_copy+0x194>)
|
|
80072b0: 4838 ldr r0, [pc, #224] ; (8007394 <pbuf_copy+0x190>)
|
|
80072b2: f009 fc89 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
|
|
80072b6: 683b ldr r3, [r7, #0]
|
|
80072b8: 895b ldrh r3, [r3, #10]
|
|
80072ba: 461a mov r2, r3
|
|
80072bc: 693b ldr r3, [r7, #16]
|
|
80072be: 4293 cmp r3, r2
|
|
80072c0: d906 bls.n 80072d0 <pbuf_copy+0xcc>
|
|
80072c2: 4b32 ldr r3, [pc, #200] ; (800738c <pbuf_copy+0x188>)
|
|
80072c4: f240 32da movw r2, #986 ; 0x3da
|
|
80072c8: 4934 ldr r1, [pc, #208] ; (800739c <pbuf_copy+0x198>)
|
|
80072ca: 4832 ldr r0, [pc, #200] ; (8007394 <pbuf_copy+0x190>)
|
|
80072cc: f009 fc7c bl 8010bc8 <iprintf>
|
|
if (offset_from >= p_from->len) {
|
|
80072d0: 683b ldr r3, [r7, #0]
|
|
80072d2: 895b ldrh r3, [r3, #10]
|
|
80072d4: 461a mov r2, r3
|
|
80072d6: 693b ldr r3, [r7, #16]
|
|
80072d8: 4293 cmp r3, r2
|
|
80072da: d304 bcc.n 80072e6 <pbuf_copy+0xe2>
|
|
/* on to next p_from (if any) */
|
|
offset_from = 0;
|
|
80072dc: 2300 movs r3, #0
|
|
80072de: 613b str r3, [r7, #16]
|
|
p_from = p_from->next;
|
|
80072e0: 683b ldr r3, [r7, #0]
|
|
80072e2: 681b ldr r3, [r3, #0]
|
|
80072e4: 603b str r3, [r7, #0]
|
|
}
|
|
if (offset_to == p_to->len) {
|
|
80072e6: 687b ldr r3, [r7, #4]
|
|
80072e8: 895b ldrh r3, [r3, #10]
|
|
80072ea: 461a mov r2, r3
|
|
80072ec: 697b ldr r3, [r7, #20]
|
|
80072ee: 4293 cmp r3, r2
|
|
80072f0: d114 bne.n 800731c <pbuf_copy+0x118>
|
|
/* on to next p_to (if any) */
|
|
offset_to = 0;
|
|
80072f2: 2300 movs r3, #0
|
|
80072f4: 617b str r3, [r7, #20]
|
|
p_to = p_to->next;
|
|
80072f6: 687b ldr r3, [r7, #4]
|
|
80072f8: 681b ldr r3, [r3, #0]
|
|
80072fa: 607b str r3, [r7, #4]
|
|
LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL), return ERR_ARG;);
|
|
80072fc: 687b ldr r3, [r7, #4]
|
|
80072fe: 2b00 cmp r3, #0
|
|
8007300: d10c bne.n 800731c <pbuf_copy+0x118>
|
|
8007302: 683b ldr r3, [r7, #0]
|
|
8007304: 2b00 cmp r3, #0
|
|
8007306: d009 beq.n 800731c <pbuf_copy+0x118>
|
|
8007308: 4b20 ldr r3, [pc, #128] ; (800738c <pbuf_copy+0x188>)
|
|
800730a: f44f 7279 mov.w r2, #996 ; 0x3e4
|
|
800730e: 4924 ldr r1, [pc, #144] ; (80073a0 <pbuf_copy+0x19c>)
|
|
8007310: 4820 ldr r0, [pc, #128] ; (8007394 <pbuf_copy+0x190>)
|
|
8007312: f009 fc59 bl 8010bc8 <iprintf>
|
|
8007316: f06f 030f mvn.w r3, #15
|
|
800731a: e032 b.n 8007382 <pbuf_copy+0x17e>
|
|
}
|
|
|
|
if ((p_from != NULL) && (p_from->len == p_from->tot_len)) {
|
|
800731c: 683b ldr r3, [r7, #0]
|
|
800731e: 2b00 cmp r3, #0
|
|
8007320: d013 beq.n 800734a <pbuf_copy+0x146>
|
|
8007322: 683b ldr r3, [r7, #0]
|
|
8007324: 895a ldrh r2, [r3, #10]
|
|
8007326: 683b ldr r3, [r7, #0]
|
|
8007328: 891b ldrh r3, [r3, #8]
|
|
800732a: 429a cmp r2, r3
|
|
800732c: d10d bne.n 800734a <pbuf_copy+0x146>
|
|
/* don't copy more than one packet! */
|
|
LWIP_ERROR("pbuf_copy() does not allow packet queues!",
|
|
800732e: 683b ldr r3, [r7, #0]
|
|
8007330: 681b ldr r3, [r3, #0]
|
|
8007332: 2b00 cmp r3, #0
|
|
8007334: d009 beq.n 800734a <pbuf_copy+0x146>
|
|
8007336: 4b15 ldr r3, [pc, #84] ; (800738c <pbuf_copy+0x188>)
|
|
8007338: f240 32e9 movw r2, #1001 ; 0x3e9
|
|
800733c: 4919 ldr r1, [pc, #100] ; (80073a4 <pbuf_copy+0x1a0>)
|
|
800733e: 4815 ldr r0, [pc, #84] ; (8007394 <pbuf_copy+0x190>)
|
|
8007340: f009 fc42 bl 8010bc8 <iprintf>
|
|
8007344: f06f 0305 mvn.w r3, #5
|
|
8007348: e01b b.n 8007382 <pbuf_copy+0x17e>
|
|
(p_from->next == NULL), return ERR_VAL;);
|
|
}
|
|
if ((p_to != NULL) && (p_to->len == p_to->tot_len)) {
|
|
800734a: 687b ldr r3, [r7, #4]
|
|
800734c: 2b00 cmp r3, #0
|
|
800734e: d013 beq.n 8007378 <pbuf_copy+0x174>
|
|
8007350: 687b ldr r3, [r7, #4]
|
|
8007352: 895a ldrh r2, [r3, #10]
|
|
8007354: 687b ldr r3, [r7, #4]
|
|
8007356: 891b ldrh r3, [r3, #8]
|
|
8007358: 429a cmp r2, r3
|
|
800735a: d10d bne.n 8007378 <pbuf_copy+0x174>
|
|
/* don't copy more than one packet! */
|
|
LWIP_ERROR("pbuf_copy() does not allow packet queues!",
|
|
800735c: 687b ldr r3, [r7, #4]
|
|
800735e: 681b ldr r3, [r3, #0]
|
|
8007360: 2b00 cmp r3, #0
|
|
8007362: d009 beq.n 8007378 <pbuf_copy+0x174>
|
|
8007364: 4b09 ldr r3, [pc, #36] ; (800738c <pbuf_copy+0x188>)
|
|
8007366: f240 32ee movw r2, #1006 ; 0x3ee
|
|
800736a: 490e ldr r1, [pc, #56] ; (80073a4 <pbuf_copy+0x1a0>)
|
|
800736c: 4809 ldr r0, [pc, #36] ; (8007394 <pbuf_copy+0x190>)
|
|
800736e: f009 fc2b bl 8010bc8 <iprintf>
|
|
8007372: f06f 0305 mvn.w r3, #5
|
|
8007376: e004 b.n 8007382 <pbuf_copy+0x17e>
|
|
(p_to->next == NULL), return ERR_VAL;);
|
|
}
|
|
} while (p_from);
|
|
8007378: 683b ldr r3, [r7, #0]
|
|
800737a: 2b00 cmp r3, #0
|
|
800737c: f47f af61 bne.w 8007242 <pbuf_copy+0x3e>
|
|
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
|
|
return ERR_OK;
|
|
8007380: 2300 movs r3, #0
|
|
}
|
|
8007382: 4618 mov r0, r3
|
|
8007384: 3718 adds r7, #24
|
|
8007386: 46bd mov sp, r7
|
|
8007388: bd80 pop {r7, pc}
|
|
800738a: bf00 nop
|
|
800738c: 08012508 .word 0x08012508
|
|
8007390: 080127b0 .word 0x080127b0
|
|
8007394: 08012568 .word 0x08012568
|
|
8007398: 080127e0 .word 0x080127e0
|
|
800739c: 080127f8 .word 0x080127f8
|
|
80073a0: 08012814 .word 0x08012814
|
|
80073a4: 08012824 .word 0x08012824
|
|
|
|
080073a8 <pbuf_copy_partial>:
|
|
* @param offset offset into the packet buffer from where to begin copying len bytes
|
|
* @return the number of bytes copied, or 0 on failure
|
|
*/
|
|
u16_t
|
|
pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
|
|
{
|
|
80073a8: b580 push {r7, lr}
|
|
80073aa: b088 sub sp, #32
|
|
80073ac: af00 add r7, sp, #0
|
|
80073ae: 60f8 str r0, [r7, #12]
|
|
80073b0: 60b9 str r1, [r7, #8]
|
|
80073b2: 4611 mov r1, r2
|
|
80073b4: 461a mov r2, r3
|
|
80073b6: 460b mov r3, r1
|
|
80073b8: 80fb strh r3, [r7, #6]
|
|
80073ba: 4613 mov r3, r2
|
|
80073bc: 80bb strh r3, [r7, #4]
|
|
const struct pbuf *p;
|
|
u16_t left = 0;
|
|
80073be: 2300 movs r3, #0
|
|
80073c0: 837b strh r3, [r7, #26]
|
|
u16_t buf_copy_len;
|
|
u16_t copied_total = 0;
|
|
80073c2: 2300 movs r3, #0
|
|
80073c4: 82fb strh r3, [r7, #22]
|
|
|
|
LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;);
|
|
80073c6: 68fb ldr r3, [r7, #12]
|
|
80073c8: 2b00 cmp r3, #0
|
|
80073ca: d108 bne.n 80073de <pbuf_copy_partial+0x36>
|
|
80073cc: 4b2b ldr r3, [pc, #172] ; (800747c <pbuf_copy_partial+0xd4>)
|
|
80073ce: f240 420a movw r2, #1034 ; 0x40a
|
|
80073d2: 492b ldr r1, [pc, #172] ; (8007480 <pbuf_copy_partial+0xd8>)
|
|
80073d4: 482b ldr r0, [pc, #172] ; (8007484 <pbuf_copy_partial+0xdc>)
|
|
80073d6: f009 fbf7 bl 8010bc8 <iprintf>
|
|
80073da: 2300 movs r3, #0
|
|
80073dc: e04a b.n 8007474 <pbuf_copy_partial+0xcc>
|
|
LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;);
|
|
80073de: 68bb ldr r3, [r7, #8]
|
|
80073e0: 2b00 cmp r3, #0
|
|
80073e2: d108 bne.n 80073f6 <pbuf_copy_partial+0x4e>
|
|
80073e4: 4b25 ldr r3, [pc, #148] ; (800747c <pbuf_copy_partial+0xd4>)
|
|
80073e6: f240 420b movw r2, #1035 ; 0x40b
|
|
80073ea: 4927 ldr r1, [pc, #156] ; (8007488 <pbuf_copy_partial+0xe0>)
|
|
80073ec: 4825 ldr r0, [pc, #148] ; (8007484 <pbuf_copy_partial+0xdc>)
|
|
80073ee: f009 fbeb bl 8010bc8 <iprintf>
|
|
80073f2: 2300 movs r3, #0
|
|
80073f4: e03e b.n 8007474 <pbuf_copy_partial+0xcc>
|
|
|
|
/* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
|
|
for (p = buf; len != 0 && p != NULL; p = p->next) {
|
|
80073f6: 68fb ldr r3, [r7, #12]
|
|
80073f8: 61fb str r3, [r7, #28]
|
|
80073fa: e034 b.n 8007466 <pbuf_copy_partial+0xbe>
|
|
if ((offset != 0) && (offset >= p->len)) {
|
|
80073fc: 88bb ldrh r3, [r7, #4]
|
|
80073fe: 2b00 cmp r3, #0
|
|
8007400: d00a beq.n 8007418 <pbuf_copy_partial+0x70>
|
|
8007402: 69fb ldr r3, [r7, #28]
|
|
8007404: 895b ldrh r3, [r3, #10]
|
|
8007406: 88ba ldrh r2, [r7, #4]
|
|
8007408: 429a cmp r2, r3
|
|
800740a: d305 bcc.n 8007418 <pbuf_copy_partial+0x70>
|
|
/* don't copy from this buffer -> on to the next */
|
|
offset = (u16_t)(offset - p->len);
|
|
800740c: 69fb ldr r3, [r7, #28]
|
|
800740e: 895b ldrh r3, [r3, #10]
|
|
8007410: 88ba ldrh r2, [r7, #4]
|
|
8007412: 1ad3 subs r3, r2, r3
|
|
8007414: 80bb strh r3, [r7, #4]
|
|
8007416: e023 b.n 8007460 <pbuf_copy_partial+0xb8>
|
|
} else {
|
|
/* copy from this buffer. maybe only partially. */
|
|
buf_copy_len = (u16_t)(p->len - offset);
|
|
8007418: 69fb ldr r3, [r7, #28]
|
|
800741a: 895a ldrh r2, [r3, #10]
|
|
800741c: 88bb ldrh r3, [r7, #4]
|
|
800741e: 1ad3 subs r3, r2, r3
|
|
8007420: 833b strh r3, [r7, #24]
|
|
if (buf_copy_len > len) {
|
|
8007422: 8b3a ldrh r2, [r7, #24]
|
|
8007424: 88fb ldrh r3, [r7, #6]
|
|
8007426: 429a cmp r2, r3
|
|
8007428: d901 bls.n 800742e <pbuf_copy_partial+0x86>
|
|
buf_copy_len = len;
|
|
800742a: 88fb ldrh r3, [r7, #6]
|
|
800742c: 833b strh r3, [r7, #24]
|
|
}
|
|
/* copy the necessary parts of the buffer */
|
|
MEMCPY(&((char *)dataptr)[left], &((char *)p->payload)[offset], buf_copy_len);
|
|
800742e: 8b7b ldrh r3, [r7, #26]
|
|
8007430: 68ba ldr r2, [r7, #8]
|
|
8007432: 18d0 adds r0, r2, r3
|
|
8007434: 69fb ldr r3, [r7, #28]
|
|
8007436: 685a ldr r2, [r3, #4]
|
|
8007438: 88bb ldrh r3, [r7, #4]
|
|
800743a: 4413 add r3, r2
|
|
800743c: 8b3a ldrh r2, [r7, #24]
|
|
800743e: 4619 mov r1, r3
|
|
8007440: f009 fda3 bl 8010f8a <memcpy>
|
|
copied_total = (u16_t)(copied_total + buf_copy_len);
|
|
8007444: 8afa ldrh r2, [r7, #22]
|
|
8007446: 8b3b ldrh r3, [r7, #24]
|
|
8007448: 4413 add r3, r2
|
|
800744a: 82fb strh r3, [r7, #22]
|
|
left = (u16_t)(left + buf_copy_len);
|
|
800744c: 8b7a ldrh r2, [r7, #26]
|
|
800744e: 8b3b ldrh r3, [r7, #24]
|
|
8007450: 4413 add r3, r2
|
|
8007452: 837b strh r3, [r7, #26]
|
|
len = (u16_t)(len - buf_copy_len);
|
|
8007454: 88fa ldrh r2, [r7, #6]
|
|
8007456: 8b3b ldrh r3, [r7, #24]
|
|
8007458: 1ad3 subs r3, r2, r3
|
|
800745a: 80fb strh r3, [r7, #6]
|
|
offset = 0;
|
|
800745c: 2300 movs r3, #0
|
|
800745e: 80bb strh r3, [r7, #4]
|
|
for (p = buf; len != 0 && p != NULL; p = p->next) {
|
|
8007460: 69fb ldr r3, [r7, #28]
|
|
8007462: 681b ldr r3, [r3, #0]
|
|
8007464: 61fb str r3, [r7, #28]
|
|
8007466: 88fb ldrh r3, [r7, #6]
|
|
8007468: 2b00 cmp r3, #0
|
|
800746a: d002 beq.n 8007472 <pbuf_copy_partial+0xca>
|
|
800746c: 69fb ldr r3, [r7, #28]
|
|
800746e: 2b00 cmp r3, #0
|
|
8007470: d1c4 bne.n 80073fc <pbuf_copy_partial+0x54>
|
|
}
|
|
}
|
|
return copied_total;
|
|
8007472: 8afb ldrh r3, [r7, #22]
|
|
}
|
|
8007474: 4618 mov r0, r3
|
|
8007476: 3720 adds r7, #32
|
|
8007478: 46bd mov sp, r7
|
|
800747a: bd80 pop {r7, pc}
|
|
800747c: 08012508 .word 0x08012508
|
|
8007480: 08012850 .word 0x08012850
|
|
8007484: 08012568 .word 0x08012568
|
|
8007488: 08012870 .word 0x08012870
|
|
|
|
0800748c <pbuf_clone>:
|
|
*
|
|
* @return a new pbuf or NULL if allocation fails
|
|
*/
|
|
struct pbuf *
|
|
pbuf_clone(pbuf_layer layer, pbuf_type type, struct pbuf *p)
|
|
{
|
|
800748c: b580 push {r7, lr}
|
|
800748e: b084 sub sp, #16
|
|
8007490: af00 add r7, sp, #0
|
|
8007492: 4603 mov r3, r0
|
|
8007494: 603a str r2, [r7, #0]
|
|
8007496: 71fb strb r3, [r7, #7]
|
|
8007498: 460b mov r3, r1
|
|
800749a: 80bb strh r3, [r7, #4]
|
|
struct pbuf *q;
|
|
err_t err;
|
|
q = pbuf_alloc(layer, p->tot_len, type);
|
|
800749c: 683b ldr r3, [r7, #0]
|
|
800749e: 8919 ldrh r1, [r3, #8]
|
|
80074a0: 88ba ldrh r2, [r7, #4]
|
|
80074a2: 79fb ldrb r3, [r7, #7]
|
|
80074a4: 4618 mov r0, r3
|
|
80074a6: f7ff fab1 bl 8006a0c <pbuf_alloc>
|
|
80074aa: 60f8 str r0, [r7, #12]
|
|
if (q == NULL) {
|
|
80074ac: 68fb ldr r3, [r7, #12]
|
|
80074ae: 2b00 cmp r3, #0
|
|
80074b0: d101 bne.n 80074b6 <pbuf_clone+0x2a>
|
|
return NULL;
|
|
80074b2: 2300 movs r3, #0
|
|
80074b4: e011 b.n 80074da <pbuf_clone+0x4e>
|
|
}
|
|
err = pbuf_copy(q, p);
|
|
80074b6: 6839 ldr r1, [r7, #0]
|
|
80074b8: 68f8 ldr r0, [r7, #12]
|
|
80074ba: f7ff fea3 bl 8007204 <pbuf_copy>
|
|
80074be: 4603 mov r3, r0
|
|
80074c0: 72fb strb r3, [r7, #11]
|
|
LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */
|
|
LWIP_ASSERT("pbuf_copy failed", err == ERR_OK);
|
|
80074c2: f997 300b ldrsb.w r3, [r7, #11]
|
|
80074c6: 2b00 cmp r3, #0
|
|
80074c8: d006 beq.n 80074d8 <pbuf_clone+0x4c>
|
|
80074ca: 4b06 ldr r3, [pc, #24] ; (80074e4 <pbuf_clone+0x58>)
|
|
80074cc: f240 5224 movw r2, #1316 ; 0x524
|
|
80074d0: 4905 ldr r1, [pc, #20] ; (80074e8 <pbuf_clone+0x5c>)
|
|
80074d2: 4806 ldr r0, [pc, #24] ; (80074ec <pbuf_clone+0x60>)
|
|
80074d4: f009 fb78 bl 8010bc8 <iprintf>
|
|
return q;
|
|
80074d8: 68fb ldr r3, [r7, #12]
|
|
}
|
|
80074da: 4618 mov r0, r3
|
|
80074dc: 3710 adds r7, #16
|
|
80074de: 46bd mov sp, r7
|
|
80074e0: bd80 pop {r7, pc}
|
|
80074e2: bf00 nop
|
|
80074e4: 08012508 .word 0x08012508
|
|
80074e8: 0801297c .word 0x0801297c
|
|
80074ec: 08012568 .word 0x08012568
|
|
|
|
080074f0 <tcp_init>:
|
|
/**
|
|
* Initialize this module.
|
|
*/
|
|
void
|
|
tcp_init(void)
|
|
{
|
|
80074f0: b580 push {r7, lr}
|
|
80074f2: af00 add r7, sp, #0
|
|
#ifdef LWIP_RAND
|
|
tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
|
|
80074f4: f008 feb4 bl 8010260 <rand>
|
|
80074f8: 4603 mov r3, r0
|
|
80074fa: b29b uxth r3, r3
|
|
80074fc: f3c3 030d ubfx r3, r3, #0, #14
|
|
8007500: b29b uxth r3, r3
|
|
8007502: f5a3 4380 sub.w r3, r3, #16384 ; 0x4000
|
|
8007506: b29a uxth r2, r3
|
|
8007508: 4b01 ldr r3, [pc, #4] ; (8007510 <tcp_init+0x20>)
|
|
800750a: 801a strh r2, [r3, #0]
|
|
#endif /* LWIP_RAND */
|
|
}
|
|
800750c: bf00 nop
|
|
800750e: bd80 pop {r7, pc}
|
|
8007510: 24000068 .word 0x24000068
|
|
|
|
08007514 <tcp_free>:
|
|
|
|
/** Free a tcp pcb */
|
|
void
|
|
tcp_free(struct tcp_pcb *pcb)
|
|
{
|
|
8007514: b580 push {r7, lr}
|
|
8007516: b082 sub sp, #8
|
|
8007518: af00 add r7, sp, #0
|
|
800751a: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("tcp_free: LISTEN", pcb->state != LISTEN);
|
|
800751c: 687b ldr r3, [r7, #4]
|
|
800751e: 7d1b ldrb r3, [r3, #20]
|
|
8007520: 2b01 cmp r3, #1
|
|
8007522: d105 bne.n 8007530 <tcp_free+0x1c>
|
|
8007524: 4b06 ldr r3, [pc, #24] ; (8007540 <tcp_free+0x2c>)
|
|
8007526: 22d4 movs r2, #212 ; 0xd4
|
|
8007528: 4906 ldr r1, [pc, #24] ; (8007544 <tcp_free+0x30>)
|
|
800752a: 4807 ldr r0, [pc, #28] ; (8007548 <tcp_free+0x34>)
|
|
800752c: f009 fb4c bl 8010bc8 <iprintf>
|
|
#if LWIP_TCP_PCB_NUM_EXT_ARGS
|
|
tcp_ext_arg_invoke_callbacks_destroyed(pcb->ext_args);
|
|
#endif
|
|
memp_free(MEMP_TCP_PCB, pcb);
|
|
8007530: 6879 ldr r1, [r7, #4]
|
|
8007532: 2001 movs r0, #1
|
|
8007534: f7fe fde2 bl 80060fc <memp_free>
|
|
}
|
|
8007538: bf00 nop
|
|
800753a: 3708 adds r7, #8
|
|
800753c: 46bd mov sp, r7
|
|
800753e: bd80 pop {r7, pc}
|
|
8007540: 08012a08 .word 0x08012a08
|
|
8007544: 08012a38 .word 0x08012a38
|
|
8007548: 08012a4c .word 0x08012a4c
|
|
|
|
0800754c <tcp_free_listen>:
|
|
|
|
/** Free a tcp listen pcb */
|
|
static void
|
|
tcp_free_listen(struct tcp_pcb *pcb)
|
|
{
|
|
800754c: b580 push {r7, lr}
|
|
800754e: b082 sub sp, #8
|
|
8007550: af00 add r7, sp, #0
|
|
8007552: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("tcp_free_listen: !LISTEN", pcb->state != LISTEN);
|
|
8007554: 687b ldr r3, [r7, #4]
|
|
8007556: 7d1b ldrb r3, [r3, #20]
|
|
8007558: 2b01 cmp r3, #1
|
|
800755a: d105 bne.n 8007568 <tcp_free_listen+0x1c>
|
|
800755c: 4b06 ldr r3, [pc, #24] ; (8007578 <tcp_free_listen+0x2c>)
|
|
800755e: 22df movs r2, #223 ; 0xdf
|
|
8007560: 4906 ldr r1, [pc, #24] ; (800757c <tcp_free_listen+0x30>)
|
|
8007562: 4807 ldr r0, [pc, #28] ; (8007580 <tcp_free_listen+0x34>)
|
|
8007564: f009 fb30 bl 8010bc8 <iprintf>
|
|
#if LWIP_TCP_PCB_NUM_EXT_ARGS
|
|
tcp_ext_arg_invoke_callbacks_destroyed(pcb->ext_args);
|
|
#endif
|
|
memp_free(MEMP_TCP_PCB_LISTEN, pcb);
|
|
8007568: 6879 ldr r1, [r7, #4]
|
|
800756a: 2002 movs r0, #2
|
|
800756c: f7fe fdc6 bl 80060fc <memp_free>
|
|
}
|
|
8007570: bf00 nop
|
|
8007572: 3708 adds r7, #8
|
|
8007574: 46bd mov sp, r7
|
|
8007576: bd80 pop {r7, pc}
|
|
8007578: 08012a08 .word 0x08012a08
|
|
800757c: 08012a74 .word 0x08012a74
|
|
8007580: 08012a4c .word 0x08012a4c
|
|
|
|
08007584 <tcp_tmr>:
|
|
/**
|
|
* Called periodically to dispatch TCP timers.
|
|
*/
|
|
void
|
|
tcp_tmr(void)
|
|
{
|
|
8007584: b580 push {r7, lr}
|
|
8007586: af00 add r7, sp, #0
|
|
/* Call tcp_fasttmr() every 250 ms */
|
|
tcp_fasttmr();
|
|
8007588: f001 f800 bl 800858c <tcp_fasttmr>
|
|
|
|
if (++tcp_timer & 1) {
|
|
800758c: 4b07 ldr r3, [pc, #28] ; (80075ac <tcp_tmr+0x28>)
|
|
800758e: 781b ldrb r3, [r3, #0]
|
|
8007590: 3301 adds r3, #1
|
|
8007592: b2da uxtb r2, r3
|
|
8007594: 4b05 ldr r3, [pc, #20] ; (80075ac <tcp_tmr+0x28>)
|
|
8007596: 701a strb r2, [r3, #0]
|
|
8007598: 4b04 ldr r3, [pc, #16] ; (80075ac <tcp_tmr+0x28>)
|
|
800759a: 781b ldrb r3, [r3, #0]
|
|
800759c: f003 0301 and.w r3, r3, #1
|
|
80075a0: 2b00 cmp r3, #0
|
|
80075a2: d001 beq.n 80075a8 <tcp_tmr+0x24>
|
|
/* Call tcp_slowtmr() every 500 ms, i.e., every other timer
|
|
tcp_tmr() is called. */
|
|
tcp_slowtmr();
|
|
80075a4: f000 fcb2 bl 8007f0c <tcp_slowtmr>
|
|
}
|
|
}
|
|
80075a8: bf00 nop
|
|
80075aa: bd80 pop {r7, pc}
|
|
80075ac: 24007b81 .word 0x24007b81
|
|
|
|
080075b0 <tcp_remove_listener>:
|
|
/** Called when a listen pcb is closed. Iterates one pcb list and removes the
|
|
* closed listener pcb from pcb->listener if matching.
|
|
*/
|
|
static void
|
|
tcp_remove_listener(struct tcp_pcb *list, struct tcp_pcb_listen *lpcb)
|
|
{
|
|
80075b0: b580 push {r7, lr}
|
|
80075b2: b084 sub sp, #16
|
|
80075b4: af00 add r7, sp, #0
|
|
80075b6: 6078 str r0, [r7, #4]
|
|
80075b8: 6039 str r1, [r7, #0]
|
|
struct tcp_pcb *pcb;
|
|
|
|
LWIP_ASSERT("tcp_remove_listener: invalid listener", lpcb != NULL);
|
|
80075ba: 683b ldr r3, [r7, #0]
|
|
80075bc: 2b00 cmp r3, #0
|
|
80075be: d105 bne.n 80075cc <tcp_remove_listener+0x1c>
|
|
80075c0: 4b0d ldr r3, [pc, #52] ; (80075f8 <tcp_remove_listener+0x48>)
|
|
80075c2: 22ff movs r2, #255 ; 0xff
|
|
80075c4: 490d ldr r1, [pc, #52] ; (80075fc <tcp_remove_listener+0x4c>)
|
|
80075c6: 480e ldr r0, [pc, #56] ; (8007600 <tcp_remove_listener+0x50>)
|
|
80075c8: f009 fafe bl 8010bc8 <iprintf>
|
|
|
|
for (pcb = list; pcb != NULL; pcb = pcb->next) {
|
|
80075cc: 687b ldr r3, [r7, #4]
|
|
80075ce: 60fb str r3, [r7, #12]
|
|
80075d0: e00a b.n 80075e8 <tcp_remove_listener+0x38>
|
|
if (pcb->listener == lpcb) {
|
|
80075d2: 68fb ldr r3, [r7, #12]
|
|
80075d4: 6fdb ldr r3, [r3, #124] ; 0x7c
|
|
80075d6: 683a ldr r2, [r7, #0]
|
|
80075d8: 429a cmp r2, r3
|
|
80075da: d102 bne.n 80075e2 <tcp_remove_listener+0x32>
|
|
pcb->listener = NULL;
|
|
80075dc: 68fb ldr r3, [r7, #12]
|
|
80075de: 2200 movs r2, #0
|
|
80075e0: 67da str r2, [r3, #124] ; 0x7c
|
|
for (pcb = list; pcb != NULL; pcb = pcb->next) {
|
|
80075e2: 68fb ldr r3, [r7, #12]
|
|
80075e4: 68db ldr r3, [r3, #12]
|
|
80075e6: 60fb str r3, [r7, #12]
|
|
80075e8: 68fb ldr r3, [r7, #12]
|
|
80075ea: 2b00 cmp r3, #0
|
|
80075ec: d1f1 bne.n 80075d2 <tcp_remove_listener+0x22>
|
|
}
|
|
}
|
|
}
|
|
80075ee: bf00 nop
|
|
80075f0: bf00 nop
|
|
80075f2: 3710 adds r7, #16
|
|
80075f4: 46bd mov sp, r7
|
|
80075f6: bd80 pop {r7, pc}
|
|
80075f8: 08012a08 .word 0x08012a08
|
|
80075fc: 08012a90 .word 0x08012a90
|
|
8007600: 08012a4c .word 0x08012a4c
|
|
|
|
08007604 <tcp_listen_closed>:
|
|
/** Called when a listen pcb is closed. Iterates all pcb lists and removes the
|
|
* closed listener pcb from pcb->listener if matching.
|
|
*/
|
|
static void
|
|
tcp_listen_closed(struct tcp_pcb *pcb)
|
|
{
|
|
8007604: b580 push {r7, lr}
|
|
8007606: b084 sub sp, #16
|
|
8007608: af00 add r7, sp, #0
|
|
800760a: 6078 str r0, [r7, #4]
|
|
#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
|
|
size_t i;
|
|
LWIP_ASSERT("pcb != NULL", pcb != NULL);
|
|
800760c: 687b ldr r3, [r7, #4]
|
|
800760e: 2b00 cmp r3, #0
|
|
8007610: d106 bne.n 8007620 <tcp_listen_closed+0x1c>
|
|
8007612: 4b14 ldr r3, [pc, #80] ; (8007664 <tcp_listen_closed+0x60>)
|
|
8007614: f240 1211 movw r2, #273 ; 0x111
|
|
8007618: 4913 ldr r1, [pc, #76] ; (8007668 <tcp_listen_closed+0x64>)
|
|
800761a: 4814 ldr r0, [pc, #80] ; (800766c <tcp_listen_closed+0x68>)
|
|
800761c: f009 fad4 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("pcb->state == LISTEN", pcb->state == LISTEN);
|
|
8007620: 687b ldr r3, [r7, #4]
|
|
8007622: 7d1b ldrb r3, [r3, #20]
|
|
8007624: 2b01 cmp r3, #1
|
|
8007626: d006 beq.n 8007636 <tcp_listen_closed+0x32>
|
|
8007628: 4b0e ldr r3, [pc, #56] ; (8007664 <tcp_listen_closed+0x60>)
|
|
800762a: f44f 7289 mov.w r2, #274 ; 0x112
|
|
800762e: 4910 ldr r1, [pc, #64] ; (8007670 <tcp_listen_closed+0x6c>)
|
|
8007630: 480e ldr r0, [pc, #56] ; (800766c <tcp_listen_closed+0x68>)
|
|
8007632: f009 fac9 bl 8010bc8 <iprintf>
|
|
for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) {
|
|
8007636: 2301 movs r3, #1
|
|
8007638: 60fb str r3, [r7, #12]
|
|
800763a: e00b b.n 8007654 <tcp_listen_closed+0x50>
|
|
tcp_remove_listener(*tcp_pcb_lists[i], (struct tcp_pcb_listen *)pcb);
|
|
800763c: 4a0d ldr r2, [pc, #52] ; (8007674 <tcp_listen_closed+0x70>)
|
|
800763e: 68fb ldr r3, [r7, #12]
|
|
8007640: f852 3023 ldr.w r3, [r2, r3, lsl #2]
|
|
8007644: 681b ldr r3, [r3, #0]
|
|
8007646: 6879 ldr r1, [r7, #4]
|
|
8007648: 4618 mov r0, r3
|
|
800764a: f7ff ffb1 bl 80075b0 <tcp_remove_listener>
|
|
for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) {
|
|
800764e: 68fb ldr r3, [r7, #12]
|
|
8007650: 3301 adds r3, #1
|
|
8007652: 60fb str r3, [r7, #12]
|
|
8007654: 68fb ldr r3, [r7, #12]
|
|
8007656: 2b03 cmp r3, #3
|
|
8007658: d9f0 bls.n 800763c <tcp_listen_closed+0x38>
|
|
}
|
|
#endif
|
|
LWIP_UNUSED_ARG(pcb);
|
|
}
|
|
800765a: bf00 nop
|
|
800765c: bf00 nop
|
|
800765e: 3710 adds r7, #16
|
|
8007660: 46bd mov sp, r7
|
|
8007662: bd80 pop {r7, pc}
|
|
8007664: 08012a08 .word 0x08012a08
|
|
8007668: 08012ab8 .word 0x08012ab8
|
|
800766c: 08012a4c .word 0x08012a4c
|
|
8007670: 08012ac4 .word 0x08012ac4
|
|
8007674: 08014d6c .word 0x08014d6c
|
|
|
|
08007678 <tcp_close_shutdown>:
|
|
* @return ERR_OK if connection has been closed
|
|
* another err_t if closing failed and pcb is not freed
|
|
*/
|
|
static err_t
|
|
tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data)
|
|
{
|
|
8007678: b5b0 push {r4, r5, r7, lr}
|
|
800767a: b088 sub sp, #32
|
|
800767c: af04 add r7, sp, #16
|
|
800767e: 6078 str r0, [r7, #4]
|
|
8007680: 460b mov r3, r1
|
|
8007682: 70fb strb r3, [r7, #3]
|
|
LWIP_ASSERT("tcp_close_shutdown: invalid pcb", pcb != NULL);
|
|
8007684: 687b ldr r3, [r7, #4]
|
|
8007686: 2b00 cmp r3, #0
|
|
8007688: d106 bne.n 8007698 <tcp_close_shutdown+0x20>
|
|
800768a: 4b63 ldr r3, [pc, #396] ; (8007818 <tcp_close_shutdown+0x1a0>)
|
|
800768c: f44f 72af mov.w r2, #350 ; 0x15e
|
|
8007690: 4962 ldr r1, [pc, #392] ; (800781c <tcp_close_shutdown+0x1a4>)
|
|
8007692: 4863 ldr r0, [pc, #396] ; (8007820 <tcp_close_shutdown+0x1a8>)
|
|
8007694: f009 fa98 bl 8010bc8 <iprintf>
|
|
|
|
if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
|
|
8007698: 78fb ldrb r3, [r7, #3]
|
|
800769a: 2b00 cmp r3, #0
|
|
800769c: d066 beq.n 800776c <tcp_close_shutdown+0xf4>
|
|
800769e: 687b ldr r3, [r7, #4]
|
|
80076a0: 7d1b ldrb r3, [r3, #20]
|
|
80076a2: 2b04 cmp r3, #4
|
|
80076a4: d003 beq.n 80076ae <tcp_close_shutdown+0x36>
|
|
80076a6: 687b ldr r3, [r7, #4]
|
|
80076a8: 7d1b ldrb r3, [r3, #20]
|
|
80076aa: 2b07 cmp r3, #7
|
|
80076ac: d15e bne.n 800776c <tcp_close_shutdown+0xf4>
|
|
if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND_MAX(pcb))) {
|
|
80076ae: 687b ldr r3, [r7, #4]
|
|
80076b0: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
80076b2: 2b00 cmp r3, #0
|
|
80076b4: d104 bne.n 80076c0 <tcp_close_shutdown+0x48>
|
|
80076b6: 687b ldr r3, [r7, #4]
|
|
80076b8: 8d1b ldrh r3, [r3, #40] ; 0x28
|
|
80076ba: f5b3 6f06 cmp.w r3, #2144 ; 0x860
|
|
80076be: d055 beq.n 800776c <tcp_close_shutdown+0xf4>
|
|
/* Not all data received by application, send RST to tell the remote
|
|
side about this. */
|
|
LWIP_ASSERT("pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
|
|
80076c0: 687b ldr r3, [r7, #4]
|
|
80076c2: 8b5b ldrh r3, [r3, #26]
|
|
80076c4: f003 0310 and.w r3, r3, #16
|
|
80076c8: 2b00 cmp r3, #0
|
|
80076ca: d106 bne.n 80076da <tcp_close_shutdown+0x62>
|
|
80076cc: 4b52 ldr r3, [pc, #328] ; (8007818 <tcp_close_shutdown+0x1a0>)
|
|
80076ce: f44f 72b2 mov.w r2, #356 ; 0x164
|
|
80076d2: 4954 ldr r1, [pc, #336] ; (8007824 <tcp_close_shutdown+0x1ac>)
|
|
80076d4: 4852 ldr r0, [pc, #328] ; (8007820 <tcp_close_shutdown+0x1a8>)
|
|
80076d6: f009 fa77 bl 8010bc8 <iprintf>
|
|
|
|
/* don't call tcp_abort here: we must not deallocate the pcb since
|
|
that might not be expected when calling tcp_close */
|
|
tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
|
|
80076da: 687b ldr r3, [r7, #4]
|
|
80076dc: 6d18 ldr r0, [r3, #80] ; 0x50
|
|
80076de: 687b ldr r3, [r7, #4]
|
|
80076e0: 6a5c ldr r4, [r3, #36] ; 0x24
|
|
80076e2: 687d ldr r5, [r7, #4]
|
|
80076e4: 687b ldr r3, [r7, #4]
|
|
80076e6: 3304 adds r3, #4
|
|
80076e8: 687a ldr r2, [r7, #4]
|
|
80076ea: 8ad2 ldrh r2, [r2, #22]
|
|
80076ec: 6879 ldr r1, [r7, #4]
|
|
80076ee: 8b09 ldrh r1, [r1, #24]
|
|
80076f0: 9102 str r1, [sp, #8]
|
|
80076f2: 9201 str r2, [sp, #4]
|
|
80076f4: 9300 str r3, [sp, #0]
|
|
80076f6: 462b mov r3, r5
|
|
80076f8: 4622 mov r2, r4
|
|
80076fa: 4601 mov r1, r0
|
|
80076fc: 6878 ldr r0, [r7, #4]
|
|
80076fe: f005 fd39 bl 800d174 <tcp_rst>
|
|
pcb->local_port, pcb->remote_port);
|
|
|
|
tcp_pcb_purge(pcb);
|
|
8007702: 6878 ldr r0, [r7, #4]
|
|
8007704: f001 faa4 bl 8008c50 <tcp_pcb_purge>
|
|
TCP_RMV_ACTIVE(pcb);
|
|
8007708: 4b47 ldr r3, [pc, #284] ; (8007828 <tcp_close_shutdown+0x1b0>)
|
|
800770a: 681b ldr r3, [r3, #0]
|
|
800770c: 687a ldr r2, [r7, #4]
|
|
800770e: 429a cmp r2, r3
|
|
8007710: d105 bne.n 800771e <tcp_close_shutdown+0xa6>
|
|
8007712: 4b45 ldr r3, [pc, #276] ; (8007828 <tcp_close_shutdown+0x1b0>)
|
|
8007714: 681b ldr r3, [r3, #0]
|
|
8007716: 68db ldr r3, [r3, #12]
|
|
8007718: 4a43 ldr r2, [pc, #268] ; (8007828 <tcp_close_shutdown+0x1b0>)
|
|
800771a: 6013 str r3, [r2, #0]
|
|
800771c: e013 b.n 8007746 <tcp_close_shutdown+0xce>
|
|
800771e: 4b42 ldr r3, [pc, #264] ; (8007828 <tcp_close_shutdown+0x1b0>)
|
|
8007720: 681b ldr r3, [r3, #0]
|
|
8007722: 60fb str r3, [r7, #12]
|
|
8007724: e00c b.n 8007740 <tcp_close_shutdown+0xc8>
|
|
8007726: 68fb ldr r3, [r7, #12]
|
|
8007728: 68db ldr r3, [r3, #12]
|
|
800772a: 687a ldr r2, [r7, #4]
|
|
800772c: 429a cmp r2, r3
|
|
800772e: d104 bne.n 800773a <tcp_close_shutdown+0xc2>
|
|
8007730: 687b ldr r3, [r7, #4]
|
|
8007732: 68da ldr r2, [r3, #12]
|
|
8007734: 68fb ldr r3, [r7, #12]
|
|
8007736: 60da str r2, [r3, #12]
|
|
8007738: e005 b.n 8007746 <tcp_close_shutdown+0xce>
|
|
800773a: 68fb ldr r3, [r7, #12]
|
|
800773c: 68db ldr r3, [r3, #12]
|
|
800773e: 60fb str r3, [r7, #12]
|
|
8007740: 68fb ldr r3, [r7, #12]
|
|
8007742: 2b00 cmp r3, #0
|
|
8007744: d1ef bne.n 8007726 <tcp_close_shutdown+0xae>
|
|
8007746: 687b ldr r3, [r7, #4]
|
|
8007748: 2200 movs r2, #0
|
|
800774a: 60da str r2, [r3, #12]
|
|
800774c: 4b37 ldr r3, [pc, #220] ; (800782c <tcp_close_shutdown+0x1b4>)
|
|
800774e: 2201 movs r2, #1
|
|
8007750: 701a strb r2, [r3, #0]
|
|
/* Deallocate the pcb since we already sent a RST for it */
|
|
if (tcp_input_pcb == pcb) {
|
|
8007752: 4b37 ldr r3, [pc, #220] ; (8007830 <tcp_close_shutdown+0x1b8>)
|
|
8007754: 681b ldr r3, [r3, #0]
|
|
8007756: 687a ldr r2, [r7, #4]
|
|
8007758: 429a cmp r2, r3
|
|
800775a: d102 bne.n 8007762 <tcp_close_shutdown+0xea>
|
|
/* prevent using a deallocated pcb: free it from tcp_input later */
|
|
tcp_trigger_input_pcb_close();
|
|
800775c: f003 ff42 bl 800b5e4 <tcp_trigger_input_pcb_close>
|
|
8007760: e002 b.n 8007768 <tcp_close_shutdown+0xf0>
|
|
} else {
|
|
tcp_free(pcb);
|
|
8007762: 6878 ldr r0, [r7, #4]
|
|
8007764: f7ff fed6 bl 8007514 <tcp_free>
|
|
}
|
|
return ERR_OK;
|
|
8007768: 2300 movs r3, #0
|
|
800776a: e050 b.n 800780e <tcp_close_shutdown+0x196>
|
|
}
|
|
}
|
|
|
|
/* - states which free the pcb are handled here,
|
|
- states which send FIN and change state are handled in tcp_close_shutdown_fin() */
|
|
switch (pcb->state) {
|
|
800776c: 687b ldr r3, [r7, #4]
|
|
800776e: 7d1b ldrb r3, [r3, #20]
|
|
8007770: 2b02 cmp r3, #2
|
|
8007772: d03b beq.n 80077ec <tcp_close_shutdown+0x174>
|
|
8007774: 2b02 cmp r3, #2
|
|
8007776: dc44 bgt.n 8007802 <tcp_close_shutdown+0x18a>
|
|
8007778: 2b00 cmp r3, #0
|
|
800777a: d002 beq.n 8007782 <tcp_close_shutdown+0x10a>
|
|
800777c: 2b01 cmp r3, #1
|
|
800777e: d02a beq.n 80077d6 <tcp_close_shutdown+0x15e>
|
|
8007780: e03f b.n 8007802 <tcp_close_shutdown+0x18a>
|
|
* and the user needs some way to free it should the need arise.
|
|
* Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
|
|
* or for a pcb that has been used and then entered the CLOSED state
|
|
* is erroneous, but this should never happen as the pcb has in those cases
|
|
* been freed, and so any remaining handles are bogus. */
|
|
if (pcb->local_port != 0) {
|
|
8007782: 687b ldr r3, [r7, #4]
|
|
8007784: 8adb ldrh r3, [r3, #22]
|
|
8007786: 2b00 cmp r3, #0
|
|
8007788: d021 beq.n 80077ce <tcp_close_shutdown+0x156>
|
|
TCP_RMV(&tcp_bound_pcbs, pcb);
|
|
800778a: 4b2a ldr r3, [pc, #168] ; (8007834 <tcp_close_shutdown+0x1bc>)
|
|
800778c: 681b ldr r3, [r3, #0]
|
|
800778e: 687a ldr r2, [r7, #4]
|
|
8007790: 429a cmp r2, r3
|
|
8007792: d105 bne.n 80077a0 <tcp_close_shutdown+0x128>
|
|
8007794: 4b27 ldr r3, [pc, #156] ; (8007834 <tcp_close_shutdown+0x1bc>)
|
|
8007796: 681b ldr r3, [r3, #0]
|
|
8007798: 68db ldr r3, [r3, #12]
|
|
800779a: 4a26 ldr r2, [pc, #152] ; (8007834 <tcp_close_shutdown+0x1bc>)
|
|
800779c: 6013 str r3, [r2, #0]
|
|
800779e: e013 b.n 80077c8 <tcp_close_shutdown+0x150>
|
|
80077a0: 4b24 ldr r3, [pc, #144] ; (8007834 <tcp_close_shutdown+0x1bc>)
|
|
80077a2: 681b ldr r3, [r3, #0]
|
|
80077a4: 60bb str r3, [r7, #8]
|
|
80077a6: e00c b.n 80077c2 <tcp_close_shutdown+0x14a>
|
|
80077a8: 68bb ldr r3, [r7, #8]
|
|
80077aa: 68db ldr r3, [r3, #12]
|
|
80077ac: 687a ldr r2, [r7, #4]
|
|
80077ae: 429a cmp r2, r3
|
|
80077b0: d104 bne.n 80077bc <tcp_close_shutdown+0x144>
|
|
80077b2: 687b ldr r3, [r7, #4]
|
|
80077b4: 68da ldr r2, [r3, #12]
|
|
80077b6: 68bb ldr r3, [r7, #8]
|
|
80077b8: 60da str r2, [r3, #12]
|
|
80077ba: e005 b.n 80077c8 <tcp_close_shutdown+0x150>
|
|
80077bc: 68bb ldr r3, [r7, #8]
|
|
80077be: 68db ldr r3, [r3, #12]
|
|
80077c0: 60bb str r3, [r7, #8]
|
|
80077c2: 68bb ldr r3, [r7, #8]
|
|
80077c4: 2b00 cmp r3, #0
|
|
80077c6: d1ef bne.n 80077a8 <tcp_close_shutdown+0x130>
|
|
80077c8: 687b ldr r3, [r7, #4]
|
|
80077ca: 2200 movs r2, #0
|
|
80077cc: 60da str r2, [r3, #12]
|
|
}
|
|
tcp_free(pcb);
|
|
80077ce: 6878 ldr r0, [r7, #4]
|
|
80077d0: f7ff fea0 bl 8007514 <tcp_free>
|
|
break;
|
|
80077d4: e01a b.n 800780c <tcp_close_shutdown+0x194>
|
|
case LISTEN:
|
|
tcp_listen_closed(pcb);
|
|
80077d6: 6878 ldr r0, [r7, #4]
|
|
80077d8: f7ff ff14 bl 8007604 <tcp_listen_closed>
|
|
tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
|
|
80077dc: 6879 ldr r1, [r7, #4]
|
|
80077de: 4816 ldr r0, [pc, #88] ; (8007838 <tcp_close_shutdown+0x1c0>)
|
|
80077e0: f001 fa86 bl 8008cf0 <tcp_pcb_remove>
|
|
tcp_free_listen(pcb);
|
|
80077e4: 6878 ldr r0, [r7, #4]
|
|
80077e6: f7ff feb1 bl 800754c <tcp_free_listen>
|
|
break;
|
|
80077ea: e00f b.n 800780c <tcp_close_shutdown+0x194>
|
|
case SYN_SENT:
|
|
TCP_PCB_REMOVE_ACTIVE(pcb);
|
|
80077ec: 6879 ldr r1, [r7, #4]
|
|
80077ee: 480e ldr r0, [pc, #56] ; (8007828 <tcp_close_shutdown+0x1b0>)
|
|
80077f0: f001 fa7e bl 8008cf0 <tcp_pcb_remove>
|
|
80077f4: 4b0d ldr r3, [pc, #52] ; (800782c <tcp_close_shutdown+0x1b4>)
|
|
80077f6: 2201 movs r2, #1
|
|
80077f8: 701a strb r2, [r3, #0]
|
|
tcp_free(pcb);
|
|
80077fa: 6878 ldr r0, [r7, #4]
|
|
80077fc: f7ff fe8a bl 8007514 <tcp_free>
|
|
MIB2_STATS_INC(mib2.tcpattemptfails);
|
|
break;
|
|
8007800: e004 b.n 800780c <tcp_close_shutdown+0x194>
|
|
default:
|
|
return tcp_close_shutdown_fin(pcb);
|
|
8007802: 6878 ldr r0, [r7, #4]
|
|
8007804: f000 f81a bl 800783c <tcp_close_shutdown_fin>
|
|
8007808: 4603 mov r3, r0
|
|
800780a: e000 b.n 800780e <tcp_close_shutdown+0x196>
|
|
}
|
|
return ERR_OK;
|
|
800780c: 2300 movs r3, #0
|
|
}
|
|
800780e: 4618 mov r0, r3
|
|
8007810: 3710 adds r7, #16
|
|
8007812: 46bd mov sp, r7
|
|
8007814: bdb0 pop {r4, r5, r7, pc}
|
|
8007816: bf00 nop
|
|
8007818: 08012a08 .word 0x08012a08
|
|
800781c: 08012adc .word 0x08012adc
|
|
8007820: 08012a4c .word 0x08012a4c
|
|
8007824: 08012afc .word 0x08012afc
|
|
8007828: 24007b78 .word 0x24007b78
|
|
800782c: 24007b80 .word 0x24007b80
|
|
8007830: 24007bbc .word 0x24007bbc
|
|
8007834: 24007b70 .word 0x24007b70
|
|
8007838: 24007b74 .word 0x24007b74
|
|
|
|
0800783c <tcp_close_shutdown_fin>:
|
|
|
|
static err_t
|
|
tcp_close_shutdown_fin(struct tcp_pcb *pcb)
|
|
{
|
|
800783c: b580 push {r7, lr}
|
|
800783e: b084 sub sp, #16
|
|
8007840: af00 add r7, sp, #0
|
|
8007842: 6078 str r0, [r7, #4]
|
|
err_t err;
|
|
LWIP_ASSERT("pcb != NULL", pcb != NULL);
|
|
8007844: 687b ldr r3, [r7, #4]
|
|
8007846: 2b00 cmp r3, #0
|
|
8007848: d106 bne.n 8007858 <tcp_close_shutdown_fin+0x1c>
|
|
800784a: 4b2e ldr r3, [pc, #184] ; (8007904 <tcp_close_shutdown_fin+0xc8>)
|
|
800784c: f44f 72ce mov.w r2, #412 ; 0x19c
|
|
8007850: 492d ldr r1, [pc, #180] ; (8007908 <tcp_close_shutdown_fin+0xcc>)
|
|
8007852: 482e ldr r0, [pc, #184] ; (800790c <tcp_close_shutdown_fin+0xd0>)
|
|
8007854: f009 f9b8 bl 8010bc8 <iprintf>
|
|
|
|
switch (pcb->state) {
|
|
8007858: 687b ldr r3, [r7, #4]
|
|
800785a: 7d1b ldrb r3, [r3, #20]
|
|
800785c: 2b07 cmp r3, #7
|
|
800785e: d020 beq.n 80078a2 <tcp_close_shutdown_fin+0x66>
|
|
8007860: 2b07 cmp r3, #7
|
|
8007862: dc2b bgt.n 80078bc <tcp_close_shutdown_fin+0x80>
|
|
8007864: 2b03 cmp r3, #3
|
|
8007866: d002 beq.n 800786e <tcp_close_shutdown_fin+0x32>
|
|
8007868: 2b04 cmp r3, #4
|
|
800786a: d00d beq.n 8007888 <tcp_close_shutdown_fin+0x4c>
|
|
800786c: e026 b.n 80078bc <tcp_close_shutdown_fin+0x80>
|
|
case SYN_RCVD:
|
|
err = tcp_send_fin(pcb);
|
|
800786e: 6878 ldr r0, [r7, #4]
|
|
8007870: f004 fd82 bl 800c378 <tcp_send_fin>
|
|
8007874: 4603 mov r3, r0
|
|
8007876: 73fb strb r3, [r7, #15]
|
|
if (err == ERR_OK) {
|
|
8007878: f997 300f ldrsb.w r3, [r7, #15]
|
|
800787c: 2b00 cmp r3, #0
|
|
800787e: d11f bne.n 80078c0 <tcp_close_shutdown_fin+0x84>
|
|
tcp_backlog_accepted(pcb);
|
|
MIB2_STATS_INC(mib2.tcpattemptfails);
|
|
pcb->state = FIN_WAIT_1;
|
|
8007880: 687b ldr r3, [r7, #4]
|
|
8007882: 2205 movs r2, #5
|
|
8007884: 751a strb r2, [r3, #20]
|
|
}
|
|
break;
|
|
8007886: e01b b.n 80078c0 <tcp_close_shutdown_fin+0x84>
|
|
case ESTABLISHED:
|
|
err = tcp_send_fin(pcb);
|
|
8007888: 6878 ldr r0, [r7, #4]
|
|
800788a: f004 fd75 bl 800c378 <tcp_send_fin>
|
|
800788e: 4603 mov r3, r0
|
|
8007890: 73fb strb r3, [r7, #15]
|
|
if (err == ERR_OK) {
|
|
8007892: f997 300f ldrsb.w r3, [r7, #15]
|
|
8007896: 2b00 cmp r3, #0
|
|
8007898: d114 bne.n 80078c4 <tcp_close_shutdown_fin+0x88>
|
|
MIB2_STATS_INC(mib2.tcpestabresets);
|
|
pcb->state = FIN_WAIT_1;
|
|
800789a: 687b ldr r3, [r7, #4]
|
|
800789c: 2205 movs r2, #5
|
|
800789e: 751a strb r2, [r3, #20]
|
|
}
|
|
break;
|
|
80078a0: e010 b.n 80078c4 <tcp_close_shutdown_fin+0x88>
|
|
case CLOSE_WAIT:
|
|
err = tcp_send_fin(pcb);
|
|
80078a2: 6878 ldr r0, [r7, #4]
|
|
80078a4: f004 fd68 bl 800c378 <tcp_send_fin>
|
|
80078a8: 4603 mov r3, r0
|
|
80078aa: 73fb strb r3, [r7, #15]
|
|
if (err == ERR_OK) {
|
|
80078ac: f997 300f ldrsb.w r3, [r7, #15]
|
|
80078b0: 2b00 cmp r3, #0
|
|
80078b2: d109 bne.n 80078c8 <tcp_close_shutdown_fin+0x8c>
|
|
MIB2_STATS_INC(mib2.tcpestabresets);
|
|
pcb->state = LAST_ACK;
|
|
80078b4: 687b ldr r3, [r7, #4]
|
|
80078b6: 2209 movs r2, #9
|
|
80078b8: 751a strb r2, [r3, #20]
|
|
}
|
|
break;
|
|
80078ba: e005 b.n 80078c8 <tcp_close_shutdown_fin+0x8c>
|
|
default:
|
|
/* Has already been closed, do nothing. */
|
|
return ERR_OK;
|
|
80078bc: 2300 movs r3, #0
|
|
80078be: e01c b.n 80078fa <tcp_close_shutdown_fin+0xbe>
|
|
break;
|
|
80078c0: bf00 nop
|
|
80078c2: e002 b.n 80078ca <tcp_close_shutdown_fin+0x8e>
|
|
break;
|
|
80078c4: bf00 nop
|
|
80078c6: e000 b.n 80078ca <tcp_close_shutdown_fin+0x8e>
|
|
break;
|
|
80078c8: bf00 nop
|
|
}
|
|
|
|
if (err == ERR_OK) {
|
|
80078ca: f997 300f ldrsb.w r3, [r7, #15]
|
|
80078ce: 2b00 cmp r3, #0
|
|
80078d0: d103 bne.n 80078da <tcp_close_shutdown_fin+0x9e>
|
|
/* To ensure all data has been sent when tcp_close returns, we have
|
|
to make sure tcp_output doesn't fail.
|
|
Since we don't really have to ensure all data has been sent when tcp_close
|
|
returns (unsent data is sent from tcp timer functions, also), we don't care
|
|
for the return value of tcp_output for now. */
|
|
tcp_output(pcb);
|
|
80078d2: 6878 ldr r0, [r7, #4]
|
|
80078d4: f004 fe8e bl 800c5f4 <tcp_output>
|
|
80078d8: e00d b.n 80078f6 <tcp_close_shutdown_fin+0xba>
|
|
} else if (err == ERR_MEM) {
|
|
80078da: f997 300f ldrsb.w r3, [r7, #15]
|
|
80078de: f1b3 3fff cmp.w r3, #4294967295
|
|
80078e2: d108 bne.n 80078f6 <tcp_close_shutdown_fin+0xba>
|
|
/* Mark this pcb for closing. Closing is retried from tcp_tmr. */
|
|
tcp_set_flags(pcb, TF_CLOSEPEND);
|
|
80078e4: 687b ldr r3, [r7, #4]
|
|
80078e6: 8b5b ldrh r3, [r3, #26]
|
|
80078e8: f043 0308 orr.w r3, r3, #8
|
|
80078ec: b29a uxth r2, r3
|
|
80078ee: 687b ldr r3, [r7, #4]
|
|
80078f0: 835a strh r2, [r3, #26]
|
|
/* We have to return ERR_OK from here to indicate to the callers that this
|
|
pcb should not be used any more as it will be freed soon via tcp_tmr.
|
|
This is OK here since sending FIN does not guarantee a time frime for
|
|
actually freeing the pcb, either (it is left in closure states for
|
|
remote ACK or timeout) */
|
|
return ERR_OK;
|
|
80078f2: 2300 movs r3, #0
|
|
80078f4: e001 b.n 80078fa <tcp_close_shutdown_fin+0xbe>
|
|
}
|
|
return err;
|
|
80078f6: f997 300f ldrsb.w r3, [r7, #15]
|
|
}
|
|
80078fa: 4618 mov r0, r3
|
|
80078fc: 3710 adds r7, #16
|
|
80078fe: 46bd mov sp, r7
|
|
8007900: bd80 pop {r7, pc}
|
|
8007902: bf00 nop
|
|
8007904: 08012a08 .word 0x08012a08
|
|
8007908: 08012ab8 .word 0x08012ab8
|
|
800790c: 08012a4c .word 0x08012a4c
|
|
|
|
08007910 <tcp_close>:
|
|
* @return ERR_OK if connection has been closed
|
|
* another err_t if closing failed and pcb is not freed
|
|
*/
|
|
err_t
|
|
tcp_close(struct tcp_pcb *pcb)
|
|
{
|
|
8007910: b580 push {r7, lr}
|
|
8007912: b082 sub sp, #8
|
|
8007914: af00 add r7, sp, #0
|
|
8007916: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ERROR("tcp_close: invalid pcb", pcb != NULL, return ERR_ARG);
|
|
8007918: 687b ldr r3, [r7, #4]
|
|
800791a: 2b00 cmp r3, #0
|
|
800791c: d109 bne.n 8007932 <tcp_close+0x22>
|
|
800791e: 4b0f ldr r3, [pc, #60] ; (800795c <tcp_close+0x4c>)
|
|
8007920: f44f 72f4 mov.w r2, #488 ; 0x1e8
|
|
8007924: 490e ldr r1, [pc, #56] ; (8007960 <tcp_close+0x50>)
|
|
8007926: 480f ldr r0, [pc, #60] ; (8007964 <tcp_close+0x54>)
|
|
8007928: f009 f94e bl 8010bc8 <iprintf>
|
|
800792c: f06f 030f mvn.w r3, #15
|
|
8007930: e00f b.n 8007952 <tcp_close+0x42>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
|
|
|
|
tcp_debug_print_state(pcb->state);
|
|
|
|
if (pcb->state != LISTEN) {
|
|
8007932: 687b ldr r3, [r7, #4]
|
|
8007934: 7d1b ldrb r3, [r3, #20]
|
|
8007936: 2b01 cmp r3, #1
|
|
8007938: d006 beq.n 8007948 <tcp_close+0x38>
|
|
/* Set a flag not to receive any more data... */
|
|
tcp_set_flags(pcb, TF_RXCLOSED);
|
|
800793a: 687b ldr r3, [r7, #4]
|
|
800793c: 8b5b ldrh r3, [r3, #26]
|
|
800793e: f043 0310 orr.w r3, r3, #16
|
|
8007942: b29a uxth r2, r3
|
|
8007944: 687b ldr r3, [r7, #4]
|
|
8007946: 835a strh r2, [r3, #26]
|
|
}
|
|
/* ... and close */
|
|
return tcp_close_shutdown(pcb, 1);
|
|
8007948: 2101 movs r1, #1
|
|
800794a: 6878 ldr r0, [r7, #4]
|
|
800794c: f7ff fe94 bl 8007678 <tcp_close_shutdown>
|
|
8007950: 4603 mov r3, r0
|
|
}
|
|
8007952: 4618 mov r0, r3
|
|
8007954: 3708 adds r7, #8
|
|
8007956: 46bd mov sp, r7
|
|
8007958: bd80 pop {r7, pc}
|
|
800795a: bf00 nop
|
|
800795c: 08012a08 .word 0x08012a08
|
|
8007960: 08012b18 .word 0x08012b18
|
|
8007964: 08012a4c .word 0x08012a4c
|
|
|
|
08007968 <tcp_abandon>:
|
|
* @param pcb the tcp_pcb to abort
|
|
* @param reset boolean to indicate whether a reset should be sent
|
|
*/
|
|
void
|
|
tcp_abandon(struct tcp_pcb *pcb, int reset)
|
|
{
|
|
8007968: b580 push {r7, lr}
|
|
800796a: b08e sub sp, #56 ; 0x38
|
|
800796c: af04 add r7, sp, #16
|
|
800796e: 6078 str r0, [r7, #4]
|
|
8007970: 6039 str r1, [r7, #0]
|
|
#endif /* LWIP_CALLBACK_API */
|
|
void *errf_arg;
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ERROR("tcp_abandon: invalid pcb", pcb != NULL, return);
|
|
8007972: 687b ldr r3, [r7, #4]
|
|
8007974: 2b00 cmp r3, #0
|
|
8007976: d107 bne.n 8007988 <tcp_abandon+0x20>
|
|
8007978: 4b52 ldr r3, [pc, #328] ; (8007ac4 <tcp_abandon+0x15c>)
|
|
800797a: f240 223d movw r2, #573 ; 0x23d
|
|
800797e: 4952 ldr r1, [pc, #328] ; (8007ac8 <tcp_abandon+0x160>)
|
|
8007980: 4852 ldr r0, [pc, #328] ; (8007acc <tcp_abandon+0x164>)
|
|
8007982: f009 f921 bl 8010bc8 <iprintf>
|
|
8007986: e099 b.n 8007abc <tcp_abandon+0x154>
|
|
|
|
/* pcb->state LISTEN not allowed here */
|
|
LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
|
|
8007988: 687b ldr r3, [r7, #4]
|
|
800798a: 7d1b ldrb r3, [r3, #20]
|
|
800798c: 2b01 cmp r3, #1
|
|
800798e: d106 bne.n 800799e <tcp_abandon+0x36>
|
|
8007990: 4b4c ldr r3, [pc, #304] ; (8007ac4 <tcp_abandon+0x15c>)
|
|
8007992: f44f 7210 mov.w r2, #576 ; 0x240
|
|
8007996: 494e ldr r1, [pc, #312] ; (8007ad0 <tcp_abandon+0x168>)
|
|
8007998: 484c ldr r0, [pc, #304] ; (8007acc <tcp_abandon+0x164>)
|
|
800799a: f009 f915 bl 8010bc8 <iprintf>
|
|
pcb->state != LISTEN);
|
|
/* Figure out on which TCP PCB list we are, and remove us. If we
|
|
are in an active state, call the receive function associated with
|
|
the PCB with a NULL argument, and send an RST to the remote end. */
|
|
if (pcb->state == TIME_WAIT) {
|
|
800799e: 687b ldr r3, [r7, #4]
|
|
80079a0: 7d1b ldrb r3, [r3, #20]
|
|
80079a2: 2b0a cmp r3, #10
|
|
80079a4: d107 bne.n 80079b6 <tcp_abandon+0x4e>
|
|
tcp_pcb_remove(&tcp_tw_pcbs, pcb);
|
|
80079a6: 6879 ldr r1, [r7, #4]
|
|
80079a8: 484a ldr r0, [pc, #296] ; (8007ad4 <tcp_abandon+0x16c>)
|
|
80079aa: f001 f9a1 bl 8008cf0 <tcp_pcb_remove>
|
|
tcp_free(pcb);
|
|
80079ae: 6878 ldr r0, [r7, #4]
|
|
80079b0: f7ff fdb0 bl 8007514 <tcp_free>
|
|
80079b4: e082 b.n 8007abc <tcp_abandon+0x154>
|
|
} else {
|
|
int send_rst = 0;
|
|
80079b6: 2300 movs r3, #0
|
|
80079b8: 627b str r3, [r7, #36] ; 0x24
|
|
u16_t local_port = 0;
|
|
80079ba: 2300 movs r3, #0
|
|
80079bc: 847b strh r3, [r7, #34] ; 0x22
|
|
enum tcp_state last_state;
|
|
seqno = pcb->snd_nxt;
|
|
80079be: 687b ldr r3, [r7, #4]
|
|
80079c0: 6d1b ldr r3, [r3, #80] ; 0x50
|
|
80079c2: 61bb str r3, [r7, #24]
|
|
ackno = pcb->rcv_nxt;
|
|
80079c4: 687b ldr r3, [r7, #4]
|
|
80079c6: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
80079c8: 617b str r3, [r7, #20]
|
|
#if LWIP_CALLBACK_API
|
|
errf = pcb->errf;
|
|
80079ca: 687b ldr r3, [r7, #4]
|
|
80079cc: f8d3 3090 ldr.w r3, [r3, #144] ; 0x90
|
|
80079d0: 613b str r3, [r7, #16]
|
|
#endif /* LWIP_CALLBACK_API */
|
|
errf_arg = pcb->callback_arg;
|
|
80079d2: 687b ldr r3, [r7, #4]
|
|
80079d4: 691b ldr r3, [r3, #16]
|
|
80079d6: 60fb str r3, [r7, #12]
|
|
if (pcb->state == CLOSED) {
|
|
80079d8: 687b ldr r3, [r7, #4]
|
|
80079da: 7d1b ldrb r3, [r3, #20]
|
|
80079dc: 2b00 cmp r3, #0
|
|
80079de: d126 bne.n 8007a2e <tcp_abandon+0xc6>
|
|
if (pcb->local_port != 0) {
|
|
80079e0: 687b ldr r3, [r7, #4]
|
|
80079e2: 8adb ldrh r3, [r3, #22]
|
|
80079e4: 2b00 cmp r3, #0
|
|
80079e6: d02e beq.n 8007a46 <tcp_abandon+0xde>
|
|
/* bound, not yet opened */
|
|
TCP_RMV(&tcp_bound_pcbs, pcb);
|
|
80079e8: 4b3b ldr r3, [pc, #236] ; (8007ad8 <tcp_abandon+0x170>)
|
|
80079ea: 681b ldr r3, [r3, #0]
|
|
80079ec: 687a ldr r2, [r7, #4]
|
|
80079ee: 429a cmp r2, r3
|
|
80079f0: d105 bne.n 80079fe <tcp_abandon+0x96>
|
|
80079f2: 4b39 ldr r3, [pc, #228] ; (8007ad8 <tcp_abandon+0x170>)
|
|
80079f4: 681b ldr r3, [r3, #0]
|
|
80079f6: 68db ldr r3, [r3, #12]
|
|
80079f8: 4a37 ldr r2, [pc, #220] ; (8007ad8 <tcp_abandon+0x170>)
|
|
80079fa: 6013 str r3, [r2, #0]
|
|
80079fc: e013 b.n 8007a26 <tcp_abandon+0xbe>
|
|
80079fe: 4b36 ldr r3, [pc, #216] ; (8007ad8 <tcp_abandon+0x170>)
|
|
8007a00: 681b ldr r3, [r3, #0]
|
|
8007a02: 61fb str r3, [r7, #28]
|
|
8007a04: e00c b.n 8007a20 <tcp_abandon+0xb8>
|
|
8007a06: 69fb ldr r3, [r7, #28]
|
|
8007a08: 68db ldr r3, [r3, #12]
|
|
8007a0a: 687a ldr r2, [r7, #4]
|
|
8007a0c: 429a cmp r2, r3
|
|
8007a0e: d104 bne.n 8007a1a <tcp_abandon+0xb2>
|
|
8007a10: 687b ldr r3, [r7, #4]
|
|
8007a12: 68da ldr r2, [r3, #12]
|
|
8007a14: 69fb ldr r3, [r7, #28]
|
|
8007a16: 60da str r2, [r3, #12]
|
|
8007a18: e005 b.n 8007a26 <tcp_abandon+0xbe>
|
|
8007a1a: 69fb ldr r3, [r7, #28]
|
|
8007a1c: 68db ldr r3, [r3, #12]
|
|
8007a1e: 61fb str r3, [r7, #28]
|
|
8007a20: 69fb ldr r3, [r7, #28]
|
|
8007a22: 2b00 cmp r3, #0
|
|
8007a24: d1ef bne.n 8007a06 <tcp_abandon+0x9e>
|
|
8007a26: 687b ldr r3, [r7, #4]
|
|
8007a28: 2200 movs r2, #0
|
|
8007a2a: 60da str r2, [r3, #12]
|
|
8007a2c: e00b b.n 8007a46 <tcp_abandon+0xde>
|
|
}
|
|
} else {
|
|
send_rst = reset;
|
|
8007a2e: 683b ldr r3, [r7, #0]
|
|
8007a30: 627b str r3, [r7, #36] ; 0x24
|
|
local_port = pcb->local_port;
|
|
8007a32: 687b ldr r3, [r7, #4]
|
|
8007a34: 8adb ldrh r3, [r3, #22]
|
|
8007a36: 847b strh r3, [r7, #34] ; 0x22
|
|
TCP_PCB_REMOVE_ACTIVE(pcb);
|
|
8007a38: 6879 ldr r1, [r7, #4]
|
|
8007a3a: 4828 ldr r0, [pc, #160] ; (8007adc <tcp_abandon+0x174>)
|
|
8007a3c: f001 f958 bl 8008cf0 <tcp_pcb_remove>
|
|
8007a40: 4b27 ldr r3, [pc, #156] ; (8007ae0 <tcp_abandon+0x178>)
|
|
8007a42: 2201 movs r2, #1
|
|
8007a44: 701a strb r2, [r3, #0]
|
|
}
|
|
if (pcb->unacked != NULL) {
|
|
8007a46: 687b ldr r3, [r7, #4]
|
|
8007a48: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8007a4a: 2b00 cmp r3, #0
|
|
8007a4c: d004 beq.n 8007a58 <tcp_abandon+0xf0>
|
|
tcp_segs_free(pcb->unacked);
|
|
8007a4e: 687b ldr r3, [r7, #4]
|
|
8007a50: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8007a52: 4618 mov r0, r3
|
|
8007a54: f000 fe7a bl 800874c <tcp_segs_free>
|
|
}
|
|
if (pcb->unsent != NULL) {
|
|
8007a58: 687b ldr r3, [r7, #4]
|
|
8007a5a: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8007a5c: 2b00 cmp r3, #0
|
|
8007a5e: d004 beq.n 8007a6a <tcp_abandon+0x102>
|
|
tcp_segs_free(pcb->unsent);
|
|
8007a60: 687b ldr r3, [r7, #4]
|
|
8007a62: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8007a64: 4618 mov r0, r3
|
|
8007a66: f000 fe71 bl 800874c <tcp_segs_free>
|
|
}
|
|
#if TCP_QUEUE_OOSEQ
|
|
if (pcb->ooseq != NULL) {
|
|
8007a6a: 687b ldr r3, [r7, #4]
|
|
8007a6c: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
8007a6e: 2b00 cmp r3, #0
|
|
8007a70: d004 beq.n 8007a7c <tcp_abandon+0x114>
|
|
tcp_segs_free(pcb->ooseq);
|
|
8007a72: 687b ldr r3, [r7, #4]
|
|
8007a74: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
8007a76: 4618 mov r0, r3
|
|
8007a78: f000 fe68 bl 800874c <tcp_segs_free>
|
|
}
|
|
#endif /* TCP_QUEUE_OOSEQ */
|
|
tcp_backlog_accepted(pcb);
|
|
if (send_rst) {
|
|
8007a7c: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8007a7e: 2b00 cmp r3, #0
|
|
8007a80: d00e beq.n 8007aa0 <tcp_abandon+0x138>
|
|
LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n"));
|
|
tcp_rst(pcb, seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port);
|
|
8007a82: 6879 ldr r1, [r7, #4]
|
|
8007a84: 687b ldr r3, [r7, #4]
|
|
8007a86: 3304 adds r3, #4
|
|
8007a88: 687a ldr r2, [r7, #4]
|
|
8007a8a: 8b12 ldrh r2, [r2, #24]
|
|
8007a8c: 9202 str r2, [sp, #8]
|
|
8007a8e: 8c7a ldrh r2, [r7, #34] ; 0x22
|
|
8007a90: 9201 str r2, [sp, #4]
|
|
8007a92: 9300 str r3, [sp, #0]
|
|
8007a94: 460b mov r3, r1
|
|
8007a96: 697a ldr r2, [r7, #20]
|
|
8007a98: 69b9 ldr r1, [r7, #24]
|
|
8007a9a: 6878 ldr r0, [r7, #4]
|
|
8007a9c: f005 fb6a bl 800d174 <tcp_rst>
|
|
}
|
|
last_state = pcb->state;
|
|
8007aa0: 687b ldr r3, [r7, #4]
|
|
8007aa2: 7d1b ldrb r3, [r3, #20]
|
|
8007aa4: 72fb strb r3, [r7, #11]
|
|
tcp_free(pcb);
|
|
8007aa6: 6878 ldr r0, [r7, #4]
|
|
8007aa8: f7ff fd34 bl 8007514 <tcp_free>
|
|
TCP_EVENT_ERR(last_state, errf, errf_arg, ERR_ABRT);
|
|
8007aac: 693b ldr r3, [r7, #16]
|
|
8007aae: 2b00 cmp r3, #0
|
|
8007ab0: d004 beq.n 8007abc <tcp_abandon+0x154>
|
|
8007ab2: 693b ldr r3, [r7, #16]
|
|
8007ab4: f06f 010c mvn.w r1, #12
|
|
8007ab8: 68f8 ldr r0, [r7, #12]
|
|
8007aba: 4798 blx r3
|
|
}
|
|
}
|
|
8007abc: 3728 adds r7, #40 ; 0x28
|
|
8007abe: 46bd mov sp, r7
|
|
8007ac0: bd80 pop {r7, pc}
|
|
8007ac2: bf00 nop
|
|
8007ac4: 08012a08 .word 0x08012a08
|
|
8007ac8: 08012b4c .word 0x08012b4c
|
|
8007acc: 08012a4c .word 0x08012a4c
|
|
8007ad0: 08012b68 .word 0x08012b68
|
|
8007ad4: 24007b7c .word 0x24007b7c
|
|
8007ad8: 24007b70 .word 0x24007b70
|
|
8007adc: 24007b78 .word 0x24007b78
|
|
8007ae0: 24007b80 .word 0x24007b80
|
|
|
|
08007ae4 <tcp_abort>:
|
|
*
|
|
* @param pcb the tcp pcb to abort
|
|
*/
|
|
void
|
|
tcp_abort(struct tcp_pcb *pcb)
|
|
{
|
|
8007ae4: b580 push {r7, lr}
|
|
8007ae6: b082 sub sp, #8
|
|
8007ae8: af00 add r7, sp, #0
|
|
8007aea: 6078 str r0, [r7, #4]
|
|
tcp_abandon(pcb, 1);
|
|
8007aec: 2101 movs r1, #1
|
|
8007aee: 6878 ldr r0, [r7, #4]
|
|
8007af0: f7ff ff3a bl 8007968 <tcp_abandon>
|
|
}
|
|
8007af4: bf00 nop
|
|
8007af6: 3708 adds r7, #8
|
|
8007af8: 46bd mov sp, r7
|
|
8007afa: bd80 pop {r7, pc}
|
|
|
|
08007afc <tcp_update_rcv_ann_wnd>:
|
|
* Returns how much extra window would be advertised if we sent an
|
|
* update now.
|
|
*/
|
|
u32_t
|
|
tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
|
|
{
|
|
8007afc: b580 push {r7, lr}
|
|
8007afe: b084 sub sp, #16
|
|
8007b00: af00 add r7, sp, #0
|
|
8007b02: 6078 str r0, [r7, #4]
|
|
u32_t new_right_edge;
|
|
|
|
LWIP_ASSERT("tcp_update_rcv_ann_wnd: invalid pcb", pcb != NULL);
|
|
8007b04: 687b ldr r3, [r7, #4]
|
|
8007b06: 2b00 cmp r3, #0
|
|
8007b08: d106 bne.n 8007b18 <tcp_update_rcv_ann_wnd+0x1c>
|
|
8007b0a: 4b25 ldr r3, [pc, #148] ; (8007ba0 <tcp_update_rcv_ann_wnd+0xa4>)
|
|
8007b0c: f240 32a6 movw r2, #934 ; 0x3a6
|
|
8007b10: 4924 ldr r1, [pc, #144] ; (8007ba4 <tcp_update_rcv_ann_wnd+0xa8>)
|
|
8007b12: 4825 ldr r0, [pc, #148] ; (8007ba8 <tcp_update_rcv_ann_wnd+0xac>)
|
|
8007b14: f009 f858 bl 8010bc8 <iprintf>
|
|
new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
|
|
8007b18: 687b ldr r3, [r7, #4]
|
|
8007b1a: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
8007b1c: 687a ldr r2, [r7, #4]
|
|
8007b1e: 8d12 ldrh r2, [r2, #40] ; 0x28
|
|
8007b20: 4413 add r3, r2
|
|
8007b22: 60fb str r3, [r7, #12]
|
|
|
|
if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
|
|
8007b24: 687b ldr r3, [r7, #4]
|
|
8007b26: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8007b28: 687a ldr r2, [r7, #4]
|
|
8007b2a: 8e52 ldrh r2, [r2, #50] ; 0x32
|
|
8007b2c: f5b2 6f86 cmp.w r2, #1072 ; 0x430
|
|
8007b30: bf28 it cs
|
|
8007b32: f44f 6286 movcs.w r2, #1072 ; 0x430
|
|
8007b36: b292 uxth r2, r2
|
|
8007b38: 4413 add r3, r2
|
|
8007b3a: 68fa ldr r2, [r7, #12]
|
|
8007b3c: 1ad3 subs r3, r2, r3
|
|
8007b3e: 2b00 cmp r3, #0
|
|
8007b40: db08 blt.n 8007b54 <tcp_update_rcv_ann_wnd+0x58>
|
|
/* we can advertise more window */
|
|
pcb->rcv_ann_wnd = pcb->rcv_wnd;
|
|
8007b42: 687b ldr r3, [r7, #4]
|
|
8007b44: 8d1a ldrh r2, [r3, #40] ; 0x28
|
|
8007b46: 687b ldr r3, [r7, #4]
|
|
8007b48: 855a strh r2, [r3, #42] ; 0x2a
|
|
return new_right_edge - pcb->rcv_ann_right_edge;
|
|
8007b4a: 687b ldr r3, [r7, #4]
|
|
8007b4c: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8007b4e: 68fa ldr r2, [r7, #12]
|
|
8007b50: 1ad3 subs r3, r2, r3
|
|
8007b52: e020 b.n 8007b96 <tcp_update_rcv_ann_wnd+0x9a>
|
|
} else {
|
|
if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
|
|
8007b54: 687b ldr r3, [r7, #4]
|
|
8007b56: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
8007b58: 687b ldr r3, [r7, #4]
|
|
8007b5a: 6adb ldr r3, [r3, #44] ; 0x2c
|
|
8007b5c: 1ad3 subs r3, r2, r3
|
|
8007b5e: 2b00 cmp r3, #0
|
|
8007b60: dd03 ble.n 8007b6a <tcp_update_rcv_ann_wnd+0x6e>
|
|
/* Can happen due to other end sending out of advertised window,
|
|
* but within actual available (but not yet advertised) window */
|
|
pcb->rcv_ann_wnd = 0;
|
|
8007b62: 687b ldr r3, [r7, #4]
|
|
8007b64: 2200 movs r2, #0
|
|
8007b66: 855a strh r2, [r3, #42] ; 0x2a
|
|
8007b68: e014 b.n 8007b94 <tcp_update_rcv_ann_wnd+0x98>
|
|
} else {
|
|
/* keep the right edge of window constant */
|
|
u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
|
|
8007b6a: 687b ldr r3, [r7, #4]
|
|
8007b6c: 6ada ldr r2, [r3, #44] ; 0x2c
|
|
8007b6e: 687b ldr r3, [r7, #4]
|
|
8007b70: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
8007b72: 1ad3 subs r3, r2, r3
|
|
8007b74: 60bb str r3, [r7, #8]
|
|
#if !LWIP_WND_SCALE
|
|
LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
|
|
8007b76: 68bb ldr r3, [r7, #8]
|
|
8007b78: f5b3 3f80 cmp.w r3, #65536 ; 0x10000
|
|
8007b7c: d306 bcc.n 8007b8c <tcp_update_rcv_ann_wnd+0x90>
|
|
8007b7e: 4b08 ldr r3, [pc, #32] ; (8007ba0 <tcp_update_rcv_ann_wnd+0xa4>)
|
|
8007b80: f240 32b6 movw r2, #950 ; 0x3b6
|
|
8007b84: 4909 ldr r1, [pc, #36] ; (8007bac <tcp_update_rcv_ann_wnd+0xb0>)
|
|
8007b86: 4808 ldr r0, [pc, #32] ; (8007ba8 <tcp_update_rcv_ann_wnd+0xac>)
|
|
8007b88: f009 f81e bl 8010bc8 <iprintf>
|
|
#endif
|
|
pcb->rcv_ann_wnd = (tcpwnd_size_t)new_rcv_ann_wnd;
|
|
8007b8c: 68bb ldr r3, [r7, #8]
|
|
8007b8e: b29a uxth r2, r3
|
|
8007b90: 687b ldr r3, [r7, #4]
|
|
8007b92: 855a strh r2, [r3, #42] ; 0x2a
|
|
}
|
|
return 0;
|
|
8007b94: 2300 movs r3, #0
|
|
}
|
|
}
|
|
8007b96: 4618 mov r0, r3
|
|
8007b98: 3710 adds r7, #16
|
|
8007b9a: 46bd mov sp, r7
|
|
8007b9c: bd80 pop {r7, pc}
|
|
8007b9e: bf00 nop
|
|
8007ba0: 08012a08 .word 0x08012a08
|
|
8007ba4: 08012c64 .word 0x08012c64
|
|
8007ba8: 08012a4c .word 0x08012a4c
|
|
8007bac: 08012c88 .word 0x08012c88
|
|
|
|
08007bb0 <tcp_recved>:
|
|
* @param pcb the tcp_pcb for which data is read
|
|
* @param len the amount of bytes that have been read by the application
|
|
*/
|
|
void
|
|
tcp_recved(struct tcp_pcb *pcb, u16_t len)
|
|
{
|
|
8007bb0: b580 push {r7, lr}
|
|
8007bb2: b084 sub sp, #16
|
|
8007bb4: af00 add r7, sp, #0
|
|
8007bb6: 6078 str r0, [r7, #4]
|
|
8007bb8: 460b mov r3, r1
|
|
8007bba: 807b strh r3, [r7, #2]
|
|
u32_t wnd_inflation;
|
|
tcpwnd_size_t rcv_wnd;
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ERROR("tcp_recved: invalid pcb", pcb != NULL, return);
|
|
8007bbc: 687b ldr r3, [r7, #4]
|
|
8007bbe: 2b00 cmp r3, #0
|
|
8007bc0: d107 bne.n 8007bd2 <tcp_recved+0x22>
|
|
8007bc2: 4b1f ldr r3, [pc, #124] ; (8007c40 <tcp_recved+0x90>)
|
|
8007bc4: f240 32cf movw r2, #975 ; 0x3cf
|
|
8007bc8: 491e ldr r1, [pc, #120] ; (8007c44 <tcp_recved+0x94>)
|
|
8007bca: 481f ldr r0, [pc, #124] ; (8007c48 <tcp_recved+0x98>)
|
|
8007bcc: f008 fffc bl 8010bc8 <iprintf>
|
|
8007bd0: e032 b.n 8007c38 <tcp_recved+0x88>
|
|
|
|
/* pcb->state LISTEN not allowed here */
|
|
LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
|
|
8007bd2: 687b ldr r3, [r7, #4]
|
|
8007bd4: 7d1b ldrb r3, [r3, #20]
|
|
8007bd6: 2b01 cmp r3, #1
|
|
8007bd8: d106 bne.n 8007be8 <tcp_recved+0x38>
|
|
8007bda: 4b19 ldr r3, [pc, #100] ; (8007c40 <tcp_recved+0x90>)
|
|
8007bdc: f240 32d2 movw r2, #978 ; 0x3d2
|
|
8007be0: 491a ldr r1, [pc, #104] ; (8007c4c <tcp_recved+0x9c>)
|
|
8007be2: 4819 ldr r0, [pc, #100] ; (8007c48 <tcp_recved+0x98>)
|
|
8007be4: f008 fff0 bl 8010bc8 <iprintf>
|
|
pcb->state != LISTEN);
|
|
|
|
rcv_wnd = (tcpwnd_size_t)(pcb->rcv_wnd + len);
|
|
8007be8: 687b ldr r3, [r7, #4]
|
|
8007bea: 8d1a ldrh r2, [r3, #40] ; 0x28
|
|
8007bec: 887b ldrh r3, [r7, #2]
|
|
8007bee: 4413 add r3, r2
|
|
8007bf0: 81fb strh r3, [r7, #14]
|
|
if ((rcv_wnd > TCP_WND_MAX(pcb)) || (rcv_wnd < pcb->rcv_wnd)) {
|
|
8007bf2: 89fb ldrh r3, [r7, #14]
|
|
8007bf4: f5b3 6f06 cmp.w r3, #2144 ; 0x860
|
|
8007bf8: d804 bhi.n 8007c04 <tcp_recved+0x54>
|
|
8007bfa: 687b ldr r3, [r7, #4]
|
|
8007bfc: 8d1b ldrh r3, [r3, #40] ; 0x28
|
|
8007bfe: 89fa ldrh r2, [r7, #14]
|
|
8007c00: 429a cmp r2, r3
|
|
8007c02: d204 bcs.n 8007c0e <tcp_recved+0x5e>
|
|
/* window got too big or tcpwnd_size_t overflow */
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: window got too big or tcpwnd_size_t overflow\n"));
|
|
pcb->rcv_wnd = TCP_WND_MAX(pcb);
|
|
8007c04: 687b ldr r3, [r7, #4]
|
|
8007c06: f44f 6206 mov.w r2, #2144 ; 0x860
|
|
8007c0a: 851a strh r2, [r3, #40] ; 0x28
|
|
8007c0c: e002 b.n 8007c14 <tcp_recved+0x64>
|
|
} else {
|
|
pcb->rcv_wnd = rcv_wnd;
|
|
8007c0e: 687b ldr r3, [r7, #4]
|
|
8007c10: 89fa ldrh r2, [r7, #14]
|
|
8007c12: 851a strh r2, [r3, #40] ; 0x28
|
|
}
|
|
|
|
wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
|
|
8007c14: 6878 ldr r0, [r7, #4]
|
|
8007c16: f7ff ff71 bl 8007afc <tcp_update_rcv_ann_wnd>
|
|
8007c1a: 60b8 str r0, [r7, #8]
|
|
|
|
/* If the change in the right edge of window is significant (default
|
|
* watermark is TCP_WND/4), then send an explicit update now.
|
|
* Otherwise wait for a packet to be sent in the normal course of
|
|
* events (or more window to be available later) */
|
|
if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
|
|
8007c1c: 68bb ldr r3, [r7, #8]
|
|
8007c1e: f5b3 7f06 cmp.w r3, #536 ; 0x218
|
|
8007c22: d309 bcc.n 8007c38 <tcp_recved+0x88>
|
|
tcp_ack_now(pcb);
|
|
8007c24: 687b ldr r3, [r7, #4]
|
|
8007c26: 8b5b ldrh r3, [r3, #26]
|
|
8007c28: f043 0302 orr.w r3, r3, #2
|
|
8007c2c: b29a uxth r2, r3
|
|
8007c2e: 687b ldr r3, [r7, #4]
|
|
8007c30: 835a strh r2, [r3, #26]
|
|
tcp_output(pcb);
|
|
8007c32: 6878 ldr r0, [r7, #4]
|
|
8007c34: f004 fcde bl 800c5f4 <tcp_output>
|
|
}
|
|
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: received %"U16_F" bytes, wnd %"TCPWNDSIZE_F" (%"TCPWNDSIZE_F").\n",
|
|
len, pcb->rcv_wnd, (u16_t)(TCP_WND_MAX(pcb) - pcb->rcv_wnd)));
|
|
}
|
|
8007c38: 3710 adds r7, #16
|
|
8007c3a: 46bd mov sp, r7
|
|
8007c3c: bd80 pop {r7, pc}
|
|
8007c3e: bf00 nop
|
|
8007c40: 08012a08 .word 0x08012a08
|
|
8007c44: 08012ca4 .word 0x08012ca4
|
|
8007c48: 08012a4c .word 0x08012a4c
|
|
8007c4c: 08012cbc .word 0x08012cbc
|
|
|
|
08007c50 <tcp_new_port>:
|
|
*
|
|
* @return a new (free) local TCP port number
|
|
*/
|
|
static u16_t
|
|
tcp_new_port(void)
|
|
{
|
|
8007c50: b480 push {r7}
|
|
8007c52: b083 sub sp, #12
|
|
8007c54: af00 add r7, sp, #0
|
|
u8_t i;
|
|
u16_t n = 0;
|
|
8007c56: 2300 movs r3, #0
|
|
8007c58: 80bb strh r3, [r7, #4]
|
|
struct tcp_pcb *pcb;
|
|
|
|
again:
|
|
tcp_port++;
|
|
8007c5a: 4b1e ldr r3, [pc, #120] ; (8007cd4 <tcp_new_port+0x84>)
|
|
8007c5c: 881b ldrh r3, [r3, #0]
|
|
8007c5e: 3301 adds r3, #1
|
|
8007c60: b29a uxth r2, r3
|
|
8007c62: 4b1c ldr r3, [pc, #112] ; (8007cd4 <tcp_new_port+0x84>)
|
|
8007c64: 801a strh r2, [r3, #0]
|
|
if (tcp_port == TCP_LOCAL_PORT_RANGE_END) {
|
|
8007c66: 4b1b ldr r3, [pc, #108] ; (8007cd4 <tcp_new_port+0x84>)
|
|
8007c68: 881b ldrh r3, [r3, #0]
|
|
8007c6a: f64f 72ff movw r2, #65535 ; 0xffff
|
|
8007c6e: 4293 cmp r3, r2
|
|
8007c70: d103 bne.n 8007c7a <tcp_new_port+0x2a>
|
|
tcp_port = TCP_LOCAL_PORT_RANGE_START;
|
|
8007c72: 4b18 ldr r3, [pc, #96] ; (8007cd4 <tcp_new_port+0x84>)
|
|
8007c74: f44f 4240 mov.w r2, #49152 ; 0xc000
|
|
8007c78: 801a strh r2, [r3, #0]
|
|
}
|
|
/* Check all PCB lists. */
|
|
for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
|
|
8007c7a: 2300 movs r3, #0
|
|
8007c7c: 71fb strb r3, [r7, #7]
|
|
8007c7e: e01e b.n 8007cbe <tcp_new_port+0x6e>
|
|
for (pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
|
|
8007c80: 79fb ldrb r3, [r7, #7]
|
|
8007c82: 4a15 ldr r2, [pc, #84] ; (8007cd8 <tcp_new_port+0x88>)
|
|
8007c84: f852 3023 ldr.w r3, [r2, r3, lsl #2]
|
|
8007c88: 681b ldr r3, [r3, #0]
|
|
8007c8a: 603b str r3, [r7, #0]
|
|
8007c8c: e011 b.n 8007cb2 <tcp_new_port+0x62>
|
|
if (pcb->local_port == tcp_port) {
|
|
8007c8e: 683b ldr r3, [r7, #0]
|
|
8007c90: 8ada ldrh r2, [r3, #22]
|
|
8007c92: 4b10 ldr r3, [pc, #64] ; (8007cd4 <tcp_new_port+0x84>)
|
|
8007c94: 881b ldrh r3, [r3, #0]
|
|
8007c96: 429a cmp r2, r3
|
|
8007c98: d108 bne.n 8007cac <tcp_new_port+0x5c>
|
|
n++;
|
|
8007c9a: 88bb ldrh r3, [r7, #4]
|
|
8007c9c: 3301 adds r3, #1
|
|
8007c9e: 80bb strh r3, [r7, #4]
|
|
if (n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
|
|
8007ca0: 88bb ldrh r3, [r7, #4]
|
|
8007ca2: f5b3 4f80 cmp.w r3, #16384 ; 0x4000
|
|
8007ca6: d3d8 bcc.n 8007c5a <tcp_new_port+0xa>
|
|
return 0;
|
|
8007ca8: 2300 movs r3, #0
|
|
8007caa: e00d b.n 8007cc8 <tcp_new_port+0x78>
|
|
for (pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
|
|
8007cac: 683b ldr r3, [r7, #0]
|
|
8007cae: 68db ldr r3, [r3, #12]
|
|
8007cb0: 603b str r3, [r7, #0]
|
|
8007cb2: 683b ldr r3, [r7, #0]
|
|
8007cb4: 2b00 cmp r3, #0
|
|
8007cb6: d1ea bne.n 8007c8e <tcp_new_port+0x3e>
|
|
for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
|
|
8007cb8: 79fb ldrb r3, [r7, #7]
|
|
8007cba: 3301 adds r3, #1
|
|
8007cbc: 71fb strb r3, [r7, #7]
|
|
8007cbe: 79fb ldrb r3, [r7, #7]
|
|
8007cc0: 2b03 cmp r3, #3
|
|
8007cc2: d9dd bls.n 8007c80 <tcp_new_port+0x30>
|
|
}
|
|
goto again;
|
|
}
|
|
}
|
|
}
|
|
return tcp_port;
|
|
8007cc4: 4b03 ldr r3, [pc, #12] ; (8007cd4 <tcp_new_port+0x84>)
|
|
8007cc6: 881b ldrh r3, [r3, #0]
|
|
}
|
|
8007cc8: 4618 mov r0, r3
|
|
8007cca: 370c adds r7, #12
|
|
8007ccc: 46bd mov sp, r7
|
|
8007cce: f85d 7b04 ldr.w r7, [sp], #4
|
|
8007cd2: 4770 bx lr
|
|
8007cd4: 24000068 .word 0x24000068
|
|
8007cd8: 08014d6c .word 0x08014d6c
|
|
|
|
08007cdc <tcp_connect>:
|
|
* other err_t values if connect request couldn't be sent
|
|
*/
|
|
err_t
|
|
tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port,
|
|
tcp_connected_fn connected)
|
|
{
|
|
8007cdc: b580 push {r7, lr}
|
|
8007cde: b08a sub sp, #40 ; 0x28
|
|
8007ce0: af00 add r7, sp, #0
|
|
8007ce2: 60f8 str r0, [r7, #12]
|
|
8007ce4: 60b9 str r1, [r7, #8]
|
|
8007ce6: 603b str r3, [r7, #0]
|
|
8007ce8: 4613 mov r3, r2
|
|
8007cea: 80fb strh r3, [r7, #6]
|
|
struct netif *netif = NULL;
|
|
8007cec: 2300 movs r3, #0
|
|
8007cee: 627b str r3, [r7, #36] ; 0x24
|
|
u32_t iss;
|
|
u16_t old_local_port;
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ERROR("tcp_connect: invalid pcb", pcb != NULL, return ERR_ARG);
|
|
8007cf0: 68fb ldr r3, [r7, #12]
|
|
8007cf2: 2b00 cmp r3, #0
|
|
8007cf4: d109 bne.n 8007d0a <tcp_connect+0x2e>
|
|
8007cf6: 4b7d ldr r3, [pc, #500] ; (8007eec <tcp_connect+0x210>)
|
|
8007cf8: f240 4235 movw r2, #1077 ; 0x435
|
|
8007cfc: 497c ldr r1, [pc, #496] ; (8007ef0 <tcp_connect+0x214>)
|
|
8007cfe: 487d ldr r0, [pc, #500] ; (8007ef4 <tcp_connect+0x218>)
|
|
8007d00: f008 ff62 bl 8010bc8 <iprintf>
|
|
8007d04: f06f 030f mvn.w r3, #15
|
|
8007d08: e0ec b.n 8007ee4 <tcp_connect+0x208>
|
|
LWIP_ERROR("tcp_connect: invalid ipaddr", ipaddr != NULL, return ERR_ARG);
|
|
8007d0a: 68bb ldr r3, [r7, #8]
|
|
8007d0c: 2b00 cmp r3, #0
|
|
8007d0e: d109 bne.n 8007d24 <tcp_connect+0x48>
|
|
8007d10: 4b76 ldr r3, [pc, #472] ; (8007eec <tcp_connect+0x210>)
|
|
8007d12: f240 4236 movw r2, #1078 ; 0x436
|
|
8007d16: 4978 ldr r1, [pc, #480] ; (8007ef8 <tcp_connect+0x21c>)
|
|
8007d18: 4876 ldr r0, [pc, #472] ; (8007ef4 <tcp_connect+0x218>)
|
|
8007d1a: f008 ff55 bl 8010bc8 <iprintf>
|
|
8007d1e: f06f 030f mvn.w r3, #15
|
|
8007d22: e0df b.n 8007ee4 <tcp_connect+0x208>
|
|
|
|
LWIP_ERROR("tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN);
|
|
8007d24: 68fb ldr r3, [r7, #12]
|
|
8007d26: 7d1b ldrb r3, [r3, #20]
|
|
8007d28: 2b00 cmp r3, #0
|
|
8007d2a: d009 beq.n 8007d40 <tcp_connect+0x64>
|
|
8007d2c: 4b6f ldr r3, [pc, #444] ; (8007eec <tcp_connect+0x210>)
|
|
8007d2e: f44f 6287 mov.w r2, #1080 ; 0x438
|
|
8007d32: 4972 ldr r1, [pc, #456] ; (8007efc <tcp_connect+0x220>)
|
|
8007d34: 486f ldr r0, [pc, #444] ; (8007ef4 <tcp_connect+0x218>)
|
|
8007d36: f008 ff47 bl 8010bc8 <iprintf>
|
|
8007d3a: f06f 0309 mvn.w r3, #9
|
|
8007d3e: e0d1 b.n 8007ee4 <tcp_connect+0x208>
|
|
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port));
|
|
ip_addr_set(&pcb->remote_ip, ipaddr);
|
|
8007d40: 68bb ldr r3, [r7, #8]
|
|
8007d42: 2b00 cmp r3, #0
|
|
8007d44: d002 beq.n 8007d4c <tcp_connect+0x70>
|
|
8007d46: 68bb ldr r3, [r7, #8]
|
|
8007d48: 681b ldr r3, [r3, #0]
|
|
8007d4a: e000 b.n 8007d4e <tcp_connect+0x72>
|
|
8007d4c: 2300 movs r3, #0
|
|
8007d4e: 68fa ldr r2, [r7, #12]
|
|
8007d50: 6053 str r3, [r2, #4]
|
|
pcb->remote_port = port;
|
|
8007d52: 68fb ldr r3, [r7, #12]
|
|
8007d54: 88fa ldrh r2, [r7, #6]
|
|
8007d56: 831a strh r2, [r3, #24]
|
|
|
|
if (pcb->netif_idx != NETIF_NO_INDEX) {
|
|
8007d58: 68fb ldr r3, [r7, #12]
|
|
8007d5a: 7a1b ldrb r3, [r3, #8]
|
|
8007d5c: 2b00 cmp r3, #0
|
|
8007d5e: d006 beq.n 8007d6e <tcp_connect+0x92>
|
|
netif = netif_get_by_index(pcb->netif_idx);
|
|
8007d60: 68fb ldr r3, [r7, #12]
|
|
8007d62: 7a1b ldrb r3, [r3, #8]
|
|
8007d64: 4618 mov r0, r3
|
|
8007d66: f7fe fdd5 bl 8006914 <netif_get_by_index>
|
|
8007d6a: 6278 str r0, [r7, #36] ; 0x24
|
|
8007d6c: e005 b.n 8007d7a <tcp_connect+0x9e>
|
|
} else {
|
|
/* check if we have a route to the remote host */
|
|
netif = ip_route(&pcb->local_ip, &pcb->remote_ip);
|
|
8007d6e: 68fb ldr r3, [r7, #12]
|
|
8007d70: 3304 adds r3, #4
|
|
8007d72: 4618 mov r0, r3
|
|
8007d74: f007 f888 bl 800ee88 <ip4_route>
|
|
8007d78: 6278 str r0, [r7, #36] ; 0x24
|
|
}
|
|
if (netif == NULL) {
|
|
8007d7a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8007d7c: 2b00 cmp r3, #0
|
|
8007d7e: d102 bne.n 8007d86 <tcp_connect+0xaa>
|
|
/* Don't even try to send a SYN packet if we have no route since that will fail. */
|
|
return ERR_RTE;
|
|
8007d80: f06f 0303 mvn.w r3, #3
|
|
8007d84: e0ae b.n 8007ee4 <tcp_connect+0x208>
|
|
}
|
|
|
|
/* check if local IP has been assigned to pcb, if not, get one */
|
|
if (ip_addr_isany(&pcb->local_ip)) {
|
|
8007d86: 68fb ldr r3, [r7, #12]
|
|
8007d88: 2b00 cmp r3, #0
|
|
8007d8a: d003 beq.n 8007d94 <tcp_connect+0xb8>
|
|
8007d8c: 68fb ldr r3, [r7, #12]
|
|
8007d8e: 681b ldr r3, [r3, #0]
|
|
8007d90: 2b00 cmp r3, #0
|
|
8007d92: d111 bne.n 8007db8 <tcp_connect+0xdc>
|
|
const ip_addr_t *local_ip = ip_netif_get_local_ip(netif, ipaddr);
|
|
8007d94: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8007d96: 2b00 cmp r3, #0
|
|
8007d98: d002 beq.n 8007da0 <tcp_connect+0xc4>
|
|
8007d9a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
8007d9c: 3304 adds r3, #4
|
|
8007d9e: e000 b.n 8007da2 <tcp_connect+0xc6>
|
|
8007da0: 2300 movs r3, #0
|
|
8007da2: 61fb str r3, [r7, #28]
|
|
if (local_ip == NULL) {
|
|
8007da4: 69fb ldr r3, [r7, #28]
|
|
8007da6: 2b00 cmp r3, #0
|
|
8007da8: d102 bne.n 8007db0 <tcp_connect+0xd4>
|
|
return ERR_RTE;
|
|
8007daa: f06f 0303 mvn.w r3, #3
|
|
8007dae: e099 b.n 8007ee4 <tcp_connect+0x208>
|
|
}
|
|
ip_addr_copy(pcb->local_ip, *local_ip);
|
|
8007db0: 69fb ldr r3, [r7, #28]
|
|
8007db2: 681a ldr r2, [r3, #0]
|
|
8007db4: 68fb ldr r3, [r7, #12]
|
|
8007db6: 601a str r2, [r3, #0]
|
|
ip6_addr_lacks_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNICAST)) {
|
|
ip6_addr_assign_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNICAST, netif);
|
|
}
|
|
#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
|
|
|
|
old_local_port = pcb->local_port;
|
|
8007db8: 68fb ldr r3, [r7, #12]
|
|
8007dba: 8adb ldrh r3, [r3, #22]
|
|
8007dbc: 837b strh r3, [r7, #26]
|
|
if (pcb->local_port == 0) {
|
|
8007dbe: 68fb ldr r3, [r7, #12]
|
|
8007dc0: 8adb ldrh r3, [r3, #22]
|
|
8007dc2: 2b00 cmp r3, #0
|
|
8007dc4: d10c bne.n 8007de0 <tcp_connect+0x104>
|
|
pcb->local_port = tcp_new_port();
|
|
8007dc6: f7ff ff43 bl 8007c50 <tcp_new_port>
|
|
8007dca: 4603 mov r3, r0
|
|
8007dcc: 461a mov r2, r3
|
|
8007dce: 68fb ldr r3, [r7, #12]
|
|
8007dd0: 82da strh r2, [r3, #22]
|
|
if (pcb->local_port == 0) {
|
|
8007dd2: 68fb ldr r3, [r7, #12]
|
|
8007dd4: 8adb ldrh r3, [r3, #22]
|
|
8007dd6: 2b00 cmp r3, #0
|
|
8007dd8: d102 bne.n 8007de0 <tcp_connect+0x104>
|
|
return ERR_BUF;
|
|
8007dda: f06f 0301 mvn.w r3, #1
|
|
8007dde: e081 b.n 8007ee4 <tcp_connect+0x208>
|
|
}
|
|
}
|
|
#endif /* SO_REUSE */
|
|
}
|
|
|
|
iss = tcp_next_iss(pcb);
|
|
8007de0: 68f8 ldr r0, [r7, #12]
|
|
8007de2: f001 f819 bl 8008e18 <tcp_next_iss>
|
|
8007de6: 6178 str r0, [r7, #20]
|
|
pcb->rcv_nxt = 0;
|
|
8007de8: 68fb ldr r3, [r7, #12]
|
|
8007dea: 2200 movs r2, #0
|
|
8007dec: 625a str r2, [r3, #36] ; 0x24
|
|
pcb->snd_nxt = iss;
|
|
8007dee: 68fb ldr r3, [r7, #12]
|
|
8007df0: 697a ldr r2, [r7, #20]
|
|
8007df2: 651a str r2, [r3, #80] ; 0x50
|
|
pcb->lastack = iss - 1;
|
|
8007df4: 697b ldr r3, [r7, #20]
|
|
8007df6: 1e5a subs r2, r3, #1
|
|
8007df8: 68fb ldr r3, [r7, #12]
|
|
8007dfa: 645a str r2, [r3, #68] ; 0x44
|
|
pcb->snd_wl2 = iss - 1;
|
|
8007dfc: 697b ldr r3, [r7, #20]
|
|
8007dfe: 1e5a subs r2, r3, #1
|
|
8007e00: 68fb ldr r3, [r7, #12]
|
|
8007e02: 659a str r2, [r3, #88] ; 0x58
|
|
pcb->snd_lbb = iss - 1;
|
|
8007e04: 697b ldr r3, [r7, #20]
|
|
8007e06: 1e5a subs r2, r3, #1
|
|
8007e08: 68fb ldr r3, [r7, #12]
|
|
8007e0a: 65da str r2, [r3, #92] ; 0x5c
|
|
/* Start with a window that does not need scaling. When window scaling is
|
|
enabled and used, the window is enlarged when both sides agree on scaling. */
|
|
pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND);
|
|
8007e0c: 68fb ldr r3, [r7, #12]
|
|
8007e0e: f44f 6206 mov.w r2, #2144 ; 0x860
|
|
8007e12: 855a strh r2, [r3, #42] ; 0x2a
|
|
8007e14: 68fb ldr r3, [r7, #12]
|
|
8007e16: 8d5a ldrh r2, [r3, #42] ; 0x2a
|
|
8007e18: 68fb ldr r3, [r7, #12]
|
|
8007e1a: 851a strh r2, [r3, #40] ; 0x28
|
|
pcb->rcv_ann_right_edge = pcb->rcv_nxt;
|
|
8007e1c: 68fb ldr r3, [r7, #12]
|
|
8007e1e: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
8007e20: 68fb ldr r3, [r7, #12]
|
|
8007e22: 62da str r2, [r3, #44] ; 0x2c
|
|
pcb->snd_wnd = TCP_WND;
|
|
8007e24: 68fb ldr r3, [r7, #12]
|
|
8007e26: f44f 6206 mov.w r2, #2144 ; 0x860
|
|
8007e2a: f8a3 2060 strh.w r2, [r3, #96] ; 0x60
|
|
/* As initial send MSS, we use TCP_MSS but limit it to 536.
|
|
The send MSS is updated when an MSS option is received. */
|
|
pcb->mss = INITIAL_MSS;
|
|
8007e2e: 68fb ldr r3, [r7, #12]
|
|
8007e30: f44f 7206 mov.w r2, #536 ; 0x218
|
|
8007e34: 865a strh r2, [r3, #50] ; 0x32
|
|
#if TCP_CALCULATE_EFF_SEND_MSS
|
|
pcb->mss = tcp_eff_send_mss_netif(pcb->mss, netif, &pcb->remote_ip);
|
|
8007e36: 68fb ldr r3, [r7, #12]
|
|
8007e38: 8e58 ldrh r0, [r3, #50] ; 0x32
|
|
8007e3a: 68fb ldr r3, [r7, #12]
|
|
8007e3c: 3304 adds r3, #4
|
|
8007e3e: 461a mov r2, r3
|
|
8007e40: 6a79 ldr r1, [r7, #36] ; 0x24
|
|
8007e42: f001 f80f bl 8008e64 <tcp_eff_send_mss_netif>
|
|
8007e46: 4603 mov r3, r0
|
|
8007e48: 461a mov r2, r3
|
|
8007e4a: 68fb ldr r3, [r7, #12]
|
|
8007e4c: 865a strh r2, [r3, #50] ; 0x32
|
|
#endif /* TCP_CALCULATE_EFF_SEND_MSS */
|
|
pcb->cwnd = 1;
|
|
8007e4e: 68fb ldr r3, [r7, #12]
|
|
8007e50: 2201 movs r2, #1
|
|
8007e52: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
#if LWIP_CALLBACK_API
|
|
pcb->connected = connected;
|
|
8007e56: 68fb ldr r3, [r7, #12]
|
|
8007e58: 683a ldr r2, [r7, #0]
|
|
8007e5a: f8c3 2088 str.w r2, [r3, #136] ; 0x88
|
|
#else /* LWIP_CALLBACK_API */
|
|
LWIP_UNUSED_ARG(connected);
|
|
#endif /* LWIP_CALLBACK_API */
|
|
|
|
/* Send a SYN together with the MSS option. */
|
|
ret = tcp_enqueue_flags(pcb, TCP_SYN);
|
|
8007e5e: 2102 movs r1, #2
|
|
8007e60: 68f8 ldr r0, [r7, #12]
|
|
8007e62: f004 fad9 bl 800c418 <tcp_enqueue_flags>
|
|
8007e66: 4603 mov r3, r0
|
|
8007e68: 74fb strb r3, [r7, #19]
|
|
if (ret == ERR_OK) {
|
|
8007e6a: f997 3013 ldrsb.w r3, [r7, #19]
|
|
8007e6e: 2b00 cmp r3, #0
|
|
8007e70: d136 bne.n 8007ee0 <tcp_connect+0x204>
|
|
/* SYN segment was enqueued, changed the pcbs state now */
|
|
pcb->state = SYN_SENT;
|
|
8007e72: 68fb ldr r3, [r7, #12]
|
|
8007e74: 2202 movs r2, #2
|
|
8007e76: 751a strb r2, [r3, #20]
|
|
if (old_local_port != 0) {
|
|
8007e78: 8b7b ldrh r3, [r7, #26]
|
|
8007e7a: 2b00 cmp r3, #0
|
|
8007e7c: d021 beq.n 8007ec2 <tcp_connect+0x1e6>
|
|
TCP_RMV(&tcp_bound_pcbs, pcb);
|
|
8007e7e: 4b20 ldr r3, [pc, #128] ; (8007f00 <tcp_connect+0x224>)
|
|
8007e80: 681b ldr r3, [r3, #0]
|
|
8007e82: 68fa ldr r2, [r7, #12]
|
|
8007e84: 429a cmp r2, r3
|
|
8007e86: d105 bne.n 8007e94 <tcp_connect+0x1b8>
|
|
8007e88: 4b1d ldr r3, [pc, #116] ; (8007f00 <tcp_connect+0x224>)
|
|
8007e8a: 681b ldr r3, [r3, #0]
|
|
8007e8c: 68db ldr r3, [r3, #12]
|
|
8007e8e: 4a1c ldr r2, [pc, #112] ; (8007f00 <tcp_connect+0x224>)
|
|
8007e90: 6013 str r3, [r2, #0]
|
|
8007e92: e013 b.n 8007ebc <tcp_connect+0x1e0>
|
|
8007e94: 4b1a ldr r3, [pc, #104] ; (8007f00 <tcp_connect+0x224>)
|
|
8007e96: 681b ldr r3, [r3, #0]
|
|
8007e98: 623b str r3, [r7, #32]
|
|
8007e9a: e00c b.n 8007eb6 <tcp_connect+0x1da>
|
|
8007e9c: 6a3b ldr r3, [r7, #32]
|
|
8007e9e: 68db ldr r3, [r3, #12]
|
|
8007ea0: 68fa ldr r2, [r7, #12]
|
|
8007ea2: 429a cmp r2, r3
|
|
8007ea4: d104 bne.n 8007eb0 <tcp_connect+0x1d4>
|
|
8007ea6: 68fb ldr r3, [r7, #12]
|
|
8007ea8: 68da ldr r2, [r3, #12]
|
|
8007eaa: 6a3b ldr r3, [r7, #32]
|
|
8007eac: 60da str r2, [r3, #12]
|
|
8007eae: e005 b.n 8007ebc <tcp_connect+0x1e0>
|
|
8007eb0: 6a3b ldr r3, [r7, #32]
|
|
8007eb2: 68db ldr r3, [r3, #12]
|
|
8007eb4: 623b str r3, [r7, #32]
|
|
8007eb6: 6a3b ldr r3, [r7, #32]
|
|
8007eb8: 2b00 cmp r3, #0
|
|
8007eba: d1ef bne.n 8007e9c <tcp_connect+0x1c0>
|
|
8007ebc: 68fb ldr r3, [r7, #12]
|
|
8007ebe: 2200 movs r2, #0
|
|
8007ec0: 60da str r2, [r3, #12]
|
|
}
|
|
TCP_REG_ACTIVE(pcb);
|
|
8007ec2: 4b10 ldr r3, [pc, #64] ; (8007f04 <tcp_connect+0x228>)
|
|
8007ec4: 681a ldr r2, [r3, #0]
|
|
8007ec6: 68fb ldr r3, [r7, #12]
|
|
8007ec8: 60da str r2, [r3, #12]
|
|
8007eca: 4a0e ldr r2, [pc, #56] ; (8007f04 <tcp_connect+0x228>)
|
|
8007ecc: 68fb ldr r3, [r7, #12]
|
|
8007ece: 6013 str r3, [r2, #0]
|
|
8007ed0: f005 fb12 bl 800d4f8 <tcp_timer_needed>
|
|
8007ed4: 4b0c ldr r3, [pc, #48] ; (8007f08 <tcp_connect+0x22c>)
|
|
8007ed6: 2201 movs r2, #1
|
|
8007ed8: 701a strb r2, [r3, #0]
|
|
MIB2_STATS_INC(mib2.tcpactiveopens);
|
|
|
|
tcp_output(pcb);
|
|
8007eda: 68f8 ldr r0, [r7, #12]
|
|
8007edc: f004 fb8a bl 800c5f4 <tcp_output>
|
|
}
|
|
return ret;
|
|
8007ee0: f997 3013 ldrsb.w r3, [r7, #19]
|
|
}
|
|
8007ee4: 4618 mov r0, r3
|
|
8007ee6: 3728 adds r7, #40 ; 0x28
|
|
8007ee8: 46bd mov sp, r7
|
|
8007eea: bd80 pop {r7, pc}
|
|
8007eec: 08012a08 .word 0x08012a08
|
|
8007ef0: 08012ce4 .word 0x08012ce4
|
|
8007ef4: 08012a4c .word 0x08012a4c
|
|
8007ef8: 08012d00 .word 0x08012d00
|
|
8007efc: 08012d1c .word 0x08012d1c
|
|
8007f00: 24007b70 .word 0x24007b70
|
|
8007f04: 24007b78 .word 0x24007b78
|
|
8007f08: 24007b80 .word 0x24007b80
|
|
|
|
08007f0c <tcp_slowtmr>:
|
|
*
|
|
* Automatically called from tcp_tmr().
|
|
*/
|
|
void
|
|
tcp_slowtmr(void)
|
|
{
|
|
8007f0c: b5b0 push {r4, r5, r7, lr}
|
|
8007f0e: b090 sub sp, #64 ; 0x40
|
|
8007f10: af04 add r7, sp, #16
|
|
tcpwnd_size_t eff_wnd;
|
|
u8_t pcb_remove; /* flag if a PCB should be removed */
|
|
u8_t pcb_reset; /* flag if a RST should be sent when removing */
|
|
err_t err;
|
|
|
|
err = ERR_OK;
|
|
8007f12: 2300 movs r3, #0
|
|
8007f14: f887 3025 strb.w r3, [r7, #37] ; 0x25
|
|
|
|
++tcp_ticks;
|
|
8007f18: 4b94 ldr r3, [pc, #592] ; (800816c <tcp_slowtmr+0x260>)
|
|
8007f1a: 681b ldr r3, [r3, #0]
|
|
8007f1c: 3301 adds r3, #1
|
|
8007f1e: 4a93 ldr r2, [pc, #588] ; (800816c <tcp_slowtmr+0x260>)
|
|
8007f20: 6013 str r3, [r2, #0]
|
|
++tcp_timer_ctr;
|
|
8007f22: 4b93 ldr r3, [pc, #588] ; (8008170 <tcp_slowtmr+0x264>)
|
|
8007f24: 781b ldrb r3, [r3, #0]
|
|
8007f26: 3301 adds r3, #1
|
|
8007f28: b2da uxtb r2, r3
|
|
8007f2a: 4b91 ldr r3, [pc, #580] ; (8008170 <tcp_slowtmr+0x264>)
|
|
8007f2c: 701a strb r2, [r3, #0]
|
|
|
|
tcp_slowtmr_start:
|
|
/* Steps through all of the active PCBs. */
|
|
prev = NULL;
|
|
8007f2e: 2300 movs r3, #0
|
|
8007f30: 62bb str r3, [r7, #40] ; 0x28
|
|
pcb = tcp_active_pcbs;
|
|
8007f32: 4b90 ldr r3, [pc, #576] ; (8008174 <tcp_slowtmr+0x268>)
|
|
8007f34: 681b ldr r3, [r3, #0]
|
|
8007f36: 62fb str r3, [r7, #44] ; 0x2c
|
|
if (pcb == NULL) {
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
|
|
}
|
|
while (pcb != NULL) {
|
|
8007f38: e29d b.n 8008476 <tcp_slowtmr+0x56a>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
|
|
LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
|
|
8007f3a: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007f3c: 7d1b ldrb r3, [r3, #20]
|
|
8007f3e: 2b00 cmp r3, #0
|
|
8007f40: d106 bne.n 8007f50 <tcp_slowtmr+0x44>
|
|
8007f42: 4b8d ldr r3, [pc, #564] ; (8008178 <tcp_slowtmr+0x26c>)
|
|
8007f44: f240 42be movw r2, #1214 ; 0x4be
|
|
8007f48: 498c ldr r1, [pc, #560] ; (800817c <tcp_slowtmr+0x270>)
|
|
8007f4a: 488d ldr r0, [pc, #564] ; (8008180 <tcp_slowtmr+0x274>)
|
|
8007f4c: f008 fe3c bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
|
|
8007f50: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007f52: 7d1b ldrb r3, [r3, #20]
|
|
8007f54: 2b01 cmp r3, #1
|
|
8007f56: d106 bne.n 8007f66 <tcp_slowtmr+0x5a>
|
|
8007f58: 4b87 ldr r3, [pc, #540] ; (8008178 <tcp_slowtmr+0x26c>)
|
|
8007f5a: f240 42bf movw r2, #1215 ; 0x4bf
|
|
8007f5e: 4989 ldr r1, [pc, #548] ; (8008184 <tcp_slowtmr+0x278>)
|
|
8007f60: 4887 ldr r0, [pc, #540] ; (8008180 <tcp_slowtmr+0x274>)
|
|
8007f62: f008 fe31 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
|
|
8007f66: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007f68: 7d1b ldrb r3, [r3, #20]
|
|
8007f6a: 2b0a cmp r3, #10
|
|
8007f6c: d106 bne.n 8007f7c <tcp_slowtmr+0x70>
|
|
8007f6e: 4b82 ldr r3, [pc, #520] ; (8008178 <tcp_slowtmr+0x26c>)
|
|
8007f70: f44f 6298 mov.w r2, #1216 ; 0x4c0
|
|
8007f74: 4984 ldr r1, [pc, #528] ; (8008188 <tcp_slowtmr+0x27c>)
|
|
8007f76: 4882 ldr r0, [pc, #520] ; (8008180 <tcp_slowtmr+0x274>)
|
|
8007f78: f008 fe26 bl 8010bc8 <iprintf>
|
|
if (pcb->last_timer == tcp_timer_ctr) {
|
|
8007f7c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007f7e: 7f9a ldrb r2, [r3, #30]
|
|
8007f80: 4b7b ldr r3, [pc, #492] ; (8008170 <tcp_slowtmr+0x264>)
|
|
8007f82: 781b ldrb r3, [r3, #0]
|
|
8007f84: 429a cmp r2, r3
|
|
8007f86: d105 bne.n 8007f94 <tcp_slowtmr+0x88>
|
|
/* skip this pcb, we have already processed it */
|
|
prev = pcb;
|
|
8007f88: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007f8a: 62bb str r3, [r7, #40] ; 0x28
|
|
pcb = pcb->next;
|
|
8007f8c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007f8e: 68db ldr r3, [r3, #12]
|
|
8007f90: 62fb str r3, [r7, #44] ; 0x2c
|
|
continue;
|
|
8007f92: e270 b.n 8008476 <tcp_slowtmr+0x56a>
|
|
}
|
|
pcb->last_timer = tcp_timer_ctr;
|
|
8007f94: 4b76 ldr r3, [pc, #472] ; (8008170 <tcp_slowtmr+0x264>)
|
|
8007f96: 781a ldrb r2, [r3, #0]
|
|
8007f98: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007f9a: 779a strb r2, [r3, #30]
|
|
|
|
pcb_remove = 0;
|
|
8007f9c: 2300 movs r3, #0
|
|
8007f9e: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
pcb_reset = 0;
|
|
8007fa2: 2300 movs r3, #0
|
|
8007fa4: f887 3026 strb.w r3, [r7, #38] ; 0x26
|
|
|
|
if (pcb->state == SYN_SENT && pcb->nrtx >= TCP_SYNMAXRTX) {
|
|
8007fa8: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007faa: 7d1b ldrb r3, [r3, #20]
|
|
8007fac: 2b02 cmp r3, #2
|
|
8007fae: d10a bne.n 8007fc6 <tcp_slowtmr+0xba>
|
|
8007fb0: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007fb2: f893 3042 ldrb.w r3, [r3, #66] ; 0x42
|
|
8007fb6: 2b05 cmp r3, #5
|
|
8007fb8: d905 bls.n 8007fc6 <tcp_slowtmr+0xba>
|
|
++pcb_remove;
|
|
8007fba: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
8007fbe: 3301 adds r3, #1
|
|
8007fc0: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
|
|
8007fc4: e11e b.n 8008204 <tcp_slowtmr+0x2f8>
|
|
} else if (pcb->nrtx >= TCP_MAXRTX) {
|
|
8007fc6: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007fc8: f893 3042 ldrb.w r3, [r3, #66] ; 0x42
|
|
8007fcc: 2b0b cmp r3, #11
|
|
8007fce: d905 bls.n 8007fdc <tcp_slowtmr+0xd0>
|
|
++pcb_remove;
|
|
8007fd0: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
8007fd4: 3301 adds r3, #1
|
|
8007fd6: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
8007fda: e113 b.n 8008204 <tcp_slowtmr+0x2f8>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
|
|
} else {
|
|
if (pcb->persist_backoff > 0) {
|
|
8007fdc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007fde: f893 3099 ldrb.w r3, [r3, #153] ; 0x99
|
|
8007fe2: 2b00 cmp r3, #0
|
|
8007fe4: d075 beq.n 80080d2 <tcp_slowtmr+0x1c6>
|
|
LWIP_ASSERT("tcp_slowtimr: persist ticking with in-flight data", pcb->unacked == NULL);
|
|
8007fe6: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007fe8: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8007fea: 2b00 cmp r3, #0
|
|
8007fec: d006 beq.n 8007ffc <tcp_slowtmr+0xf0>
|
|
8007fee: 4b62 ldr r3, [pc, #392] ; (8008178 <tcp_slowtmr+0x26c>)
|
|
8007ff0: f240 42d4 movw r2, #1236 ; 0x4d4
|
|
8007ff4: 4965 ldr r1, [pc, #404] ; (800818c <tcp_slowtmr+0x280>)
|
|
8007ff6: 4862 ldr r0, [pc, #392] ; (8008180 <tcp_slowtmr+0x274>)
|
|
8007ff8: f008 fde6 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_slowtimr: persist ticking with empty send buffer", pcb->unsent != NULL);
|
|
8007ffc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8007ffe: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8008000: 2b00 cmp r3, #0
|
|
8008002: d106 bne.n 8008012 <tcp_slowtmr+0x106>
|
|
8008004: 4b5c ldr r3, [pc, #368] ; (8008178 <tcp_slowtmr+0x26c>)
|
|
8008006: f240 42d5 movw r2, #1237 ; 0x4d5
|
|
800800a: 4961 ldr r1, [pc, #388] ; (8008190 <tcp_slowtmr+0x284>)
|
|
800800c: 485c ldr r0, [pc, #368] ; (8008180 <tcp_slowtmr+0x274>)
|
|
800800e: f008 fddb bl 8010bc8 <iprintf>
|
|
if (pcb->persist_probe >= TCP_MAXRTX) {
|
|
8008012: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008014: f893 309a ldrb.w r3, [r3, #154] ; 0x9a
|
|
8008018: 2b0b cmp r3, #11
|
|
800801a: d905 bls.n 8008028 <tcp_slowtmr+0x11c>
|
|
++pcb_remove; /* max probes reached */
|
|
800801c: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
8008020: 3301 adds r3, #1
|
|
8008022: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
8008026: e0ed b.n 8008204 <tcp_slowtmr+0x2f8>
|
|
} else {
|
|
u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff - 1];
|
|
8008028: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800802a: f893 3099 ldrb.w r3, [r3, #153] ; 0x99
|
|
800802e: 3b01 subs r3, #1
|
|
8008030: 4a58 ldr r2, [pc, #352] ; (8008194 <tcp_slowtmr+0x288>)
|
|
8008032: 5cd3 ldrb r3, [r2, r3]
|
|
8008034: 747b strb r3, [r7, #17]
|
|
if (pcb->persist_cnt < backoff_cnt) {
|
|
8008036: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008038: f893 3098 ldrb.w r3, [r3, #152] ; 0x98
|
|
800803c: 7c7a ldrb r2, [r7, #17]
|
|
800803e: 429a cmp r2, r3
|
|
8008040: d907 bls.n 8008052 <tcp_slowtmr+0x146>
|
|
pcb->persist_cnt++;
|
|
8008042: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008044: f893 3098 ldrb.w r3, [r3, #152] ; 0x98
|
|
8008048: 3301 adds r3, #1
|
|
800804a: b2da uxtb r2, r3
|
|
800804c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800804e: f883 2098 strb.w r2, [r3, #152] ; 0x98
|
|
}
|
|
if (pcb->persist_cnt >= backoff_cnt) {
|
|
8008052: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008054: f893 3098 ldrb.w r3, [r3, #152] ; 0x98
|
|
8008058: 7c7a ldrb r2, [r7, #17]
|
|
800805a: 429a cmp r2, r3
|
|
800805c: f200 80d2 bhi.w 8008204 <tcp_slowtmr+0x2f8>
|
|
int next_slot = 1; /* increment timer to next slot */
|
|
8008060: 2301 movs r3, #1
|
|
8008062: 623b str r3, [r7, #32]
|
|
/* If snd_wnd is zero, send 1 byte probes */
|
|
if (pcb->snd_wnd == 0) {
|
|
8008064: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008066: f8b3 3060 ldrh.w r3, [r3, #96] ; 0x60
|
|
800806a: 2b00 cmp r3, #0
|
|
800806c: d108 bne.n 8008080 <tcp_slowtmr+0x174>
|
|
if (tcp_zero_window_probe(pcb) != ERR_OK) {
|
|
800806e: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
8008070: f005 f974 bl 800d35c <tcp_zero_window_probe>
|
|
8008074: 4603 mov r3, r0
|
|
8008076: 2b00 cmp r3, #0
|
|
8008078: d014 beq.n 80080a4 <tcp_slowtmr+0x198>
|
|
next_slot = 0; /* try probe again with current slot */
|
|
800807a: 2300 movs r3, #0
|
|
800807c: 623b str r3, [r7, #32]
|
|
800807e: e011 b.n 80080a4 <tcp_slowtmr+0x198>
|
|
}
|
|
/* snd_wnd not fully closed, split unsent head and fill window */
|
|
} else {
|
|
if (tcp_split_unsent_seg(pcb, (u16_t)pcb->snd_wnd) == ERR_OK) {
|
|
8008080: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008082: f8b3 3060 ldrh.w r3, [r3, #96] ; 0x60
|
|
8008086: 4619 mov r1, r3
|
|
8008088: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
800808a: f004 f829 bl 800c0e0 <tcp_split_unsent_seg>
|
|
800808e: 4603 mov r3, r0
|
|
8008090: 2b00 cmp r3, #0
|
|
8008092: d107 bne.n 80080a4 <tcp_slowtmr+0x198>
|
|
if (tcp_output(pcb) == ERR_OK) {
|
|
8008094: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
8008096: f004 faad bl 800c5f4 <tcp_output>
|
|
800809a: 4603 mov r3, r0
|
|
800809c: 2b00 cmp r3, #0
|
|
800809e: d101 bne.n 80080a4 <tcp_slowtmr+0x198>
|
|
/* sending will cancel persist timer, else retry with current slot */
|
|
next_slot = 0;
|
|
80080a0: 2300 movs r3, #0
|
|
80080a2: 623b str r3, [r7, #32]
|
|
}
|
|
}
|
|
}
|
|
if (next_slot) {
|
|
80080a4: 6a3b ldr r3, [r7, #32]
|
|
80080a6: 2b00 cmp r3, #0
|
|
80080a8: f000 80ac beq.w 8008204 <tcp_slowtmr+0x2f8>
|
|
pcb->persist_cnt = 0;
|
|
80080ac: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80080ae: 2200 movs r2, #0
|
|
80080b0: f883 2098 strb.w r2, [r3, #152] ; 0x98
|
|
if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
|
|
80080b4: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80080b6: f893 3099 ldrb.w r3, [r3, #153] ; 0x99
|
|
80080ba: 2b06 cmp r3, #6
|
|
80080bc: f200 80a2 bhi.w 8008204 <tcp_slowtmr+0x2f8>
|
|
pcb->persist_backoff++;
|
|
80080c0: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80080c2: f893 3099 ldrb.w r3, [r3, #153] ; 0x99
|
|
80080c6: 3301 adds r3, #1
|
|
80080c8: b2da uxtb r2, r3
|
|
80080ca: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80080cc: f883 2099 strb.w r2, [r3, #153] ; 0x99
|
|
80080d0: e098 b.n 8008204 <tcp_slowtmr+0x2f8>
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
/* Increase the retransmission timer if it is running */
|
|
if ((pcb->rtime >= 0) && (pcb->rtime < 0x7FFF)) {
|
|
80080d2: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80080d4: f9b3 3030 ldrsh.w r3, [r3, #48] ; 0x30
|
|
80080d8: 2b00 cmp r3, #0
|
|
80080da: db0f blt.n 80080fc <tcp_slowtmr+0x1f0>
|
|
80080dc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80080de: f9b3 3030 ldrsh.w r3, [r3, #48] ; 0x30
|
|
80080e2: f647 72ff movw r2, #32767 ; 0x7fff
|
|
80080e6: 4293 cmp r3, r2
|
|
80080e8: d008 beq.n 80080fc <tcp_slowtmr+0x1f0>
|
|
++pcb->rtime;
|
|
80080ea: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80080ec: f9b3 3030 ldrsh.w r3, [r3, #48] ; 0x30
|
|
80080f0: b29b uxth r3, r3
|
|
80080f2: 3301 adds r3, #1
|
|
80080f4: b29b uxth r3, r3
|
|
80080f6: b21a sxth r2, r3
|
|
80080f8: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80080fa: 861a strh r2, [r3, #48] ; 0x30
|
|
}
|
|
|
|
if (pcb->rtime >= pcb->rto) {
|
|
80080fc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80080fe: f9b3 2030 ldrsh.w r2, [r3, #48] ; 0x30
|
|
8008102: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008104: f9b3 3040 ldrsh.w r3, [r3, #64] ; 0x40
|
|
8008108: 429a cmp r2, r3
|
|
800810a: db7b blt.n 8008204 <tcp_slowtmr+0x2f8>
|
|
" pcb->rto %"S16_F"\n",
|
|
pcb->rtime, pcb->rto));
|
|
/* If prepare phase fails but we have unsent data but no unacked data,
|
|
still execute the backoff calculations below, as this means we somehow
|
|
failed to send segment. */
|
|
if ((tcp_rexmit_rto_prepare(pcb) == ERR_OK) || ((pcb->unacked == NULL) && (pcb->unsent != NULL))) {
|
|
800810c: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
800810e: f004 fd67 bl 800cbe0 <tcp_rexmit_rto_prepare>
|
|
8008112: 4603 mov r3, r0
|
|
8008114: 2b00 cmp r3, #0
|
|
8008116: d007 beq.n 8008128 <tcp_slowtmr+0x21c>
|
|
8008118: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800811a: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800811c: 2b00 cmp r3, #0
|
|
800811e: d171 bne.n 8008204 <tcp_slowtmr+0x2f8>
|
|
8008120: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008122: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8008124: 2b00 cmp r3, #0
|
|
8008126: d06d beq.n 8008204 <tcp_slowtmr+0x2f8>
|
|
/* Double retransmission time-out unless we are trying to
|
|
* connect to somebody (i.e., we are in SYN_SENT). */
|
|
if (pcb->state != SYN_SENT) {
|
|
8008128: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800812a: 7d1b ldrb r3, [r3, #20]
|
|
800812c: 2b02 cmp r3, #2
|
|
800812e: d03a beq.n 80081a6 <tcp_slowtmr+0x29a>
|
|
u8_t backoff_idx = LWIP_MIN(pcb->nrtx, sizeof(tcp_backoff) - 1);
|
|
8008130: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008132: f893 3042 ldrb.w r3, [r3, #66] ; 0x42
|
|
8008136: 2b0c cmp r3, #12
|
|
8008138: bf28 it cs
|
|
800813a: 230c movcs r3, #12
|
|
800813c: 76fb strb r3, [r7, #27]
|
|
int calc_rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx];
|
|
800813e: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008140: f9b3 303c ldrsh.w r3, [r3, #60] ; 0x3c
|
|
8008144: 10db asrs r3, r3, #3
|
|
8008146: b21b sxth r3, r3
|
|
8008148: 461a mov r2, r3
|
|
800814a: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800814c: f9b3 303e ldrsh.w r3, [r3, #62] ; 0x3e
|
|
8008150: 4413 add r3, r2
|
|
8008152: 7efa ldrb r2, [r7, #27]
|
|
8008154: 4910 ldr r1, [pc, #64] ; (8008198 <tcp_slowtmr+0x28c>)
|
|
8008156: 5c8a ldrb r2, [r1, r2]
|
|
8008158: 4093 lsls r3, r2
|
|
800815a: 617b str r3, [r7, #20]
|
|
pcb->rto = (s16_t)LWIP_MIN(calc_rto, 0x7FFF);
|
|
800815c: 697b ldr r3, [r7, #20]
|
|
800815e: f647 72fe movw r2, #32766 ; 0x7ffe
|
|
8008162: 4293 cmp r3, r2
|
|
8008164: dc1a bgt.n 800819c <tcp_slowtmr+0x290>
|
|
8008166: 697b ldr r3, [r7, #20]
|
|
8008168: b21a sxth r2, r3
|
|
800816a: e019 b.n 80081a0 <tcp_slowtmr+0x294>
|
|
800816c: 24007b6c .word 0x24007b6c
|
|
8008170: 24007b82 .word 0x24007b82
|
|
8008174: 24007b78 .word 0x24007b78
|
|
8008178: 08012a08 .word 0x08012a08
|
|
800817c: 08012d4c .word 0x08012d4c
|
|
8008180: 08012a4c .word 0x08012a4c
|
|
8008184: 08012d78 .word 0x08012d78
|
|
8008188: 08012da4 .word 0x08012da4
|
|
800818c: 08012dd4 .word 0x08012dd4
|
|
8008190: 08012e08 .word 0x08012e08
|
|
8008194: 08014d64 .word 0x08014d64
|
|
8008198: 08014d54 .word 0x08014d54
|
|
800819c: f647 72ff movw r2, #32767 ; 0x7fff
|
|
80081a0: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081a2: f8a3 2040 strh.w r2, [r3, #64] ; 0x40
|
|
}
|
|
|
|
/* Reset the retransmission timer. */
|
|
pcb->rtime = 0;
|
|
80081a6: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081a8: 2200 movs r2, #0
|
|
80081aa: 861a strh r2, [r3, #48] ; 0x30
|
|
|
|
/* Reduce congestion window and ssthresh. */
|
|
eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
|
|
80081ac: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081ae: f8b3 2060 ldrh.w r2, [r3, #96] ; 0x60
|
|
80081b2: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081b4: f8b3 3048 ldrh.w r3, [r3, #72] ; 0x48
|
|
80081b8: 4293 cmp r3, r2
|
|
80081ba: bf28 it cs
|
|
80081bc: 4613 movcs r3, r2
|
|
80081be: 827b strh r3, [r7, #18]
|
|
pcb->ssthresh = eff_wnd >> 1;
|
|
80081c0: 8a7b ldrh r3, [r7, #18]
|
|
80081c2: 085b lsrs r3, r3, #1
|
|
80081c4: b29a uxth r2, r3
|
|
80081c6: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081c8: f8a3 204a strh.w r2, [r3, #74] ; 0x4a
|
|
if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) {
|
|
80081cc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081ce: f8b3 204a ldrh.w r2, [r3, #74] ; 0x4a
|
|
80081d2: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081d4: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
80081d6: 005b lsls r3, r3, #1
|
|
80081d8: b29b uxth r3, r3
|
|
80081da: 429a cmp r2, r3
|
|
80081dc: d206 bcs.n 80081ec <tcp_slowtmr+0x2e0>
|
|
pcb->ssthresh = (tcpwnd_size_t)(pcb->mss << 1);
|
|
80081de: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081e0: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
80081e2: 005b lsls r3, r3, #1
|
|
80081e4: b29a uxth r2, r3
|
|
80081e6: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081e8: f8a3 204a strh.w r2, [r3, #74] ; 0x4a
|
|
}
|
|
pcb->cwnd = pcb->mss;
|
|
80081ec: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081ee: 8e5a ldrh r2, [r3, #50] ; 0x32
|
|
80081f0: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081f2: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"TCPWNDSIZE_F
|
|
" ssthresh %"TCPWNDSIZE_F"\n",
|
|
pcb->cwnd, pcb->ssthresh));
|
|
pcb->bytes_acked = 0;
|
|
80081f6: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80081f8: 2200 movs r2, #0
|
|
80081fa: f8a3 206a strh.w r2, [r3, #106] ; 0x6a
|
|
|
|
/* The following needs to be called AFTER cwnd is set to one
|
|
mss - STJ */
|
|
tcp_rexmit_rto_commit(pcb);
|
|
80081fe: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
8008200: f004 fd68 bl 800ccd4 <tcp_rexmit_rto_commit>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/* Check if this PCB has stayed too long in FIN-WAIT-2 */
|
|
if (pcb->state == FIN_WAIT_2) {
|
|
8008204: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008206: 7d1b ldrb r3, [r3, #20]
|
|
8008208: 2b06 cmp r3, #6
|
|
800820a: d111 bne.n 8008230 <tcp_slowtmr+0x324>
|
|
/* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */
|
|
if (pcb->flags & TF_RXCLOSED) {
|
|
800820c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800820e: 8b5b ldrh r3, [r3, #26]
|
|
8008210: f003 0310 and.w r3, r3, #16
|
|
8008214: 2b00 cmp r3, #0
|
|
8008216: d00b beq.n 8008230 <tcp_slowtmr+0x324>
|
|
/* PCB was fully closed (either through close() or SHUT_RDWR):
|
|
normal FIN-WAIT timeout handling. */
|
|
if ((u32_t)(tcp_ticks - pcb->tmr) >
|
|
8008218: 4b9c ldr r3, [pc, #624] ; (800848c <tcp_slowtmr+0x580>)
|
|
800821a: 681a ldr r2, [r3, #0]
|
|
800821c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800821e: 6a1b ldr r3, [r3, #32]
|
|
8008220: 1ad3 subs r3, r2, r3
|
|
8008222: 2b28 cmp r3, #40 ; 0x28
|
|
8008224: d904 bls.n 8008230 <tcp_slowtmr+0x324>
|
|
TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
|
|
++pcb_remove;
|
|
8008226: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
800822a: 3301 adds r3, #1
|
|
800822c: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Check if KEEPALIVE should be sent */
|
|
if (ip_get_option(pcb, SOF_KEEPALIVE) &&
|
|
8008230: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008232: 7a5b ldrb r3, [r3, #9]
|
|
8008234: f003 0308 and.w r3, r3, #8
|
|
8008238: 2b00 cmp r3, #0
|
|
800823a: d04a beq.n 80082d2 <tcp_slowtmr+0x3c6>
|
|
((pcb->state == ESTABLISHED) ||
|
|
800823c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800823e: 7d1b ldrb r3, [r3, #20]
|
|
if (ip_get_option(pcb, SOF_KEEPALIVE) &&
|
|
8008240: 2b04 cmp r3, #4
|
|
8008242: d003 beq.n 800824c <tcp_slowtmr+0x340>
|
|
(pcb->state == CLOSE_WAIT))) {
|
|
8008244: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008246: 7d1b ldrb r3, [r3, #20]
|
|
((pcb->state == ESTABLISHED) ||
|
|
8008248: 2b07 cmp r3, #7
|
|
800824a: d142 bne.n 80082d2 <tcp_slowtmr+0x3c6>
|
|
if ((u32_t)(tcp_ticks - pcb->tmr) >
|
|
800824c: 4b8f ldr r3, [pc, #572] ; (800848c <tcp_slowtmr+0x580>)
|
|
800824e: 681a ldr r2, [r3, #0]
|
|
8008250: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008252: 6a1b ldr r3, [r3, #32]
|
|
8008254: 1ad2 subs r2, r2, r3
|
|
(pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL) {
|
|
8008256: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008258: f8d3 1094 ldr.w r1, [r3, #148] ; 0x94
|
|
800825c: 4b8c ldr r3, [pc, #560] ; (8008490 <tcp_slowtmr+0x584>)
|
|
800825e: 440b add r3, r1
|
|
8008260: 498c ldr r1, [pc, #560] ; (8008494 <tcp_slowtmr+0x588>)
|
|
8008262: fba1 1303 umull r1, r3, r1, r3
|
|
8008266: 095b lsrs r3, r3, #5
|
|
if ((u32_t)(tcp_ticks - pcb->tmr) >
|
|
8008268: 429a cmp r2, r3
|
|
800826a: d90a bls.n 8008282 <tcp_slowtmr+0x376>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to "));
|
|
ip_addr_debug_print_val(TCP_DEBUG, pcb->remote_ip);
|
|
LWIP_DEBUGF(TCP_DEBUG, ("\n"));
|
|
|
|
++pcb_remove;
|
|
800826c: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
8008270: 3301 adds r3, #1
|
|
8008272: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
++pcb_reset;
|
|
8008276: f897 3026 ldrb.w r3, [r7, #38] ; 0x26
|
|
800827a: 3301 adds r3, #1
|
|
800827c: f887 3026 strb.w r3, [r7, #38] ; 0x26
|
|
8008280: e027 b.n 80082d2 <tcp_slowtmr+0x3c6>
|
|
} else if ((u32_t)(tcp_ticks - pcb->tmr) >
|
|
8008282: 4b82 ldr r3, [pc, #520] ; (800848c <tcp_slowtmr+0x580>)
|
|
8008284: 681a ldr r2, [r3, #0]
|
|
8008286: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008288: 6a1b ldr r3, [r3, #32]
|
|
800828a: 1ad2 subs r2, r2, r3
|
|
(pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
|
|
800828c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800828e: f8d3 1094 ldr.w r1, [r3, #148] ; 0x94
|
|
8008292: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008294: f893 309b ldrb.w r3, [r3, #155] ; 0x9b
|
|
8008298: 4618 mov r0, r3
|
|
800829a: 4b7f ldr r3, [pc, #508] ; (8008498 <tcp_slowtmr+0x58c>)
|
|
800829c: fb00 f303 mul.w r3, r0, r3
|
|
80082a0: 440b add r3, r1
|
|
/ TCP_SLOW_INTERVAL) {
|
|
80082a2: 497c ldr r1, [pc, #496] ; (8008494 <tcp_slowtmr+0x588>)
|
|
80082a4: fba1 1303 umull r1, r3, r1, r3
|
|
80082a8: 095b lsrs r3, r3, #5
|
|
} else if ((u32_t)(tcp_ticks - pcb->tmr) >
|
|
80082aa: 429a cmp r2, r3
|
|
80082ac: d911 bls.n 80082d2 <tcp_slowtmr+0x3c6>
|
|
err = tcp_keepalive(pcb);
|
|
80082ae: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
80082b0: f005 f814 bl 800d2dc <tcp_keepalive>
|
|
80082b4: 4603 mov r3, r0
|
|
80082b6: f887 3025 strb.w r3, [r7, #37] ; 0x25
|
|
if (err == ERR_OK) {
|
|
80082ba: f997 3025 ldrsb.w r3, [r7, #37] ; 0x25
|
|
80082be: 2b00 cmp r3, #0
|
|
80082c0: d107 bne.n 80082d2 <tcp_slowtmr+0x3c6>
|
|
pcb->keep_cnt_sent++;
|
|
80082c2: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80082c4: f893 309b ldrb.w r3, [r3, #155] ; 0x9b
|
|
80082c8: 3301 adds r3, #1
|
|
80082ca: b2da uxtb r2, r3
|
|
80082cc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80082ce: f883 209b strb.w r2, [r3, #155] ; 0x9b
|
|
|
|
/* If this PCB has queued out of sequence data, but has been
|
|
inactive for too long, will drop the data (it will eventually
|
|
be retransmitted). */
|
|
#if TCP_QUEUE_OOSEQ
|
|
if (pcb->ooseq != NULL &&
|
|
80082d2: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80082d4: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
80082d6: 2b00 cmp r3, #0
|
|
80082d8: d011 beq.n 80082fe <tcp_slowtmr+0x3f2>
|
|
(tcp_ticks - pcb->tmr >= (u32_t)pcb->rto * TCP_OOSEQ_TIMEOUT)) {
|
|
80082da: 4b6c ldr r3, [pc, #432] ; (800848c <tcp_slowtmr+0x580>)
|
|
80082dc: 681a ldr r2, [r3, #0]
|
|
80082de: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80082e0: 6a1b ldr r3, [r3, #32]
|
|
80082e2: 1ad2 subs r2, r2, r3
|
|
80082e4: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80082e6: f9b3 3040 ldrsh.w r3, [r3, #64] ; 0x40
|
|
80082ea: 4619 mov r1, r3
|
|
80082ec: 460b mov r3, r1
|
|
80082ee: 005b lsls r3, r3, #1
|
|
80082f0: 440b add r3, r1
|
|
80082f2: 005b lsls r3, r3, #1
|
|
if (pcb->ooseq != NULL &&
|
|
80082f4: 429a cmp r2, r3
|
|
80082f6: d302 bcc.n 80082fe <tcp_slowtmr+0x3f2>
|
|
LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
|
|
tcp_free_ooseq(pcb);
|
|
80082f8: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
80082fa: f000 fe63 bl 8008fc4 <tcp_free_ooseq>
|
|
}
|
|
#endif /* TCP_QUEUE_OOSEQ */
|
|
|
|
/* Check if this PCB has stayed too long in SYN-RCVD */
|
|
if (pcb->state == SYN_RCVD) {
|
|
80082fe: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008300: 7d1b ldrb r3, [r3, #20]
|
|
8008302: 2b03 cmp r3, #3
|
|
8008304: d10b bne.n 800831e <tcp_slowtmr+0x412>
|
|
if ((u32_t)(tcp_ticks - pcb->tmr) >
|
|
8008306: 4b61 ldr r3, [pc, #388] ; (800848c <tcp_slowtmr+0x580>)
|
|
8008308: 681a ldr r2, [r3, #0]
|
|
800830a: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800830c: 6a1b ldr r3, [r3, #32]
|
|
800830e: 1ad3 subs r3, r2, r3
|
|
8008310: 2b28 cmp r3, #40 ; 0x28
|
|
8008312: d904 bls.n 800831e <tcp_slowtmr+0x412>
|
|
TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
|
|
++pcb_remove;
|
|
8008314: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
8008318: 3301 adds r3, #1
|
|
800831a: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n"));
|
|
}
|
|
}
|
|
|
|
/* Check if this PCB has stayed too long in LAST-ACK */
|
|
if (pcb->state == LAST_ACK) {
|
|
800831e: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008320: 7d1b ldrb r3, [r3, #20]
|
|
8008322: 2b09 cmp r3, #9
|
|
8008324: d10b bne.n 800833e <tcp_slowtmr+0x432>
|
|
if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
|
|
8008326: 4b59 ldr r3, [pc, #356] ; (800848c <tcp_slowtmr+0x580>)
|
|
8008328: 681a ldr r2, [r3, #0]
|
|
800832a: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800832c: 6a1b ldr r3, [r3, #32]
|
|
800832e: 1ad3 subs r3, r2, r3
|
|
8008330: 2bf0 cmp r3, #240 ; 0xf0
|
|
8008332: d904 bls.n 800833e <tcp_slowtmr+0x432>
|
|
++pcb_remove;
|
|
8008334: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
8008338: 3301 adds r3, #1
|
|
800833a: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n"));
|
|
}
|
|
}
|
|
|
|
/* If the PCB should be removed, do it. */
|
|
if (pcb_remove) {
|
|
800833e: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
8008342: 2b00 cmp r3, #0
|
|
8008344: d060 beq.n 8008408 <tcp_slowtmr+0x4fc>
|
|
struct tcp_pcb *pcb2;
|
|
#if LWIP_CALLBACK_API
|
|
tcp_err_fn err_fn = pcb->errf;
|
|
8008346: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008348: f8d3 3090 ldr.w r3, [r3, #144] ; 0x90
|
|
800834c: 60fb str r3, [r7, #12]
|
|
#endif /* LWIP_CALLBACK_API */
|
|
void *err_arg;
|
|
enum tcp_state last_state;
|
|
tcp_pcb_purge(pcb);
|
|
800834e: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
8008350: f000 fc7e bl 8008c50 <tcp_pcb_purge>
|
|
/* Remove PCB from tcp_active_pcbs list. */
|
|
if (prev != NULL) {
|
|
8008354: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8008356: 2b00 cmp r3, #0
|
|
8008358: d010 beq.n 800837c <tcp_slowtmr+0x470>
|
|
LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
|
|
800835a: 4b50 ldr r3, [pc, #320] ; (800849c <tcp_slowtmr+0x590>)
|
|
800835c: 681b ldr r3, [r3, #0]
|
|
800835e: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8008360: 429a cmp r2, r3
|
|
8008362: d106 bne.n 8008372 <tcp_slowtmr+0x466>
|
|
8008364: 4b4e ldr r3, [pc, #312] ; (80084a0 <tcp_slowtmr+0x594>)
|
|
8008366: f240 526d movw r2, #1389 ; 0x56d
|
|
800836a: 494e ldr r1, [pc, #312] ; (80084a4 <tcp_slowtmr+0x598>)
|
|
800836c: 484e ldr r0, [pc, #312] ; (80084a8 <tcp_slowtmr+0x59c>)
|
|
800836e: f008 fc2b bl 8010bc8 <iprintf>
|
|
prev->next = pcb->next;
|
|
8008372: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008374: 68da ldr r2, [r3, #12]
|
|
8008376: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8008378: 60da str r2, [r3, #12]
|
|
800837a: e00f b.n 800839c <tcp_slowtmr+0x490>
|
|
} else {
|
|
/* This PCB was the first. */
|
|
LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
|
|
800837c: 4b47 ldr r3, [pc, #284] ; (800849c <tcp_slowtmr+0x590>)
|
|
800837e: 681b ldr r3, [r3, #0]
|
|
8008380: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8008382: 429a cmp r2, r3
|
|
8008384: d006 beq.n 8008394 <tcp_slowtmr+0x488>
|
|
8008386: 4b46 ldr r3, [pc, #280] ; (80084a0 <tcp_slowtmr+0x594>)
|
|
8008388: f240 5271 movw r2, #1393 ; 0x571
|
|
800838c: 4947 ldr r1, [pc, #284] ; (80084ac <tcp_slowtmr+0x5a0>)
|
|
800838e: 4846 ldr r0, [pc, #280] ; (80084a8 <tcp_slowtmr+0x59c>)
|
|
8008390: f008 fc1a bl 8010bc8 <iprintf>
|
|
tcp_active_pcbs = pcb->next;
|
|
8008394: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008396: 68db ldr r3, [r3, #12]
|
|
8008398: 4a40 ldr r2, [pc, #256] ; (800849c <tcp_slowtmr+0x590>)
|
|
800839a: 6013 str r3, [r2, #0]
|
|
}
|
|
|
|
if (pcb_reset) {
|
|
800839c: f897 3026 ldrb.w r3, [r7, #38] ; 0x26
|
|
80083a0: 2b00 cmp r3, #0
|
|
80083a2: d013 beq.n 80083cc <tcp_slowtmr+0x4c0>
|
|
tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
|
|
80083a4: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80083a6: 6d18 ldr r0, [r3, #80] ; 0x50
|
|
80083a8: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80083aa: 6a5c ldr r4, [r3, #36] ; 0x24
|
|
80083ac: 6afd ldr r5, [r7, #44] ; 0x2c
|
|
80083ae: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80083b0: 3304 adds r3, #4
|
|
80083b2: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
80083b4: 8ad2 ldrh r2, [r2, #22]
|
|
80083b6: 6af9 ldr r1, [r7, #44] ; 0x2c
|
|
80083b8: 8b09 ldrh r1, [r1, #24]
|
|
80083ba: 9102 str r1, [sp, #8]
|
|
80083bc: 9201 str r2, [sp, #4]
|
|
80083be: 9300 str r3, [sp, #0]
|
|
80083c0: 462b mov r3, r5
|
|
80083c2: 4622 mov r2, r4
|
|
80083c4: 4601 mov r1, r0
|
|
80083c6: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
80083c8: f004 fed4 bl 800d174 <tcp_rst>
|
|
pcb->local_port, pcb->remote_port);
|
|
}
|
|
|
|
err_arg = pcb->callback_arg;
|
|
80083cc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80083ce: 691b ldr r3, [r3, #16]
|
|
80083d0: 60bb str r3, [r7, #8]
|
|
last_state = pcb->state;
|
|
80083d2: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80083d4: 7d1b ldrb r3, [r3, #20]
|
|
80083d6: 71fb strb r3, [r7, #7]
|
|
pcb2 = pcb;
|
|
80083d8: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80083da: 603b str r3, [r7, #0]
|
|
pcb = pcb->next;
|
|
80083dc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80083de: 68db ldr r3, [r3, #12]
|
|
80083e0: 62fb str r3, [r7, #44] ; 0x2c
|
|
tcp_free(pcb2);
|
|
80083e2: 6838 ldr r0, [r7, #0]
|
|
80083e4: f7ff f896 bl 8007514 <tcp_free>
|
|
|
|
tcp_active_pcbs_changed = 0;
|
|
80083e8: 4b31 ldr r3, [pc, #196] ; (80084b0 <tcp_slowtmr+0x5a4>)
|
|
80083ea: 2200 movs r2, #0
|
|
80083ec: 701a strb r2, [r3, #0]
|
|
TCP_EVENT_ERR(last_state, err_fn, err_arg, ERR_ABRT);
|
|
80083ee: 68fb ldr r3, [r7, #12]
|
|
80083f0: 2b00 cmp r3, #0
|
|
80083f2: d004 beq.n 80083fe <tcp_slowtmr+0x4f2>
|
|
80083f4: 68fb ldr r3, [r7, #12]
|
|
80083f6: f06f 010c mvn.w r1, #12
|
|
80083fa: 68b8 ldr r0, [r7, #8]
|
|
80083fc: 4798 blx r3
|
|
if (tcp_active_pcbs_changed) {
|
|
80083fe: 4b2c ldr r3, [pc, #176] ; (80084b0 <tcp_slowtmr+0x5a4>)
|
|
8008400: 781b ldrb r3, [r3, #0]
|
|
8008402: 2b00 cmp r3, #0
|
|
8008404: d037 beq.n 8008476 <tcp_slowtmr+0x56a>
|
|
goto tcp_slowtmr_start;
|
|
8008406: e592 b.n 8007f2e <tcp_slowtmr+0x22>
|
|
}
|
|
} else {
|
|
/* get the 'next' element now and work with 'prev' below (in case of abort) */
|
|
prev = pcb;
|
|
8008408: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800840a: 62bb str r3, [r7, #40] ; 0x28
|
|
pcb = pcb->next;
|
|
800840c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800840e: 68db ldr r3, [r3, #12]
|
|
8008410: 62fb str r3, [r7, #44] ; 0x2c
|
|
|
|
/* We check if we should poll the connection. */
|
|
++prev->polltmr;
|
|
8008412: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8008414: 7f1b ldrb r3, [r3, #28]
|
|
8008416: 3301 adds r3, #1
|
|
8008418: b2da uxtb r2, r3
|
|
800841a: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800841c: 771a strb r2, [r3, #28]
|
|
if (prev->polltmr >= prev->pollinterval) {
|
|
800841e: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8008420: 7f1a ldrb r2, [r3, #28]
|
|
8008422: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8008424: 7f5b ldrb r3, [r3, #29]
|
|
8008426: 429a cmp r2, r3
|
|
8008428: d325 bcc.n 8008476 <tcp_slowtmr+0x56a>
|
|
prev->polltmr = 0;
|
|
800842a: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800842c: 2200 movs r2, #0
|
|
800842e: 771a strb r2, [r3, #28]
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
|
|
tcp_active_pcbs_changed = 0;
|
|
8008430: 4b1f ldr r3, [pc, #124] ; (80084b0 <tcp_slowtmr+0x5a4>)
|
|
8008432: 2200 movs r2, #0
|
|
8008434: 701a strb r2, [r3, #0]
|
|
TCP_EVENT_POLL(prev, err);
|
|
8008436: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8008438: f8d3 308c ldr.w r3, [r3, #140] ; 0x8c
|
|
800843c: 2b00 cmp r3, #0
|
|
800843e: d00b beq.n 8008458 <tcp_slowtmr+0x54c>
|
|
8008440: 6abb ldr r3, [r7, #40] ; 0x28
|
|
8008442: f8d3 308c ldr.w r3, [r3, #140] ; 0x8c
|
|
8008446: 6aba ldr r2, [r7, #40] ; 0x28
|
|
8008448: 6912 ldr r2, [r2, #16]
|
|
800844a: 6ab9 ldr r1, [r7, #40] ; 0x28
|
|
800844c: 4610 mov r0, r2
|
|
800844e: 4798 blx r3
|
|
8008450: 4603 mov r3, r0
|
|
8008452: f887 3025 strb.w r3, [r7, #37] ; 0x25
|
|
8008456: e002 b.n 800845e <tcp_slowtmr+0x552>
|
|
8008458: 2300 movs r3, #0
|
|
800845a: f887 3025 strb.w r3, [r7, #37] ; 0x25
|
|
if (tcp_active_pcbs_changed) {
|
|
800845e: 4b14 ldr r3, [pc, #80] ; (80084b0 <tcp_slowtmr+0x5a4>)
|
|
8008460: 781b ldrb r3, [r3, #0]
|
|
8008462: 2b00 cmp r3, #0
|
|
8008464: d000 beq.n 8008468 <tcp_slowtmr+0x55c>
|
|
goto tcp_slowtmr_start;
|
|
8008466: e562 b.n 8007f2e <tcp_slowtmr+0x22>
|
|
}
|
|
/* if err == ERR_ABRT, 'prev' is already deallocated */
|
|
if (err == ERR_OK) {
|
|
8008468: f997 3025 ldrsb.w r3, [r7, #37] ; 0x25
|
|
800846c: 2b00 cmp r3, #0
|
|
800846e: d102 bne.n 8008476 <tcp_slowtmr+0x56a>
|
|
tcp_output(prev);
|
|
8008470: 6ab8 ldr r0, [r7, #40] ; 0x28
|
|
8008472: f004 f8bf bl 800c5f4 <tcp_output>
|
|
while (pcb != NULL) {
|
|
8008476: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008478: 2b00 cmp r3, #0
|
|
800847a: f47f ad5e bne.w 8007f3a <tcp_slowtmr+0x2e>
|
|
}
|
|
}
|
|
|
|
|
|
/* Steps through all of the TIME-WAIT PCBs. */
|
|
prev = NULL;
|
|
800847e: 2300 movs r3, #0
|
|
8008480: 62bb str r3, [r7, #40] ; 0x28
|
|
pcb = tcp_tw_pcbs;
|
|
8008482: 4b0c ldr r3, [pc, #48] ; (80084b4 <tcp_slowtmr+0x5a8>)
|
|
8008484: 681b ldr r3, [r3, #0]
|
|
8008486: 62fb str r3, [r7, #44] ; 0x2c
|
|
while (pcb != NULL) {
|
|
8008488: e069 b.n 800855e <tcp_slowtmr+0x652>
|
|
800848a: bf00 nop
|
|
800848c: 24007b6c .word 0x24007b6c
|
|
8008490: 000a4cb8 .word 0x000a4cb8
|
|
8008494: 10624dd3 .word 0x10624dd3
|
|
8008498: 000124f8 .word 0x000124f8
|
|
800849c: 24007b78 .word 0x24007b78
|
|
80084a0: 08012a08 .word 0x08012a08
|
|
80084a4: 08012e40 .word 0x08012e40
|
|
80084a8: 08012a4c .word 0x08012a4c
|
|
80084ac: 08012e6c .word 0x08012e6c
|
|
80084b0: 24007b80 .word 0x24007b80
|
|
80084b4: 24007b7c .word 0x24007b7c
|
|
LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
|
|
80084b8: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80084ba: 7d1b ldrb r3, [r3, #20]
|
|
80084bc: 2b0a cmp r3, #10
|
|
80084be: d006 beq.n 80084ce <tcp_slowtmr+0x5c2>
|
|
80084c0: 4b2b ldr r3, [pc, #172] ; (8008570 <tcp_slowtmr+0x664>)
|
|
80084c2: f240 52a1 movw r2, #1441 ; 0x5a1
|
|
80084c6: 492b ldr r1, [pc, #172] ; (8008574 <tcp_slowtmr+0x668>)
|
|
80084c8: 482b ldr r0, [pc, #172] ; (8008578 <tcp_slowtmr+0x66c>)
|
|
80084ca: f008 fb7d bl 8010bc8 <iprintf>
|
|
pcb_remove = 0;
|
|
80084ce: 2300 movs r3, #0
|
|
80084d0: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
|
|
/* Check if this PCB has stayed long enough in TIME-WAIT */
|
|
if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
|
|
80084d4: 4b29 ldr r3, [pc, #164] ; (800857c <tcp_slowtmr+0x670>)
|
|
80084d6: 681a ldr r2, [r3, #0]
|
|
80084d8: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
80084da: 6a1b ldr r3, [r3, #32]
|
|
80084dc: 1ad3 subs r3, r2, r3
|
|
80084de: 2bf0 cmp r3, #240 ; 0xf0
|
|
80084e0: d904 bls.n 80084ec <tcp_slowtmr+0x5e0>
|
|
++pcb_remove;
|
|
80084e2: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
80084e6: 3301 adds r3, #1
|
|
80084e8: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
}
|
|
|
|
/* If the PCB should be removed, do it. */
|
|
if (pcb_remove) {
|
|
80084ec: f897 3027 ldrb.w r3, [r7, #39] ; 0x27
|
|
80084f0: 2b00 cmp r3, #0
|
|
80084f2: d02f beq.n 8008554 <tcp_slowtmr+0x648>
|
|
struct tcp_pcb *pcb2;
|
|
tcp_pcb_purge(pcb);
|
|
80084f4: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
80084f6: f000 fbab bl 8008c50 <tcp_pcb_purge>
|
|
/* Remove PCB from tcp_tw_pcbs list. */
|
|
if (prev != NULL) {
|
|
80084fa: 6abb ldr r3, [r7, #40] ; 0x28
|
|
80084fc: 2b00 cmp r3, #0
|
|
80084fe: d010 beq.n 8008522 <tcp_slowtmr+0x616>
|
|
LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
|
|
8008500: 4b1f ldr r3, [pc, #124] ; (8008580 <tcp_slowtmr+0x674>)
|
|
8008502: 681b ldr r3, [r3, #0]
|
|
8008504: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8008506: 429a cmp r2, r3
|
|
8008508: d106 bne.n 8008518 <tcp_slowtmr+0x60c>
|
|
800850a: 4b19 ldr r3, [pc, #100] ; (8008570 <tcp_slowtmr+0x664>)
|
|
800850c: f240 52af movw r2, #1455 ; 0x5af
|
|
8008510: 491c ldr r1, [pc, #112] ; (8008584 <tcp_slowtmr+0x678>)
|
|
8008512: 4819 ldr r0, [pc, #100] ; (8008578 <tcp_slowtmr+0x66c>)
|
|
8008514: f008 fb58 bl 8010bc8 <iprintf>
|
|
prev->next = pcb->next;
|
|
8008518: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800851a: 68da ldr r2, [r3, #12]
|
|
800851c: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800851e: 60da str r2, [r3, #12]
|
|
8008520: e00f b.n 8008542 <tcp_slowtmr+0x636>
|
|
} else {
|
|
/* This PCB was the first. */
|
|
LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
|
|
8008522: 4b17 ldr r3, [pc, #92] ; (8008580 <tcp_slowtmr+0x674>)
|
|
8008524: 681b ldr r3, [r3, #0]
|
|
8008526: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
8008528: 429a cmp r2, r3
|
|
800852a: d006 beq.n 800853a <tcp_slowtmr+0x62e>
|
|
800852c: 4b10 ldr r3, [pc, #64] ; (8008570 <tcp_slowtmr+0x664>)
|
|
800852e: f240 52b3 movw r2, #1459 ; 0x5b3
|
|
8008532: 4915 ldr r1, [pc, #84] ; (8008588 <tcp_slowtmr+0x67c>)
|
|
8008534: 4810 ldr r0, [pc, #64] ; (8008578 <tcp_slowtmr+0x66c>)
|
|
8008536: f008 fb47 bl 8010bc8 <iprintf>
|
|
tcp_tw_pcbs = pcb->next;
|
|
800853a: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800853c: 68db ldr r3, [r3, #12]
|
|
800853e: 4a10 ldr r2, [pc, #64] ; (8008580 <tcp_slowtmr+0x674>)
|
|
8008540: 6013 str r3, [r2, #0]
|
|
}
|
|
pcb2 = pcb;
|
|
8008542: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008544: 61fb str r3, [r7, #28]
|
|
pcb = pcb->next;
|
|
8008546: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008548: 68db ldr r3, [r3, #12]
|
|
800854a: 62fb str r3, [r7, #44] ; 0x2c
|
|
tcp_free(pcb2);
|
|
800854c: 69f8 ldr r0, [r7, #28]
|
|
800854e: f7fe ffe1 bl 8007514 <tcp_free>
|
|
8008552: e004 b.n 800855e <tcp_slowtmr+0x652>
|
|
} else {
|
|
prev = pcb;
|
|
8008554: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008556: 62bb str r3, [r7, #40] ; 0x28
|
|
pcb = pcb->next;
|
|
8008558: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800855a: 68db ldr r3, [r3, #12]
|
|
800855c: 62fb str r3, [r7, #44] ; 0x2c
|
|
while (pcb != NULL) {
|
|
800855e: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
8008560: 2b00 cmp r3, #0
|
|
8008562: d1a9 bne.n 80084b8 <tcp_slowtmr+0x5ac>
|
|
}
|
|
}
|
|
}
|
|
8008564: bf00 nop
|
|
8008566: bf00 nop
|
|
8008568: 3730 adds r7, #48 ; 0x30
|
|
800856a: 46bd mov sp, r7
|
|
800856c: bdb0 pop {r4, r5, r7, pc}
|
|
800856e: bf00 nop
|
|
8008570: 08012a08 .word 0x08012a08
|
|
8008574: 08012e98 .word 0x08012e98
|
|
8008578: 08012a4c .word 0x08012a4c
|
|
800857c: 24007b6c .word 0x24007b6c
|
|
8008580: 24007b7c .word 0x24007b7c
|
|
8008584: 08012ec8 .word 0x08012ec8
|
|
8008588: 08012ef0 .word 0x08012ef0
|
|
|
|
0800858c <tcp_fasttmr>:
|
|
*
|
|
* Automatically called from tcp_tmr().
|
|
*/
|
|
void
|
|
tcp_fasttmr(void)
|
|
{
|
|
800858c: b580 push {r7, lr}
|
|
800858e: b082 sub sp, #8
|
|
8008590: af00 add r7, sp, #0
|
|
struct tcp_pcb *pcb;
|
|
|
|
++tcp_timer_ctr;
|
|
8008592: 4b2d ldr r3, [pc, #180] ; (8008648 <tcp_fasttmr+0xbc>)
|
|
8008594: 781b ldrb r3, [r3, #0]
|
|
8008596: 3301 adds r3, #1
|
|
8008598: b2da uxtb r2, r3
|
|
800859a: 4b2b ldr r3, [pc, #172] ; (8008648 <tcp_fasttmr+0xbc>)
|
|
800859c: 701a strb r2, [r3, #0]
|
|
|
|
tcp_fasttmr_start:
|
|
pcb = tcp_active_pcbs;
|
|
800859e: 4b2b ldr r3, [pc, #172] ; (800864c <tcp_fasttmr+0xc0>)
|
|
80085a0: 681b ldr r3, [r3, #0]
|
|
80085a2: 607b str r3, [r7, #4]
|
|
|
|
while (pcb != NULL) {
|
|
80085a4: e048 b.n 8008638 <tcp_fasttmr+0xac>
|
|
if (pcb->last_timer != tcp_timer_ctr) {
|
|
80085a6: 687b ldr r3, [r7, #4]
|
|
80085a8: 7f9a ldrb r2, [r3, #30]
|
|
80085aa: 4b27 ldr r3, [pc, #156] ; (8008648 <tcp_fasttmr+0xbc>)
|
|
80085ac: 781b ldrb r3, [r3, #0]
|
|
80085ae: 429a cmp r2, r3
|
|
80085b0: d03f beq.n 8008632 <tcp_fasttmr+0xa6>
|
|
struct tcp_pcb *next;
|
|
pcb->last_timer = tcp_timer_ctr;
|
|
80085b2: 4b25 ldr r3, [pc, #148] ; (8008648 <tcp_fasttmr+0xbc>)
|
|
80085b4: 781a ldrb r2, [r3, #0]
|
|
80085b6: 687b ldr r3, [r7, #4]
|
|
80085b8: 779a strb r2, [r3, #30]
|
|
/* send delayed ACKs */
|
|
if (pcb->flags & TF_ACK_DELAY) {
|
|
80085ba: 687b ldr r3, [r7, #4]
|
|
80085bc: 8b5b ldrh r3, [r3, #26]
|
|
80085be: f003 0301 and.w r3, r3, #1
|
|
80085c2: 2b00 cmp r3, #0
|
|
80085c4: d010 beq.n 80085e8 <tcp_fasttmr+0x5c>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
|
|
tcp_ack_now(pcb);
|
|
80085c6: 687b ldr r3, [r7, #4]
|
|
80085c8: 8b5b ldrh r3, [r3, #26]
|
|
80085ca: f043 0302 orr.w r3, r3, #2
|
|
80085ce: b29a uxth r2, r3
|
|
80085d0: 687b ldr r3, [r7, #4]
|
|
80085d2: 835a strh r2, [r3, #26]
|
|
tcp_output(pcb);
|
|
80085d4: 6878 ldr r0, [r7, #4]
|
|
80085d6: f004 f80d bl 800c5f4 <tcp_output>
|
|
tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
|
|
80085da: 687b ldr r3, [r7, #4]
|
|
80085dc: 8b5b ldrh r3, [r3, #26]
|
|
80085de: f023 0303 bic.w r3, r3, #3
|
|
80085e2: b29a uxth r2, r3
|
|
80085e4: 687b ldr r3, [r7, #4]
|
|
80085e6: 835a strh r2, [r3, #26]
|
|
}
|
|
/* send pending FIN */
|
|
if (pcb->flags & TF_CLOSEPEND) {
|
|
80085e8: 687b ldr r3, [r7, #4]
|
|
80085ea: 8b5b ldrh r3, [r3, #26]
|
|
80085ec: f003 0308 and.w r3, r3, #8
|
|
80085f0: 2b00 cmp r3, #0
|
|
80085f2: d009 beq.n 8008608 <tcp_fasttmr+0x7c>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: pending FIN\n"));
|
|
tcp_clear_flags(pcb, TF_CLOSEPEND);
|
|
80085f4: 687b ldr r3, [r7, #4]
|
|
80085f6: 8b5b ldrh r3, [r3, #26]
|
|
80085f8: f023 0308 bic.w r3, r3, #8
|
|
80085fc: b29a uxth r2, r3
|
|
80085fe: 687b ldr r3, [r7, #4]
|
|
8008600: 835a strh r2, [r3, #26]
|
|
tcp_close_shutdown_fin(pcb);
|
|
8008602: 6878 ldr r0, [r7, #4]
|
|
8008604: f7ff f91a bl 800783c <tcp_close_shutdown_fin>
|
|
}
|
|
|
|
next = pcb->next;
|
|
8008608: 687b ldr r3, [r7, #4]
|
|
800860a: 68db ldr r3, [r3, #12]
|
|
800860c: 603b str r3, [r7, #0]
|
|
|
|
/* If there is data which was previously "refused" by upper layer */
|
|
if (pcb->refused_data != NULL) {
|
|
800860e: 687b ldr r3, [r7, #4]
|
|
8008610: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
8008612: 2b00 cmp r3, #0
|
|
8008614: d00a beq.n 800862c <tcp_fasttmr+0xa0>
|
|
tcp_active_pcbs_changed = 0;
|
|
8008616: 4b0e ldr r3, [pc, #56] ; (8008650 <tcp_fasttmr+0xc4>)
|
|
8008618: 2200 movs r2, #0
|
|
800861a: 701a strb r2, [r3, #0]
|
|
tcp_process_refused_data(pcb);
|
|
800861c: 6878 ldr r0, [r7, #4]
|
|
800861e: f000 f819 bl 8008654 <tcp_process_refused_data>
|
|
if (tcp_active_pcbs_changed) {
|
|
8008622: 4b0b ldr r3, [pc, #44] ; (8008650 <tcp_fasttmr+0xc4>)
|
|
8008624: 781b ldrb r3, [r3, #0]
|
|
8008626: 2b00 cmp r3, #0
|
|
8008628: d000 beq.n 800862c <tcp_fasttmr+0xa0>
|
|
/* application callback has changed the pcb list: restart the loop */
|
|
goto tcp_fasttmr_start;
|
|
800862a: e7b8 b.n 800859e <tcp_fasttmr+0x12>
|
|
}
|
|
}
|
|
pcb = next;
|
|
800862c: 683b ldr r3, [r7, #0]
|
|
800862e: 607b str r3, [r7, #4]
|
|
8008630: e002 b.n 8008638 <tcp_fasttmr+0xac>
|
|
} else {
|
|
pcb = pcb->next;
|
|
8008632: 687b ldr r3, [r7, #4]
|
|
8008634: 68db ldr r3, [r3, #12]
|
|
8008636: 607b str r3, [r7, #4]
|
|
while (pcb != NULL) {
|
|
8008638: 687b ldr r3, [r7, #4]
|
|
800863a: 2b00 cmp r3, #0
|
|
800863c: d1b3 bne.n 80085a6 <tcp_fasttmr+0x1a>
|
|
}
|
|
}
|
|
}
|
|
800863e: bf00 nop
|
|
8008640: bf00 nop
|
|
8008642: 3708 adds r7, #8
|
|
8008644: 46bd mov sp, r7
|
|
8008646: bd80 pop {r7, pc}
|
|
8008648: 24007b82 .word 0x24007b82
|
|
800864c: 24007b78 .word 0x24007b78
|
|
8008650: 24007b80 .word 0x24007b80
|
|
|
|
08008654 <tcp_process_refused_data>:
|
|
}
|
|
|
|
/** Pass pcb->refused_data to the recv callback */
|
|
err_t
|
|
tcp_process_refused_data(struct tcp_pcb *pcb)
|
|
{
|
|
8008654: b590 push {r4, r7, lr}
|
|
8008656: b085 sub sp, #20
|
|
8008658: af00 add r7, sp, #0
|
|
800865a: 6078 str r0, [r7, #4]
|
|
#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
|
|
struct pbuf *rest;
|
|
#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
|
|
LWIP_ERROR("tcp_process_refused_data: invalid pcb", pcb != NULL, return ERR_ARG);
|
|
800865c: 687b ldr r3, [r7, #4]
|
|
800865e: 2b00 cmp r3, #0
|
|
8008660: d109 bne.n 8008676 <tcp_process_refused_data+0x22>
|
|
8008662: 4b37 ldr r3, [pc, #220] ; (8008740 <tcp_process_refused_data+0xec>)
|
|
8008664: f240 6209 movw r2, #1545 ; 0x609
|
|
8008668: 4936 ldr r1, [pc, #216] ; (8008744 <tcp_process_refused_data+0xf0>)
|
|
800866a: 4837 ldr r0, [pc, #220] ; (8008748 <tcp_process_refused_data+0xf4>)
|
|
800866c: f008 faac bl 8010bc8 <iprintf>
|
|
8008670: f06f 030f mvn.w r3, #15
|
|
8008674: e060 b.n 8008738 <tcp_process_refused_data+0xe4>
|
|
#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
|
|
while (pcb->refused_data != NULL)
|
|
#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
{
|
|
err_t err;
|
|
u8_t refused_flags = pcb->refused_data->flags;
|
|
8008676: 687b ldr r3, [r7, #4]
|
|
8008678: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
800867a: 7b5b ldrb r3, [r3, #13]
|
|
800867c: 73bb strb r3, [r7, #14]
|
|
/* set pcb->refused_data to NULL in case the callback frees it and then
|
|
closes the pcb */
|
|
struct pbuf *refused_data = pcb->refused_data;
|
|
800867e: 687b ldr r3, [r7, #4]
|
|
8008680: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
8008682: 60bb str r3, [r7, #8]
|
|
#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
|
|
pbuf_split_64k(refused_data, &rest);
|
|
pcb->refused_data = rest;
|
|
#else /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
pcb->refused_data = NULL;
|
|
8008684: 687b ldr r3, [r7, #4]
|
|
8008686: 2200 movs r2, #0
|
|
8008688: 679a str r2, [r3, #120] ; 0x78
|
|
#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
/* Notify again application with data previously received. */
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
|
|
TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
|
|
800868a: 687b ldr r3, [r7, #4]
|
|
800868c: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
8008690: 2b00 cmp r3, #0
|
|
8008692: d00b beq.n 80086ac <tcp_process_refused_data+0x58>
|
|
8008694: 687b ldr r3, [r7, #4]
|
|
8008696: f8d3 4084 ldr.w r4, [r3, #132] ; 0x84
|
|
800869a: 687b ldr r3, [r7, #4]
|
|
800869c: 6918 ldr r0, [r3, #16]
|
|
800869e: 2300 movs r3, #0
|
|
80086a0: 68ba ldr r2, [r7, #8]
|
|
80086a2: 6879 ldr r1, [r7, #4]
|
|
80086a4: 47a0 blx r4
|
|
80086a6: 4603 mov r3, r0
|
|
80086a8: 73fb strb r3, [r7, #15]
|
|
80086aa: e007 b.n 80086bc <tcp_process_refused_data+0x68>
|
|
80086ac: 2300 movs r3, #0
|
|
80086ae: 68ba ldr r2, [r7, #8]
|
|
80086b0: 6879 ldr r1, [r7, #4]
|
|
80086b2: 2000 movs r0, #0
|
|
80086b4: f000 f8a4 bl 8008800 <tcp_recv_null>
|
|
80086b8: 4603 mov r3, r0
|
|
80086ba: 73fb strb r3, [r7, #15]
|
|
if (err == ERR_OK) {
|
|
80086bc: f997 300f ldrsb.w r3, [r7, #15]
|
|
80086c0: 2b00 cmp r3, #0
|
|
80086c2: d12a bne.n 800871a <tcp_process_refused_data+0xc6>
|
|
/* did refused_data include a FIN? */
|
|
if ((refused_flags & PBUF_FLAG_TCP_FIN)
|
|
80086c4: 7bbb ldrb r3, [r7, #14]
|
|
80086c6: f003 0320 and.w r3, r3, #32
|
|
80086ca: 2b00 cmp r3, #0
|
|
80086cc: d033 beq.n 8008736 <tcp_process_refused_data+0xe2>
|
|
&& (rest == NULL)
|
|
#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
) {
|
|
/* correct rcv_wnd as the application won't call tcp_recved()
|
|
for the FIN's seqno */
|
|
if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
|
|
80086ce: 687b ldr r3, [r7, #4]
|
|
80086d0: 8d1b ldrh r3, [r3, #40] ; 0x28
|
|
80086d2: f5b3 6f06 cmp.w r3, #2144 ; 0x860
|
|
80086d6: d005 beq.n 80086e4 <tcp_process_refused_data+0x90>
|
|
pcb->rcv_wnd++;
|
|
80086d8: 687b ldr r3, [r7, #4]
|
|
80086da: 8d1b ldrh r3, [r3, #40] ; 0x28
|
|
80086dc: 3301 adds r3, #1
|
|
80086de: b29a uxth r2, r3
|
|
80086e0: 687b ldr r3, [r7, #4]
|
|
80086e2: 851a strh r2, [r3, #40] ; 0x28
|
|
}
|
|
TCP_EVENT_CLOSED(pcb, err);
|
|
80086e4: 687b ldr r3, [r7, #4]
|
|
80086e6: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
80086ea: 2b00 cmp r3, #0
|
|
80086ec: d00b beq.n 8008706 <tcp_process_refused_data+0xb2>
|
|
80086ee: 687b ldr r3, [r7, #4]
|
|
80086f0: f8d3 4084 ldr.w r4, [r3, #132] ; 0x84
|
|
80086f4: 687b ldr r3, [r7, #4]
|
|
80086f6: 6918 ldr r0, [r3, #16]
|
|
80086f8: 2300 movs r3, #0
|
|
80086fa: 2200 movs r2, #0
|
|
80086fc: 6879 ldr r1, [r7, #4]
|
|
80086fe: 47a0 blx r4
|
|
8008700: 4603 mov r3, r0
|
|
8008702: 73fb strb r3, [r7, #15]
|
|
8008704: e001 b.n 800870a <tcp_process_refused_data+0xb6>
|
|
8008706: 2300 movs r3, #0
|
|
8008708: 73fb strb r3, [r7, #15]
|
|
if (err == ERR_ABRT) {
|
|
800870a: f997 300f ldrsb.w r3, [r7, #15]
|
|
800870e: f113 0f0d cmn.w r3, #13
|
|
8008712: d110 bne.n 8008736 <tcp_process_refused_data+0xe2>
|
|
return ERR_ABRT;
|
|
8008714: f06f 030c mvn.w r3, #12
|
|
8008718: e00e b.n 8008738 <tcp_process_refused_data+0xe4>
|
|
}
|
|
}
|
|
} else if (err == ERR_ABRT) {
|
|
800871a: f997 300f ldrsb.w r3, [r7, #15]
|
|
800871e: f113 0f0d cmn.w r3, #13
|
|
8008722: d102 bne.n 800872a <tcp_process_refused_data+0xd6>
|
|
/* if err == ERR_ABRT, 'pcb' is already deallocated */
|
|
/* Drop incoming packets because pcb is "full" (only if the incoming
|
|
segment contains data). */
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n"));
|
|
return ERR_ABRT;
|
|
8008724: f06f 030c mvn.w r3, #12
|
|
8008728: e006 b.n 8008738 <tcp_process_refused_data+0xe4>
|
|
#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
|
|
if (rest != NULL) {
|
|
pbuf_cat(refused_data, rest);
|
|
}
|
|
#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
pcb->refused_data = refused_data;
|
|
800872a: 687b ldr r3, [r7, #4]
|
|
800872c: 68ba ldr r2, [r7, #8]
|
|
800872e: 679a str r2, [r3, #120] ; 0x78
|
|
return ERR_INPROGRESS;
|
|
8008730: f06f 0304 mvn.w r3, #4
|
|
8008734: e000 b.n 8008738 <tcp_process_refused_data+0xe4>
|
|
}
|
|
}
|
|
return ERR_OK;
|
|
8008736: 2300 movs r3, #0
|
|
}
|
|
8008738: 4618 mov r0, r3
|
|
800873a: 3714 adds r7, #20
|
|
800873c: 46bd mov sp, r7
|
|
800873e: bd90 pop {r4, r7, pc}
|
|
8008740: 08012a08 .word 0x08012a08
|
|
8008744: 08012f18 .word 0x08012f18
|
|
8008748: 08012a4c .word 0x08012a4c
|
|
|
|
0800874c <tcp_segs_free>:
|
|
*
|
|
* @param seg tcp_seg list of TCP segments to free
|
|
*/
|
|
void
|
|
tcp_segs_free(struct tcp_seg *seg)
|
|
{
|
|
800874c: b580 push {r7, lr}
|
|
800874e: b084 sub sp, #16
|
|
8008750: af00 add r7, sp, #0
|
|
8008752: 6078 str r0, [r7, #4]
|
|
while (seg != NULL) {
|
|
8008754: e007 b.n 8008766 <tcp_segs_free+0x1a>
|
|
struct tcp_seg *next = seg->next;
|
|
8008756: 687b ldr r3, [r7, #4]
|
|
8008758: 681b ldr r3, [r3, #0]
|
|
800875a: 60fb str r3, [r7, #12]
|
|
tcp_seg_free(seg);
|
|
800875c: 6878 ldr r0, [r7, #4]
|
|
800875e: f000 f80a bl 8008776 <tcp_seg_free>
|
|
seg = next;
|
|
8008762: 68fb ldr r3, [r7, #12]
|
|
8008764: 607b str r3, [r7, #4]
|
|
while (seg != NULL) {
|
|
8008766: 687b ldr r3, [r7, #4]
|
|
8008768: 2b00 cmp r3, #0
|
|
800876a: d1f4 bne.n 8008756 <tcp_segs_free+0xa>
|
|
}
|
|
}
|
|
800876c: bf00 nop
|
|
800876e: bf00 nop
|
|
8008770: 3710 adds r7, #16
|
|
8008772: 46bd mov sp, r7
|
|
8008774: bd80 pop {r7, pc}
|
|
|
|
08008776 <tcp_seg_free>:
|
|
*
|
|
* @param seg single tcp_seg to free
|
|
*/
|
|
void
|
|
tcp_seg_free(struct tcp_seg *seg)
|
|
{
|
|
8008776: b580 push {r7, lr}
|
|
8008778: b082 sub sp, #8
|
|
800877a: af00 add r7, sp, #0
|
|
800877c: 6078 str r0, [r7, #4]
|
|
if (seg != NULL) {
|
|
800877e: 687b ldr r3, [r7, #4]
|
|
8008780: 2b00 cmp r3, #0
|
|
8008782: d00c beq.n 800879e <tcp_seg_free+0x28>
|
|
if (seg->p != NULL) {
|
|
8008784: 687b ldr r3, [r7, #4]
|
|
8008786: 685b ldr r3, [r3, #4]
|
|
8008788: 2b00 cmp r3, #0
|
|
800878a: d004 beq.n 8008796 <tcp_seg_free+0x20>
|
|
pbuf_free(seg->p);
|
|
800878c: 687b ldr r3, [r7, #4]
|
|
800878e: 685b ldr r3, [r3, #4]
|
|
8008790: 4618 mov r0, r3
|
|
8008792: f7fe fc1f bl 8006fd4 <pbuf_free>
|
|
#if TCP_DEBUG
|
|
seg->p = NULL;
|
|
#endif /* TCP_DEBUG */
|
|
}
|
|
memp_free(MEMP_TCP_SEG, seg);
|
|
8008796: 6879 ldr r1, [r7, #4]
|
|
8008798: 2003 movs r0, #3
|
|
800879a: f7fd fcaf bl 80060fc <memp_free>
|
|
}
|
|
}
|
|
800879e: bf00 nop
|
|
80087a0: 3708 adds r7, #8
|
|
80087a2: 46bd mov sp, r7
|
|
80087a4: bd80 pop {r7, pc}
|
|
...
|
|
|
|
080087a8 <tcp_seg_copy>:
|
|
* @param seg the old tcp_seg
|
|
* @return a copy of seg
|
|
*/
|
|
struct tcp_seg *
|
|
tcp_seg_copy(struct tcp_seg *seg)
|
|
{
|
|
80087a8: b580 push {r7, lr}
|
|
80087aa: b084 sub sp, #16
|
|
80087ac: af00 add r7, sp, #0
|
|
80087ae: 6078 str r0, [r7, #4]
|
|
struct tcp_seg *cseg;
|
|
|
|
LWIP_ASSERT("tcp_seg_copy: invalid seg", seg != NULL);
|
|
80087b0: 687b ldr r3, [r7, #4]
|
|
80087b2: 2b00 cmp r3, #0
|
|
80087b4: d106 bne.n 80087c4 <tcp_seg_copy+0x1c>
|
|
80087b6: 4b0f ldr r3, [pc, #60] ; (80087f4 <tcp_seg_copy+0x4c>)
|
|
80087b8: f240 6282 movw r2, #1666 ; 0x682
|
|
80087bc: 490e ldr r1, [pc, #56] ; (80087f8 <tcp_seg_copy+0x50>)
|
|
80087be: 480f ldr r0, [pc, #60] ; (80087fc <tcp_seg_copy+0x54>)
|
|
80087c0: f008 fa02 bl 8010bc8 <iprintf>
|
|
|
|
cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG);
|
|
80087c4: 2003 movs r0, #3
|
|
80087c6: f7fd fc29 bl 800601c <memp_malloc>
|
|
80087ca: 60f8 str r0, [r7, #12]
|
|
if (cseg == NULL) {
|
|
80087cc: 68fb ldr r3, [r7, #12]
|
|
80087ce: 2b00 cmp r3, #0
|
|
80087d0: d101 bne.n 80087d6 <tcp_seg_copy+0x2e>
|
|
return NULL;
|
|
80087d2: 2300 movs r3, #0
|
|
80087d4: e00a b.n 80087ec <tcp_seg_copy+0x44>
|
|
}
|
|
SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg));
|
|
80087d6: 2214 movs r2, #20
|
|
80087d8: 6879 ldr r1, [r7, #4]
|
|
80087da: 68f8 ldr r0, [r7, #12]
|
|
80087dc: f008 fbd5 bl 8010f8a <memcpy>
|
|
pbuf_ref(cseg->p);
|
|
80087e0: 68fb ldr r3, [r7, #12]
|
|
80087e2: 685b ldr r3, [r3, #4]
|
|
80087e4: 4618 mov r0, r3
|
|
80087e6: f7fe fc95 bl 8007114 <pbuf_ref>
|
|
return cseg;
|
|
80087ea: 68fb ldr r3, [r7, #12]
|
|
}
|
|
80087ec: 4618 mov r0, r3
|
|
80087ee: 3710 adds r7, #16
|
|
80087f0: 46bd mov sp, r7
|
|
80087f2: bd80 pop {r7, pc}
|
|
80087f4: 08012a08 .word 0x08012a08
|
|
80087f8: 08012f5c .word 0x08012f5c
|
|
80087fc: 08012a4c .word 0x08012a4c
|
|
|
|
08008800 <tcp_recv_null>:
|
|
* Default receive callback that is called if the user didn't register
|
|
* a recv callback for the pcb.
|
|
*/
|
|
err_t
|
|
tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
|
|
{
|
|
8008800: b580 push {r7, lr}
|
|
8008802: b084 sub sp, #16
|
|
8008804: af00 add r7, sp, #0
|
|
8008806: 60f8 str r0, [r7, #12]
|
|
8008808: 60b9 str r1, [r7, #8]
|
|
800880a: 607a str r2, [r7, #4]
|
|
800880c: 70fb strb r3, [r7, #3]
|
|
LWIP_UNUSED_ARG(arg);
|
|
|
|
LWIP_ERROR("tcp_recv_null: invalid pcb", pcb != NULL, return ERR_ARG);
|
|
800880e: 68bb ldr r3, [r7, #8]
|
|
8008810: 2b00 cmp r3, #0
|
|
8008812: d109 bne.n 8008828 <tcp_recv_null+0x28>
|
|
8008814: 4b12 ldr r3, [pc, #72] ; (8008860 <tcp_recv_null+0x60>)
|
|
8008816: f44f 62d3 mov.w r2, #1688 ; 0x698
|
|
800881a: 4912 ldr r1, [pc, #72] ; (8008864 <tcp_recv_null+0x64>)
|
|
800881c: 4812 ldr r0, [pc, #72] ; (8008868 <tcp_recv_null+0x68>)
|
|
800881e: f008 f9d3 bl 8010bc8 <iprintf>
|
|
8008822: f06f 030f mvn.w r3, #15
|
|
8008826: e016 b.n 8008856 <tcp_recv_null+0x56>
|
|
|
|
if (p != NULL) {
|
|
8008828: 687b ldr r3, [r7, #4]
|
|
800882a: 2b00 cmp r3, #0
|
|
800882c: d009 beq.n 8008842 <tcp_recv_null+0x42>
|
|
tcp_recved(pcb, p->tot_len);
|
|
800882e: 687b ldr r3, [r7, #4]
|
|
8008830: 891b ldrh r3, [r3, #8]
|
|
8008832: 4619 mov r1, r3
|
|
8008834: 68b8 ldr r0, [r7, #8]
|
|
8008836: f7ff f9bb bl 8007bb0 <tcp_recved>
|
|
pbuf_free(p);
|
|
800883a: 6878 ldr r0, [r7, #4]
|
|
800883c: f7fe fbca bl 8006fd4 <pbuf_free>
|
|
8008840: e008 b.n 8008854 <tcp_recv_null+0x54>
|
|
} else if (err == ERR_OK) {
|
|
8008842: f997 3003 ldrsb.w r3, [r7, #3]
|
|
8008846: 2b00 cmp r3, #0
|
|
8008848: d104 bne.n 8008854 <tcp_recv_null+0x54>
|
|
return tcp_close(pcb);
|
|
800884a: 68b8 ldr r0, [r7, #8]
|
|
800884c: f7ff f860 bl 8007910 <tcp_close>
|
|
8008850: 4603 mov r3, r0
|
|
8008852: e000 b.n 8008856 <tcp_recv_null+0x56>
|
|
}
|
|
return ERR_OK;
|
|
8008854: 2300 movs r3, #0
|
|
}
|
|
8008856: 4618 mov r0, r3
|
|
8008858: 3710 adds r7, #16
|
|
800885a: 46bd mov sp, r7
|
|
800885c: bd80 pop {r7, pc}
|
|
800885e: bf00 nop
|
|
8008860: 08012a08 .word 0x08012a08
|
|
8008864: 08012f78 .word 0x08012f78
|
|
8008868: 08012a4c .word 0x08012a4c
|
|
|
|
0800886c <tcp_kill_prio>:
|
|
*
|
|
* @param prio minimum priority
|
|
*/
|
|
static void
|
|
tcp_kill_prio(u8_t prio)
|
|
{
|
|
800886c: b580 push {r7, lr}
|
|
800886e: b086 sub sp, #24
|
|
8008870: af00 add r7, sp, #0
|
|
8008872: 4603 mov r3, r0
|
|
8008874: 71fb strb r3, [r7, #7]
|
|
struct tcp_pcb *pcb, *inactive;
|
|
u32_t inactivity;
|
|
u8_t mprio;
|
|
|
|
mprio = LWIP_MIN(TCP_PRIO_MAX, prio);
|
|
8008876: f997 3007 ldrsb.w r3, [r7, #7]
|
|
800887a: 2b00 cmp r3, #0
|
|
800887c: db01 blt.n 8008882 <tcp_kill_prio+0x16>
|
|
800887e: 79fb ldrb r3, [r7, #7]
|
|
8008880: e000 b.n 8008884 <tcp_kill_prio+0x18>
|
|
8008882: 237f movs r3, #127 ; 0x7f
|
|
8008884: 72fb strb r3, [r7, #11]
|
|
|
|
/* We want to kill connections with a lower prio, so bail out if
|
|
* supplied prio is 0 - there can never be a lower prio
|
|
*/
|
|
if (mprio == 0) {
|
|
8008886: 7afb ldrb r3, [r7, #11]
|
|
8008888: 2b00 cmp r3, #0
|
|
800888a: d034 beq.n 80088f6 <tcp_kill_prio+0x8a>
|
|
/* We only want kill connections with a lower prio, so decrement prio by one
|
|
* and start searching for oldest connection with same or lower priority than mprio.
|
|
* We want to find the connections with the lowest possible prio, and among
|
|
* these the one with the longest inactivity time.
|
|
*/
|
|
mprio--;
|
|
800888c: 7afb ldrb r3, [r7, #11]
|
|
800888e: 3b01 subs r3, #1
|
|
8008890: 72fb strb r3, [r7, #11]
|
|
|
|
inactivity = 0;
|
|
8008892: 2300 movs r3, #0
|
|
8008894: 60fb str r3, [r7, #12]
|
|
inactive = NULL;
|
|
8008896: 2300 movs r3, #0
|
|
8008898: 613b str r3, [r7, #16]
|
|
for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
800889a: 4b19 ldr r3, [pc, #100] ; (8008900 <tcp_kill_prio+0x94>)
|
|
800889c: 681b ldr r3, [r3, #0]
|
|
800889e: 617b str r3, [r7, #20]
|
|
80088a0: e01f b.n 80088e2 <tcp_kill_prio+0x76>
|
|
/* lower prio is always a kill candidate */
|
|
if ((pcb->prio < mprio) ||
|
|
80088a2: 697b ldr r3, [r7, #20]
|
|
80088a4: 7d5b ldrb r3, [r3, #21]
|
|
80088a6: 7afa ldrb r2, [r7, #11]
|
|
80088a8: 429a cmp r2, r3
|
|
80088aa: d80c bhi.n 80088c6 <tcp_kill_prio+0x5a>
|
|
/* longer inactivity is also a kill candidate */
|
|
((pcb->prio == mprio) && ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity))) {
|
|
80088ac: 697b ldr r3, [r7, #20]
|
|
80088ae: 7d5b ldrb r3, [r3, #21]
|
|
if ((pcb->prio < mprio) ||
|
|
80088b0: 7afa ldrb r2, [r7, #11]
|
|
80088b2: 429a cmp r2, r3
|
|
80088b4: d112 bne.n 80088dc <tcp_kill_prio+0x70>
|
|
((pcb->prio == mprio) && ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity))) {
|
|
80088b6: 4b13 ldr r3, [pc, #76] ; (8008904 <tcp_kill_prio+0x98>)
|
|
80088b8: 681a ldr r2, [r3, #0]
|
|
80088ba: 697b ldr r3, [r7, #20]
|
|
80088bc: 6a1b ldr r3, [r3, #32]
|
|
80088be: 1ad3 subs r3, r2, r3
|
|
80088c0: 68fa ldr r2, [r7, #12]
|
|
80088c2: 429a cmp r2, r3
|
|
80088c4: d80a bhi.n 80088dc <tcp_kill_prio+0x70>
|
|
inactivity = tcp_ticks - pcb->tmr;
|
|
80088c6: 4b0f ldr r3, [pc, #60] ; (8008904 <tcp_kill_prio+0x98>)
|
|
80088c8: 681a ldr r2, [r3, #0]
|
|
80088ca: 697b ldr r3, [r7, #20]
|
|
80088cc: 6a1b ldr r3, [r3, #32]
|
|
80088ce: 1ad3 subs r3, r2, r3
|
|
80088d0: 60fb str r3, [r7, #12]
|
|
inactive = pcb;
|
|
80088d2: 697b ldr r3, [r7, #20]
|
|
80088d4: 613b str r3, [r7, #16]
|
|
mprio = pcb->prio;
|
|
80088d6: 697b ldr r3, [r7, #20]
|
|
80088d8: 7d5b ldrb r3, [r3, #21]
|
|
80088da: 72fb strb r3, [r7, #11]
|
|
for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
80088dc: 697b ldr r3, [r7, #20]
|
|
80088de: 68db ldr r3, [r3, #12]
|
|
80088e0: 617b str r3, [r7, #20]
|
|
80088e2: 697b ldr r3, [r7, #20]
|
|
80088e4: 2b00 cmp r3, #0
|
|
80088e6: d1dc bne.n 80088a2 <tcp_kill_prio+0x36>
|
|
}
|
|
}
|
|
if (inactive != NULL) {
|
|
80088e8: 693b ldr r3, [r7, #16]
|
|
80088ea: 2b00 cmp r3, #0
|
|
80088ec: d004 beq.n 80088f8 <tcp_kill_prio+0x8c>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n",
|
|
(void *)inactive, inactivity));
|
|
tcp_abort(inactive);
|
|
80088ee: 6938 ldr r0, [r7, #16]
|
|
80088f0: f7ff f8f8 bl 8007ae4 <tcp_abort>
|
|
80088f4: e000 b.n 80088f8 <tcp_kill_prio+0x8c>
|
|
return;
|
|
80088f6: bf00 nop
|
|
}
|
|
}
|
|
80088f8: 3718 adds r7, #24
|
|
80088fa: 46bd mov sp, r7
|
|
80088fc: bd80 pop {r7, pc}
|
|
80088fe: bf00 nop
|
|
8008900: 24007b78 .word 0x24007b78
|
|
8008904: 24007b6c .word 0x24007b6c
|
|
|
|
08008908 <tcp_kill_state>:
|
|
* Kills the oldest connection that is in specific state.
|
|
* Called from tcp_alloc() for LAST_ACK and CLOSING if no more connections are available.
|
|
*/
|
|
static void
|
|
tcp_kill_state(enum tcp_state state)
|
|
{
|
|
8008908: b580 push {r7, lr}
|
|
800890a: b086 sub sp, #24
|
|
800890c: af00 add r7, sp, #0
|
|
800890e: 4603 mov r3, r0
|
|
8008910: 71fb strb r3, [r7, #7]
|
|
struct tcp_pcb *pcb, *inactive;
|
|
u32_t inactivity;
|
|
|
|
LWIP_ASSERT("invalid state", (state == CLOSING) || (state == LAST_ACK));
|
|
8008912: 79fb ldrb r3, [r7, #7]
|
|
8008914: 2b08 cmp r3, #8
|
|
8008916: d009 beq.n 800892c <tcp_kill_state+0x24>
|
|
8008918: 79fb ldrb r3, [r7, #7]
|
|
800891a: 2b09 cmp r3, #9
|
|
800891c: d006 beq.n 800892c <tcp_kill_state+0x24>
|
|
800891e: 4b1a ldr r3, [pc, #104] ; (8008988 <tcp_kill_state+0x80>)
|
|
8008920: f240 62dd movw r2, #1757 ; 0x6dd
|
|
8008924: 4919 ldr r1, [pc, #100] ; (800898c <tcp_kill_state+0x84>)
|
|
8008926: 481a ldr r0, [pc, #104] ; (8008990 <tcp_kill_state+0x88>)
|
|
8008928: f008 f94e bl 8010bc8 <iprintf>
|
|
|
|
inactivity = 0;
|
|
800892c: 2300 movs r3, #0
|
|
800892e: 60fb str r3, [r7, #12]
|
|
inactive = NULL;
|
|
8008930: 2300 movs r3, #0
|
|
8008932: 613b str r3, [r7, #16]
|
|
/* Go through the list of active pcbs and get the oldest pcb that is in state
|
|
CLOSING/LAST_ACK. */
|
|
for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
8008934: 4b17 ldr r3, [pc, #92] ; (8008994 <tcp_kill_state+0x8c>)
|
|
8008936: 681b ldr r3, [r3, #0]
|
|
8008938: 617b str r3, [r7, #20]
|
|
800893a: e017 b.n 800896c <tcp_kill_state+0x64>
|
|
if (pcb->state == state) {
|
|
800893c: 697b ldr r3, [r7, #20]
|
|
800893e: 7d1b ldrb r3, [r3, #20]
|
|
8008940: 79fa ldrb r2, [r7, #7]
|
|
8008942: 429a cmp r2, r3
|
|
8008944: d10f bne.n 8008966 <tcp_kill_state+0x5e>
|
|
if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
|
|
8008946: 4b14 ldr r3, [pc, #80] ; (8008998 <tcp_kill_state+0x90>)
|
|
8008948: 681a ldr r2, [r3, #0]
|
|
800894a: 697b ldr r3, [r7, #20]
|
|
800894c: 6a1b ldr r3, [r3, #32]
|
|
800894e: 1ad3 subs r3, r2, r3
|
|
8008950: 68fa ldr r2, [r7, #12]
|
|
8008952: 429a cmp r2, r3
|
|
8008954: d807 bhi.n 8008966 <tcp_kill_state+0x5e>
|
|
inactivity = tcp_ticks - pcb->tmr;
|
|
8008956: 4b10 ldr r3, [pc, #64] ; (8008998 <tcp_kill_state+0x90>)
|
|
8008958: 681a ldr r2, [r3, #0]
|
|
800895a: 697b ldr r3, [r7, #20]
|
|
800895c: 6a1b ldr r3, [r3, #32]
|
|
800895e: 1ad3 subs r3, r2, r3
|
|
8008960: 60fb str r3, [r7, #12]
|
|
inactive = pcb;
|
|
8008962: 697b ldr r3, [r7, #20]
|
|
8008964: 613b str r3, [r7, #16]
|
|
for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
8008966: 697b ldr r3, [r7, #20]
|
|
8008968: 68db ldr r3, [r3, #12]
|
|
800896a: 617b str r3, [r7, #20]
|
|
800896c: 697b ldr r3, [r7, #20]
|
|
800896e: 2b00 cmp r3, #0
|
|
8008970: d1e4 bne.n 800893c <tcp_kill_state+0x34>
|
|
}
|
|
}
|
|
}
|
|
if (inactive != NULL) {
|
|
8008972: 693b ldr r3, [r7, #16]
|
|
8008974: 2b00 cmp r3, #0
|
|
8008976: d003 beq.n 8008980 <tcp_kill_state+0x78>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_closing: killing oldest %s PCB %p (%"S32_F")\n",
|
|
tcp_state_str[state], (void *)inactive, inactivity));
|
|
/* Don't send a RST, since no data is lost. */
|
|
tcp_abandon(inactive, 0);
|
|
8008978: 2100 movs r1, #0
|
|
800897a: 6938 ldr r0, [r7, #16]
|
|
800897c: f7fe fff4 bl 8007968 <tcp_abandon>
|
|
}
|
|
}
|
|
8008980: bf00 nop
|
|
8008982: 3718 adds r7, #24
|
|
8008984: 46bd mov sp, r7
|
|
8008986: bd80 pop {r7, pc}
|
|
8008988: 08012a08 .word 0x08012a08
|
|
800898c: 08012f94 .word 0x08012f94
|
|
8008990: 08012a4c .word 0x08012a4c
|
|
8008994: 24007b78 .word 0x24007b78
|
|
8008998: 24007b6c .word 0x24007b6c
|
|
|
|
0800899c <tcp_kill_timewait>:
|
|
* Kills the oldest connection that is in TIME_WAIT state.
|
|
* Called from tcp_alloc() if no more connections are available.
|
|
*/
|
|
static void
|
|
tcp_kill_timewait(void)
|
|
{
|
|
800899c: b580 push {r7, lr}
|
|
800899e: b084 sub sp, #16
|
|
80089a0: af00 add r7, sp, #0
|
|
struct tcp_pcb *pcb, *inactive;
|
|
u32_t inactivity;
|
|
|
|
inactivity = 0;
|
|
80089a2: 2300 movs r3, #0
|
|
80089a4: 607b str r3, [r7, #4]
|
|
inactive = NULL;
|
|
80089a6: 2300 movs r3, #0
|
|
80089a8: 60bb str r3, [r7, #8]
|
|
/* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
|
|
for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
80089aa: 4b12 ldr r3, [pc, #72] ; (80089f4 <tcp_kill_timewait+0x58>)
|
|
80089ac: 681b ldr r3, [r3, #0]
|
|
80089ae: 60fb str r3, [r7, #12]
|
|
80089b0: e012 b.n 80089d8 <tcp_kill_timewait+0x3c>
|
|
if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
|
|
80089b2: 4b11 ldr r3, [pc, #68] ; (80089f8 <tcp_kill_timewait+0x5c>)
|
|
80089b4: 681a ldr r2, [r3, #0]
|
|
80089b6: 68fb ldr r3, [r7, #12]
|
|
80089b8: 6a1b ldr r3, [r3, #32]
|
|
80089ba: 1ad3 subs r3, r2, r3
|
|
80089bc: 687a ldr r2, [r7, #4]
|
|
80089be: 429a cmp r2, r3
|
|
80089c0: d807 bhi.n 80089d2 <tcp_kill_timewait+0x36>
|
|
inactivity = tcp_ticks - pcb->tmr;
|
|
80089c2: 4b0d ldr r3, [pc, #52] ; (80089f8 <tcp_kill_timewait+0x5c>)
|
|
80089c4: 681a ldr r2, [r3, #0]
|
|
80089c6: 68fb ldr r3, [r7, #12]
|
|
80089c8: 6a1b ldr r3, [r3, #32]
|
|
80089ca: 1ad3 subs r3, r2, r3
|
|
80089cc: 607b str r3, [r7, #4]
|
|
inactive = pcb;
|
|
80089ce: 68fb ldr r3, [r7, #12]
|
|
80089d0: 60bb str r3, [r7, #8]
|
|
for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
80089d2: 68fb ldr r3, [r7, #12]
|
|
80089d4: 68db ldr r3, [r3, #12]
|
|
80089d6: 60fb str r3, [r7, #12]
|
|
80089d8: 68fb ldr r3, [r7, #12]
|
|
80089da: 2b00 cmp r3, #0
|
|
80089dc: d1e9 bne.n 80089b2 <tcp_kill_timewait+0x16>
|
|
}
|
|
}
|
|
if (inactive != NULL) {
|
|
80089de: 68bb ldr r3, [r7, #8]
|
|
80089e0: 2b00 cmp r3, #0
|
|
80089e2: d002 beq.n 80089ea <tcp_kill_timewait+0x4e>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
|
|
(void *)inactive, inactivity));
|
|
tcp_abort(inactive);
|
|
80089e4: 68b8 ldr r0, [r7, #8]
|
|
80089e6: f7ff f87d bl 8007ae4 <tcp_abort>
|
|
}
|
|
}
|
|
80089ea: bf00 nop
|
|
80089ec: 3710 adds r7, #16
|
|
80089ee: 46bd mov sp, r7
|
|
80089f0: bd80 pop {r7, pc}
|
|
80089f2: bf00 nop
|
|
80089f4: 24007b7c .word 0x24007b7c
|
|
80089f8: 24007b6c .word 0x24007b6c
|
|
|
|
080089fc <tcp_handle_closepend>:
|
|
* now send the FIN (which failed before), the pcb might be in a state that is
|
|
* OK for us to now free it.
|
|
*/
|
|
static void
|
|
tcp_handle_closepend(void)
|
|
{
|
|
80089fc: b580 push {r7, lr}
|
|
80089fe: b082 sub sp, #8
|
|
8008a00: af00 add r7, sp, #0
|
|
struct tcp_pcb *pcb = tcp_active_pcbs;
|
|
8008a02: 4b10 ldr r3, [pc, #64] ; (8008a44 <tcp_handle_closepend+0x48>)
|
|
8008a04: 681b ldr r3, [r3, #0]
|
|
8008a06: 607b str r3, [r7, #4]
|
|
|
|
while (pcb != NULL) {
|
|
8008a08: e014 b.n 8008a34 <tcp_handle_closepend+0x38>
|
|
struct tcp_pcb *next = pcb->next;
|
|
8008a0a: 687b ldr r3, [r7, #4]
|
|
8008a0c: 68db ldr r3, [r3, #12]
|
|
8008a0e: 603b str r3, [r7, #0]
|
|
/* send pending FIN */
|
|
if (pcb->flags & TF_CLOSEPEND) {
|
|
8008a10: 687b ldr r3, [r7, #4]
|
|
8008a12: 8b5b ldrh r3, [r3, #26]
|
|
8008a14: f003 0308 and.w r3, r3, #8
|
|
8008a18: 2b00 cmp r3, #0
|
|
8008a1a: d009 beq.n 8008a30 <tcp_handle_closepend+0x34>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_handle_closepend: pending FIN\n"));
|
|
tcp_clear_flags(pcb, TF_CLOSEPEND);
|
|
8008a1c: 687b ldr r3, [r7, #4]
|
|
8008a1e: 8b5b ldrh r3, [r3, #26]
|
|
8008a20: f023 0308 bic.w r3, r3, #8
|
|
8008a24: b29a uxth r2, r3
|
|
8008a26: 687b ldr r3, [r7, #4]
|
|
8008a28: 835a strh r2, [r3, #26]
|
|
tcp_close_shutdown_fin(pcb);
|
|
8008a2a: 6878 ldr r0, [r7, #4]
|
|
8008a2c: f7fe ff06 bl 800783c <tcp_close_shutdown_fin>
|
|
}
|
|
pcb = next;
|
|
8008a30: 683b ldr r3, [r7, #0]
|
|
8008a32: 607b str r3, [r7, #4]
|
|
while (pcb != NULL) {
|
|
8008a34: 687b ldr r3, [r7, #4]
|
|
8008a36: 2b00 cmp r3, #0
|
|
8008a38: d1e7 bne.n 8008a0a <tcp_handle_closepend+0xe>
|
|
}
|
|
}
|
|
8008a3a: bf00 nop
|
|
8008a3c: bf00 nop
|
|
8008a3e: 3708 adds r7, #8
|
|
8008a40: 46bd mov sp, r7
|
|
8008a42: bd80 pop {r7, pc}
|
|
8008a44: 24007b78 .word 0x24007b78
|
|
|
|
08008a48 <tcp_alloc>:
|
|
* @param prio priority for the new pcb
|
|
* @return a new tcp_pcb that initially is in state CLOSED
|
|
*/
|
|
struct tcp_pcb *
|
|
tcp_alloc(u8_t prio)
|
|
{
|
|
8008a48: b580 push {r7, lr}
|
|
8008a4a: b084 sub sp, #16
|
|
8008a4c: af00 add r7, sp, #0
|
|
8008a4e: 4603 mov r3, r0
|
|
8008a50: 71fb strb r3, [r7, #7]
|
|
struct tcp_pcb *pcb;
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
|
|
8008a52: 2001 movs r0, #1
|
|
8008a54: f7fd fae2 bl 800601c <memp_malloc>
|
|
8008a58: 60f8 str r0, [r7, #12]
|
|
if (pcb == NULL) {
|
|
8008a5a: 68fb ldr r3, [r7, #12]
|
|
8008a5c: 2b00 cmp r3, #0
|
|
8008a5e: d126 bne.n 8008aae <tcp_alloc+0x66>
|
|
/* Try to send FIN for all pcbs stuck in TF_CLOSEPEND first */
|
|
tcp_handle_closepend();
|
|
8008a60: f7ff ffcc bl 80089fc <tcp_handle_closepend>
|
|
|
|
/* Try killing oldest connection in TIME-WAIT. */
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
|
|
tcp_kill_timewait();
|
|
8008a64: f7ff ff9a bl 800899c <tcp_kill_timewait>
|
|
/* Try to allocate a tcp_pcb again. */
|
|
pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
|
|
8008a68: 2001 movs r0, #1
|
|
8008a6a: f7fd fad7 bl 800601c <memp_malloc>
|
|
8008a6e: 60f8 str r0, [r7, #12]
|
|
if (pcb == NULL) {
|
|
8008a70: 68fb ldr r3, [r7, #12]
|
|
8008a72: 2b00 cmp r3, #0
|
|
8008a74: d11b bne.n 8008aae <tcp_alloc+0x66>
|
|
/* Try killing oldest connection in LAST-ACK (these wouldn't go to TIME-WAIT). */
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest LAST-ACK connection\n"));
|
|
tcp_kill_state(LAST_ACK);
|
|
8008a76: 2009 movs r0, #9
|
|
8008a78: f7ff ff46 bl 8008908 <tcp_kill_state>
|
|
/* Try to allocate a tcp_pcb again. */
|
|
pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
|
|
8008a7c: 2001 movs r0, #1
|
|
8008a7e: f7fd facd bl 800601c <memp_malloc>
|
|
8008a82: 60f8 str r0, [r7, #12]
|
|
if (pcb == NULL) {
|
|
8008a84: 68fb ldr r3, [r7, #12]
|
|
8008a86: 2b00 cmp r3, #0
|
|
8008a88: d111 bne.n 8008aae <tcp_alloc+0x66>
|
|
/* Try killing oldest connection in CLOSING. */
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest CLOSING connection\n"));
|
|
tcp_kill_state(CLOSING);
|
|
8008a8a: 2008 movs r0, #8
|
|
8008a8c: f7ff ff3c bl 8008908 <tcp_kill_state>
|
|
/* Try to allocate a tcp_pcb again. */
|
|
pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
|
|
8008a90: 2001 movs r0, #1
|
|
8008a92: f7fd fac3 bl 800601c <memp_malloc>
|
|
8008a96: 60f8 str r0, [r7, #12]
|
|
if (pcb == NULL) {
|
|
8008a98: 68fb ldr r3, [r7, #12]
|
|
8008a9a: 2b00 cmp r3, #0
|
|
8008a9c: d107 bne.n 8008aae <tcp_alloc+0x66>
|
|
/* Try killing oldest active connection with lower priority than the new one. */
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing oldest connection with prio lower than %d\n", prio));
|
|
tcp_kill_prio(prio);
|
|
8008a9e: 79fb ldrb r3, [r7, #7]
|
|
8008aa0: 4618 mov r0, r3
|
|
8008aa2: f7ff fee3 bl 800886c <tcp_kill_prio>
|
|
/* Try to allocate a tcp_pcb again. */
|
|
pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
|
|
8008aa6: 2001 movs r0, #1
|
|
8008aa8: f7fd fab8 bl 800601c <memp_malloc>
|
|
8008aac: 60f8 str r0, [r7, #12]
|
|
if (pcb != NULL) {
|
|
/* adjust err stats: memp_malloc failed above */
|
|
MEMP_STATS_DEC(err, MEMP_TCP_PCB);
|
|
}
|
|
}
|
|
if (pcb != NULL) {
|
|
8008aae: 68fb ldr r3, [r7, #12]
|
|
8008ab0: 2b00 cmp r3, #0
|
|
8008ab2: d03f beq.n 8008b34 <tcp_alloc+0xec>
|
|
/* zero out the whole pcb, so there is no need to initialize members to zero */
|
|
memset(pcb, 0, sizeof(struct tcp_pcb));
|
|
8008ab4: 229c movs r2, #156 ; 0x9c
|
|
8008ab6: 2100 movs r1, #0
|
|
8008ab8: 68f8 ldr r0, [r7, #12]
|
|
8008aba: f008 f9e3 bl 8010e84 <memset>
|
|
pcb->prio = prio;
|
|
8008abe: 68fb ldr r3, [r7, #12]
|
|
8008ac0: 79fa ldrb r2, [r7, #7]
|
|
8008ac2: 755a strb r2, [r3, #21]
|
|
pcb->snd_buf = TCP_SND_BUF;
|
|
8008ac4: 68fb ldr r3, [r7, #12]
|
|
8008ac6: f44f 6286 mov.w r2, #1072 ; 0x430
|
|
8008aca: f8a3 2064 strh.w r2, [r3, #100] ; 0x64
|
|
/* Start with a window that does not need scaling. When window scaling is
|
|
enabled and used, the window is enlarged when both sides agree on scaling. */
|
|
pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND);
|
|
8008ace: 68fb ldr r3, [r7, #12]
|
|
8008ad0: f44f 6206 mov.w r2, #2144 ; 0x860
|
|
8008ad4: 855a strh r2, [r3, #42] ; 0x2a
|
|
8008ad6: 68fb ldr r3, [r7, #12]
|
|
8008ad8: 8d5a ldrh r2, [r3, #42] ; 0x2a
|
|
8008ada: 68fb ldr r3, [r7, #12]
|
|
8008adc: 851a strh r2, [r3, #40] ; 0x28
|
|
pcb->ttl = TCP_TTL;
|
|
8008ade: 68fb ldr r3, [r7, #12]
|
|
8008ae0: 22ff movs r2, #255 ; 0xff
|
|
8008ae2: 72da strb r2, [r3, #11]
|
|
/* As initial send MSS, we use TCP_MSS but limit it to 536.
|
|
The send MSS is updated when an MSS option is received. */
|
|
pcb->mss = INITIAL_MSS;
|
|
8008ae4: 68fb ldr r3, [r7, #12]
|
|
8008ae6: f44f 7206 mov.w r2, #536 ; 0x218
|
|
8008aea: 865a strh r2, [r3, #50] ; 0x32
|
|
pcb->rto = 3000 / TCP_SLOW_INTERVAL;
|
|
8008aec: 68fb ldr r3, [r7, #12]
|
|
8008aee: 2206 movs r2, #6
|
|
8008af0: f8a3 2040 strh.w r2, [r3, #64] ; 0x40
|
|
pcb->sv = 3000 / TCP_SLOW_INTERVAL;
|
|
8008af4: 68fb ldr r3, [r7, #12]
|
|
8008af6: 2206 movs r2, #6
|
|
8008af8: 87da strh r2, [r3, #62] ; 0x3e
|
|
pcb->rtime = -1;
|
|
8008afa: 68fb ldr r3, [r7, #12]
|
|
8008afc: f64f 72ff movw r2, #65535 ; 0xffff
|
|
8008b00: 861a strh r2, [r3, #48] ; 0x30
|
|
pcb->cwnd = 1;
|
|
8008b02: 68fb ldr r3, [r7, #12]
|
|
8008b04: 2201 movs r2, #1
|
|
8008b06: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
pcb->tmr = tcp_ticks;
|
|
8008b0a: 4b0d ldr r3, [pc, #52] ; (8008b40 <tcp_alloc+0xf8>)
|
|
8008b0c: 681a ldr r2, [r3, #0]
|
|
8008b0e: 68fb ldr r3, [r7, #12]
|
|
8008b10: 621a str r2, [r3, #32]
|
|
pcb->last_timer = tcp_timer_ctr;
|
|
8008b12: 4b0c ldr r3, [pc, #48] ; (8008b44 <tcp_alloc+0xfc>)
|
|
8008b14: 781a ldrb r2, [r3, #0]
|
|
8008b16: 68fb ldr r3, [r7, #12]
|
|
8008b18: 779a strb r2, [r3, #30]
|
|
of using the largest advertised receive window. We've seen complications with
|
|
receiving TCPs that use window scaling and/or window auto-tuning where the
|
|
initial advertised window is very small and then grows rapidly once the
|
|
connection is established. To avoid these complications, we set ssthresh to the
|
|
largest effective cwnd (amount of in-flight data) that the sender can have. */
|
|
pcb->ssthresh = TCP_SND_BUF;
|
|
8008b1a: 68fb ldr r3, [r7, #12]
|
|
8008b1c: f44f 6286 mov.w r2, #1072 ; 0x430
|
|
8008b20: f8a3 204a strh.w r2, [r3, #74] ; 0x4a
|
|
|
|
#if LWIP_CALLBACK_API
|
|
pcb->recv = tcp_recv_null;
|
|
8008b24: 68fb ldr r3, [r7, #12]
|
|
8008b26: 4a08 ldr r2, [pc, #32] ; (8008b48 <tcp_alloc+0x100>)
|
|
8008b28: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
#endif /* LWIP_CALLBACK_API */
|
|
|
|
/* Init KEEPALIVE timer */
|
|
pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
|
|
8008b2c: 68fb ldr r3, [r7, #12]
|
|
8008b2e: 4a07 ldr r2, [pc, #28] ; (8008b4c <tcp_alloc+0x104>)
|
|
8008b30: f8c3 2094 str.w r2, [r3, #148] ; 0x94
|
|
#if LWIP_TCP_KEEPALIVE
|
|
pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
|
|
pcb->keep_cnt = TCP_KEEPCNT_DEFAULT;
|
|
#endif /* LWIP_TCP_KEEPALIVE */
|
|
}
|
|
return pcb;
|
|
8008b34: 68fb ldr r3, [r7, #12]
|
|
}
|
|
8008b36: 4618 mov r0, r3
|
|
8008b38: 3710 adds r7, #16
|
|
8008b3a: 46bd mov sp, r7
|
|
8008b3c: bd80 pop {r7, pc}
|
|
8008b3e: bf00 nop
|
|
8008b40: 24007b6c .word 0x24007b6c
|
|
8008b44: 24007b82 .word 0x24007b82
|
|
8008b48: 08008801 .word 0x08008801
|
|
8008b4c: 006ddd00 .word 0x006ddd00
|
|
|
|
08008b50 <tcp_new>:
|
|
*
|
|
* @return a new tcp_pcb that initially is in state CLOSED
|
|
*/
|
|
struct tcp_pcb *
|
|
tcp_new(void)
|
|
{
|
|
8008b50: b580 push {r7, lr}
|
|
8008b52: af00 add r7, sp, #0
|
|
return tcp_alloc(TCP_PRIO_NORMAL);
|
|
8008b54: 2040 movs r0, #64 ; 0x40
|
|
8008b56: f7ff ff77 bl 8008a48 <tcp_alloc>
|
|
8008b5a: 4603 mov r3, r0
|
|
}
|
|
8008b5c: 4618 mov r0, r3
|
|
8008b5e: bd80 pop {r7, pc}
|
|
|
|
08008b60 <tcp_arg>:
|
|
* @param pcb tcp_pcb to set the callback argument
|
|
* @param arg void pointer argument to pass to callback functions
|
|
*/
|
|
void
|
|
tcp_arg(struct tcp_pcb *pcb, void *arg)
|
|
{
|
|
8008b60: b480 push {r7}
|
|
8008b62: b083 sub sp, #12
|
|
8008b64: af00 add r7, sp, #0
|
|
8008b66: 6078 str r0, [r7, #4]
|
|
8008b68: 6039 str r1, [r7, #0]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
/* This function is allowed to be called for both listen pcbs and
|
|
connection pcbs. */
|
|
if (pcb != NULL) {
|
|
8008b6a: 687b ldr r3, [r7, #4]
|
|
8008b6c: 2b00 cmp r3, #0
|
|
8008b6e: d002 beq.n 8008b76 <tcp_arg+0x16>
|
|
pcb->callback_arg = arg;
|
|
8008b70: 687b ldr r3, [r7, #4]
|
|
8008b72: 683a ldr r2, [r7, #0]
|
|
8008b74: 611a str r2, [r3, #16]
|
|
}
|
|
}
|
|
8008b76: bf00 nop
|
|
8008b78: 370c adds r7, #12
|
|
8008b7a: 46bd mov sp, r7
|
|
8008b7c: f85d 7b04 ldr.w r7, [sp], #4
|
|
8008b80: 4770 bx lr
|
|
...
|
|
|
|
08008b84 <tcp_recv>:
|
|
* @param pcb tcp_pcb to set the recv callback
|
|
* @param recv callback function to call for this pcb when data is received
|
|
*/
|
|
void
|
|
tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)
|
|
{
|
|
8008b84: b580 push {r7, lr}
|
|
8008b86: b082 sub sp, #8
|
|
8008b88: af00 add r7, sp, #0
|
|
8008b8a: 6078 str r0, [r7, #4]
|
|
8008b8c: 6039 str r1, [r7, #0]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
if (pcb != NULL) {
|
|
8008b8e: 687b ldr r3, [r7, #4]
|
|
8008b90: 2b00 cmp r3, #0
|
|
8008b92: d00e beq.n 8008bb2 <tcp_recv+0x2e>
|
|
LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN);
|
|
8008b94: 687b ldr r3, [r7, #4]
|
|
8008b96: 7d1b ldrb r3, [r3, #20]
|
|
8008b98: 2b01 cmp r3, #1
|
|
8008b9a: d106 bne.n 8008baa <tcp_recv+0x26>
|
|
8008b9c: 4b07 ldr r3, [pc, #28] ; (8008bbc <tcp_recv+0x38>)
|
|
8008b9e: f240 72df movw r2, #2015 ; 0x7df
|
|
8008ba2: 4907 ldr r1, [pc, #28] ; (8008bc0 <tcp_recv+0x3c>)
|
|
8008ba4: 4807 ldr r0, [pc, #28] ; (8008bc4 <tcp_recv+0x40>)
|
|
8008ba6: f008 f80f bl 8010bc8 <iprintf>
|
|
pcb->recv = recv;
|
|
8008baa: 687b ldr r3, [r7, #4]
|
|
8008bac: 683a ldr r2, [r7, #0]
|
|
8008bae: f8c3 2084 str.w r2, [r3, #132] ; 0x84
|
|
}
|
|
}
|
|
8008bb2: bf00 nop
|
|
8008bb4: 3708 adds r7, #8
|
|
8008bb6: 46bd mov sp, r7
|
|
8008bb8: bd80 pop {r7, pc}
|
|
8008bba: bf00 nop
|
|
8008bbc: 08012a08 .word 0x08012a08
|
|
8008bc0: 08012fa4 .word 0x08012fa4
|
|
8008bc4: 08012a4c .word 0x08012a4c
|
|
|
|
08008bc8 <tcp_sent>:
|
|
* @param pcb tcp_pcb to set the sent callback
|
|
* @param sent callback function to call for this pcb when data is successfully sent
|
|
*/
|
|
void
|
|
tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)
|
|
{
|
|
8008bc8: b580 push {r7, lr}
|
|
8008bca: b082 sub sp, #8
|
|
8008bcc: af00 add r7, sp, #0
|
|
8008bce: 6078 str r0, [r7, #4]
|
|
8008bd0: 6039 str r1, [r7, #0]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
if (pcb != NULL) {
|
|
8008bd2: 687b ldr r3, [r7, #4]
|
|
8008bd4: 2b00 cmp r3, #0
|
|
8008bd6: d00e beq.n 8008bf6 <tcp_sent+0x2e>
|
|
LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN);
|
|
8008bd8: 687b ldr r3, [r7, #4]
|
|
8008bda: 7d1b ldrb r3, [r3, #20]
|
|
8008bdc: 2b01 cmp r3, #1
|
|
8008bde: d106 bne.n 8008bee <tcp_sent+0x26>
|
|
8008be0: 4b07 ldr r3, [pc, #28] ; (8008c00 <tcp_sent+0x38>)
|
|
8008be2: f240 72f3 movw r2, #2035 ; 0x7f3
|
|
8008be6: 4907 ldr r1, [pc, #28] ; (8008c04 <tcp_sent+0x3c>)
|
|
8008be8: 4807 ldr r0, [pc, #28] ; (8008c08 <tcp_sent+0x40>)
|
|
8008bea: f007 ffed bl 8010bc8 <iprintf>
|
|
pcb->sent = sent;
|
|
8008bee: 687b ldr r3, [r7, #4]
|
|
8008bf0: 683a ldr r2, [r7, #0]
|
|
8008bf2: f8c3 2080 str.w r2, [r3, #128] ; 0x80
|
|
}
|
|
}
|
|
8008bf6: bf00 nop
|
|
8008bf8: 3708 adds r7, #8
|
|
8008bfa: 46bd mov sp, r7
|
|
8008bfc: bd80 pop {r7, pc}
|
|
8008bfe: bf00 nop
|
|
8008c00: 08012a08 .word 0x08012a08
|
|
8008c04: 08012fcc .word 0x08012fcc
|
|
8008c08: 08012a4c .word 0x08012a4c
|
|
|
|
08008c0c <tcp_err>:
|
|
* @param err callback function to call for this pcb when a fatal error
|
|
* has occurred on the connection
|
|
*/
|
|
void
|
|
tcp_err(struct tcp_pcb *pcb, tcp_err_fn err)
|
|
{
|
|
8008c0c: b580 push {r7, lr}
|
|
8008c0e: b082 sub sp, #8
|
|
8008c10: af00 add r7, sp, #0
|
|
8008c12: 6078 str r0, [r7, #4]
|
|
8008c14: 6039 str r1, [r7, #0]
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
if (pcb != NULL) {
|
|
8008c16: 687b ldr r3, [r7, #4]
|
|
8008c18: 2b00 cmp r3, #0
|
|
8008c1a: d00e beq.n 8008c3a <tcp_err+0x2e>
|
|
LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN);
|
|
8008c1c: 687b ldr r3, [r7, #4]
|
|
8008c1e: 7d1b ldrb r3, [r3, #20]
|
|
8008c20: 2b01 cmp r3, #1
|
|
8008c22: d106 bne.n 8008c32 <tcp_err+0x26>
|
|
8008c24: 4b07 ldr r3, [pc, #28] ; (8008c44 <tcp_err+0x38>)
|
|
8008c26: f640 020d movw r2, #2061 ; 0x80d
|
|
8008c2a: 4907 ldr r1, [pc, #28] ; (8008c48 <tcp_err+0x3c>)
|
|
8008c2c: 4807 ldr r0, [pc, #28] ; (8008c4c <tcp_err+0x40>)
|
|
8008c2e: f007 ffcb bl 8010bc8 <iprintf>
|
|
pcb->errf = err;
|
|
8008c32: 687b ldr r3, [r7, #4]
|
|
8008c34: 683a ldr r2, [r7, #0]
|
|
8008c36: f8c3 2090 str.w r2, [r3, #144] ; 0x90
|
|
}
|
|
}
|
|
8008c3a: bf00 nop
|
|
8008c3c: 3708 adds r7, #8
|
|
8008c3e: 46bd mov sp, r7
|
|
8008c40: bd80 pop {r7, pc}
|
|
8008c42: bf00 nop
|
|
8008c44: 08012a08 .word 0x08012a08
|
|
8008c48: 08012ff4 .word 0x08012ff4
|
|
8008c4c: 08012a4c .word 0x08012a4c
|
|
|
|
08008c50 <tcp_pcb_purge>:
|
|
*
|
|
* @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
|
|
*/
|
|
void
|
|
tcp_pcb_purge(struct tcp_pcb *pcb)
|
|
{
|
|
8008c50: b580 push {r7, lr}
|
|
8008c52: b082 sub sp, #8
|
|
8008c54: af00 add r7, sp, #0
|
|
8008c56: 6078 str r0, [r7, #4]
|
|
LWIP_ERROR("tcp_pcb_purge: invalid pcb", pcb != NULL, return);
|
|
8008c58: 687b ldr r3, [r7, #4]
|
|
8008c5a: 2b00 cmp r3, #0
|
|
8008c5c: d107 bne.n 8008c6e <tcp_pcb_purge+0x1e>
|
|
8008c5e: 4b21 ldr r3, [pc, #132] ; (8008ce4 <tcp_pcb_purge+0x94>)
|
|
8008c60: f640 0251 movw r2, #2129 ; 0x851
|
|
8008c64: 4920 ldr r1, [pc, #128] ; (8008ce8 <tcp_pcb_purge+0x98>)
|
|
8008c66: 4821 ldr r0, [pc, #132] ; (8008cec <tcp_pcb_purge+0x9c>)
|
|
8008c68: f007 ffae bl 8010bc8 <iprintf>
|
|
8008c6c: e037 b.n 8008cde <tcp_pcb_purge+0x8e>
|
|
|
|
if (pcb->state != CLOSED &&
|
|
8008c6e: 687b ldr r3, [r7, #4]
|
|
8008c70: 7d1b ldrb r3, [r3, #20]
|
|
8008c72: 2b00 cmp r3, #0
|
|
8008c74: d033 beq.n 8008cde <tcp_pcb_purge+0x8e>
|
|
pcb->state != TIME_WAIT &&
|
|
8008c76: 687b ldr r3, [r7, #4]
|
|
8008c78: 7d1b ldrb r3, [r3, #20]
|
|
if (pcb->state != CLOSED &&
|
|
8008c7a: 2b0a cmp r3, #10
|
|
8008c7c: d02f beq.n 8008cde <tcp_pcb_purge+0x8e>
|
|
pcb->state != LISTEN) {
|
|
8008c7e: 687b ldr r3, [r7, #4]
|
|
8008c80: 7d1b ldrb r3, [r3, #20]
|
|
pcb->state != TIME_WAIT &&
|
|
8008c82: 2b01 cmp r3, #1
|
|
8008c84: d02b beq.n 8008cde <tcp_pcb_purge+0x8e>
|
|
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n"));
|
|
|
|
tcp_backlog_accepted(pcb);
|
|
|
|
if (pcb->refused_data != NULL) {
|
|
8008c86: 687b ldr r3, [r7, #4]
|
|
8008c88: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
8008c8a: 2b00 cmp r3, #0
|
|
8008c8c: d007 beq.n 8008c9e <tcp_pcb_purge+0x4e>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n"));
|
|
pbuf_free(pcb->refused_data);
|
|
8008c8e: 687b ldr r3, [r7, #4]
|
|
8008c90: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
8008c92: 4618 mov r0, r3
|
|
8008c94: f7fe f99e bl 8006fd4 <pbuf_free>
|
|
pcb->refused_data = NULL;
|
|
8008c98: 687b ldr r3, [r7, #4]
|
|
8008c9a: 2200 movs r2, #0
|
|
8008c9c: 679a str r2, [r3, #120] ; 0x78
|
|
}
|
|
if (pcb->unacked != NULL) {
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n"));
|
|
}
|
|
#if TCP_QUEUE_OOSEQ
|
|
if (pcb->ooseq != NULL) {
|
|
8008c9e: 687b ldr r3, [r7, #4]
|
|
8008ca0: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
8008ca2: 2b00 cmp r3, #0
|
|
8008ca4: d002 beq.n 8008cac <tcp_pcb_purge+0x5c>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n"));
|
|
tcp_free_ooseq(pcb);
|
|
8008ca6: 6878 ldr r0, [r7, #4]
|
|
8008ca8: f000 f98c bl 8008fc4 <tcp_free_ooseq>
|
|
}
|
|
#endif /* TCP_QUEUE_OOSEQ */
|
|
|
|
/* Stop the retransmission timer as it will expect data on unacked
|
|
queue if it fires */
|
|
pcb->rtime = -1;
|
|
8008cac: 687b ldr r3, [r7, #4]
|
|
8008cae: f64f 72ff movw r2, #65535 ; 0xffff
|
|
8008cb2: 861a strh r2, [r3, #48] ; 0x30
|
|
|
|
tcp_segs_free(pcb->unsent);
|
|
8008cb4: 687b ldr r3, [r7, #4]
|
|
8008cb6: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8008cb8: 4618 mov r0, r3
|
|
8008cba: f7ff fd47 bl 800874c <tcp_segs_free>
|
|
tcp_segs_free(pcb->unacked);
|
|
8008cbe: 687b ldr r3, [r7, #4]
|
|
8008cc0: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8008cc2: 4618 mov r0, r3
|
|
8008cc4: f7ff fd42 bl 800874c <tcp_segs_free>
|
|
pcb->unacked = pcb->unsent = NULL;
|
|
8008cc8: 687b ldr r3, [r7, #4]
|
|
8008cca: 2200 movs r2, #0
|
|
8008ccc: 66da str r2, [r3, #108] ; 0x6c
|
|
8008cce: 687b ldr r3, [r7, #4]
|
|
8008cd0: 6eda ldr r2, [r3, #108] ; 0x6c
|
|
8008cd2: 687b ldr r3, [r7, #4]
|
|
8008cd4: 671a str r2, [r3, #112] ; 0x70
|
|
#if TCP_OVERSIZE
|
|
pcb->unsent_oversize = 0;
|
|
8008cd6: 687b ldr r3, [r7, #4]
|
|
8008cd8: 2200 movs r2, #0
|
|
8008cda: f8a3 2068 strh.w r2, [r3, #104] ; 0x68
|
|
#endif /* TCP_OVERSIZE */
|
|
}
|
|
}
|
|
8008cde: 3708 adds r7, #8
|
|
8008ce0: 46bd mov sp, r7
|
|
8008ce2: bd80 pop {r7, pc}
|
|
8008ce4: 08012a08 .word 0x08012a08
|
|
8008ce8: 08013054 .word 0x08013054
|
|
8008cec: 08012a4c .word 0x08012a4c
|
|
|
|
08008cf0 <tcp_pcb_remove>:
|
|
* @param pcblist PCB list to purge.
|
|
* @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
|
|
*/
|
|
void
|
|
tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
|
|
{
|
|
8008cf0: b580 push {r7, lr}
|
|
8008cf2: b084 sub sp, #16
|
|
8008cf4: af00 add r7, sp, #0
|
|
8008cf6: 6078 str r0, [r7, #4]
|
|
8008cf8: 6039 str r1, [r7, #0]
|
|
LWIP_ASSERT("tcp_pcb_remove: invalid pcb", pcb != NULL);
|
|
8008cfa: 683b ldr r3, [r7, #0]
|
|
8008cfc: 2b00 cmp r3, #0
|
|
8008cfe: d106 bne.n 8008d0e <tcp_pcb_remove+0x1e>
|
|
8008d00: 4b3e ldr r3, [pc, #248] ; (8008dfc <tcp_pcb_remove+0x10c>)
|
|
8008d02: f640 0283 movw r2, #2179 ; 0x883
|
|
8008d06: 493e ldr r1, [pc, #248] ; (8008e00 <tcp_pcb_remove+0x110>)
|
|
8008d08: 483e ldr r0, [pc, #248] ; (8008e04 <tcp_pcb_remove+0x114>)
|
|
8008d0a: f007 ff5d bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_pcb_remove: invalid pcblist", pcblist != NULL);
|
|
8008d0e: 687b ldr r3, [r7, #4]
|
|
8008d10: 2b00 cmp r3, #0
|
|
8008d12: d106 bne.n 8008d22 <tcp_pcb_remove+0x32>
|
|
8008d14: 4b39 ldr r3, [pc, #228] ; (8008dfc <tcp_pcb_remove+0x10c>)
|
|
8008d16: f640 0284 movw r2, #2180 ; 0x884
|
|
8008d1a: 493b ldr r1, [pc, #236] ; (8008e08 <tcp_pcb_remove+0x118>)
|
|
8008d1c: 4839 ldr r0, [pc, #228] ; (8008e04 <tcp_pcb_remove+0x114>)
|
|
8008d1e: f007 ff53 bl 8010bc8 <iprintf>
|
|
|
|
TCP_RMV(pcblist, pcb);
|
|
8008d22: 687b ldr r3, [r7, #4]
|
|
8008d24: 681b ldr r3, [r3, #0]
|
|
8008d26: 683a ldr r2, [r7, #0]
|
|
8008d28: 429a cmp r2, r3
|
|
8008d2a: d105 bne.n 8008d38 <tcp_pcb_remove+0x48>
|
|
8008d2c: 687b ldr r3, [r7, #4]
|
|
8008d2e: 681b ldr r3, [r3, #0]
|
|
8008d30: 68da ldr r2, [r3, #12]
|
|
8008d32: 687b ldr r3, [r7, #4]
|
|
8008d34: 601a str r2, [r3, #0]
|
|
8008d36: e013 b.n 8008d60 <tcp_pcb_remove+0x70>
|
|
8008d38: 687b ldr r3, [r7, #4]
|
|
8008d3a: 681b ldr r3, [r3, #0]
|
|
8008d3c: 60fb str r3, [r7, #12]
|
|
8008d3e: e00c b.n 8008d5a <tcp_pcb_remove+0x6a>
|
|
8008d40: 68fb ldr r3, [r7, #12]
|
|
8008d42: 68db ldr r3, [r3, #12]
|
|
8008d44: 683a ldr r2, [r7, #0]
|
|
8008d46: 429a cmp r2, r3
|
|
8008d48: d104 bne.n 8008d54 <tcp_pcb_remove+0x64>
|
|
8008d4a: 683b ldr r3, [r7, #0]
|
|
8008d4c: 68da ldr r2, [r3, #12]
|
|
8008d4e: 68fb ldr r3, [r7, #12]
|
|
8008d50: 60da str r2, [r3, #12]
|
|
8008d52: e005 b.n 8008d60 <tcp_pcb_remove+0x70>
|
|
8008d54: 68fb ldr r3, [r7, #12]
|
|
8008d56: 68db ldr r3, [r3, #12]
|
|
8008d58: 60fb str r3, [r7, #12]
|
|
8008d5a: 68fb ldr r3, [r7, #12]
|
|
8008d5c: 2b00 cmp r3, #0
|
|
8008d5e: d1ef bne.n 8008d40 <tcp_pcb_remove+0x50>
|
|
8008d60: 683b ldr r3, [r7, #0]
|
|
8008d62: 2200 movs r2, #0
|
|
8008d64: 60da str r2, [r3, #12]
|
|
|
|
tcp_pcb_purge(pcb);
|
|
8008d66: 6838 ldr r0, [r7, #0]
|
|
8008d68: f7ff ff72 bl 8008c50 <tcp_pcb_purge>
|
|
|
|
/* if there is an outstanding delayed ACKs, send it */
|
|
if ((pcb->state != TIME_WAIT) &&
|
|
8008d6c: 683b ldr r3, [r7, #0]
|
|
8008d6e: 7d1b ldrb r3, [r3, #20]
|
|
8008d70: 2b0a cmp r3, #10
|
|
8008d72: d013 beq.n 8008d9c <tcp_pcb_remove+0xac>
|
|
(pcb->state != LISTEN) &&
|
|
8008d74: 683b ldr r3, [r7, #0]
|
|
8008d76: 7d1b ldrb r3, [r3, #20]
|
|
if ((pcb->state != TIME_WAIT) &&
|
|
8008d78: 2b01 cmp r3, #1
|
|
8008d7a: d00f beq.n 8008d9c <tcp_pcb_remove+0xac>
|
|
(pcb->flags & TF_ACK_DELAY)) {
|
|
8008d7c: 683b ldr r3, [r7, #0]
|
|
8008d7e: 8b5b ldrh r3, [r3, #26]
|
|
8008d80: f003 0301 and.w r3, r3, #1
|
|
(pcb->state != LISTEN) &&
|
|
8008d84: 2b00 cmp r3, #0
|
|
8008d86: d009 beq.n 8008d9c <tcp_pcb_remove+0xac>
|
|
tcp_ack_now(pcb);
|
|
8008d88: 683b ldr r3, [r7, #0]
|
|
8008d8a: 8b5b ldrh r3, [r3, #26]
|
|
8008d8c: f043 0302 orr.w r3, r3, #2
|
|
8008d90: b29a uxth r2, r3
|
|
8008d92: 683b ldr r3, [r7, #0]
|
|
8008d94: 835a strh r2, [r3, #26]
|
|
tcp_output(pcb);
|
|
8008d96: 6838 ldr r0, [r7, #0]
|
|
8008d98: f003 fc2c bl 800c5f4 <tcp_output>
|
|
}
|
|
|
|
if (pcb->state != LISTEN) {
|
|
8008d9c: 683b ldr r3, [r7, #0]
|
|
8008d9e: 7d1b ldrb r3, [r3, #20]
|
|
8008da0: 2b01 cmp r3, #1
|
|
8008da2: d020 beq.n 8008de6 <tcp_pcb_remove+0xf6>
|
|
LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL);
|
|
8008da4: 683b ldr r3, [r7, #0]
|
|
8008da6: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8008da8: 2b00 cmp r3, #0
|
|
8008daa: d006 beq.n 8008dba <tcp_pcb_remove+0xca>
|
|
8008dac: 4b13 ldr r3, [pc, #76] ; (8008dfc <tcp_pcb_remove+0x10c>)
|
|
8008dae: f640 0293 movw r2, #2195 ; 0x893
|
|
8008db2: 4916 ldr r1, [pc, #88] ; (8008e0c <tcp_pcb_remove+0x11c>)
|
|
8008db4: 4813 ldr r0, [pc, #76] ; (8008e04 <tcp_pcb_remove+0x114>)
|
|
8008db6: f007 ff07 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL);
|
|
8008dba: 683b ldr r3, [r7, #0]
|
|
8008dbc: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8008dbe: 2b00 cmp r3, #0
|
|
8008dc0: d006 beq.n 8008dd0 <tcp_pcb_remove+0xe0>
|
|
8008dc2: 4b0e ldr r3, [pc, #56] ; (8008dfc <tcp_pcb_remove+0x10c>)
|
|
8008dc4: f640 0294 movw r2, #2196 ; 0x894
|
|
8008dc8: 4911 ldr r1, [pc, #68] ; (8008e10 <tcp_pcb_remove+0x120>)
|
|
8008dca: 480e ldr r0, [pc, #56] ; (8008e04 <tcp_pcb_remove+0x114>)
|
|
8008dcc: f007 fefc bl 8010bc8 <iprintf>
|
|
#if TCP_QUEUE_OOSEQ
|
|
LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL);
|
|
8008dd0: 683b ldr r3, [r7, #0]
|
|
8008dd2: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
8008dd4: 2b00 cmp r3, #0
|
|
8008dd6: d006 beq.n 8008de6 <tcp_pcb_remove+0xf6>
|
|
8008dd8: 4b08 ldr r3, [pc, #32] ; (8008dfc <tcp_pcb_remove+0x10c>)
|
|
8008dda: f640 0296 movw r2, #2198 ; 0x896
|
|
8008dde: 490d ldr r1, [pc, #52] ; (8008e14 <tcp_pcb_remove+0x124>)
|
|
8008de0: 4808 ldr r0, [pc, #32] ; (8008e04 <tcp_pcb_remove+0x114>)
|
|
8008de2: f007 fef1 bl 8010bc8 <iprintf>
|
|
#endif /* TCP_QUEUE_OOSEQ */
|
|
}
|
|
|
|
pcb->state = CLOSED;
|
|
8008de6: 683b ldr r3, [r7, #0]
|
|
8008de8: 2200 movs r2, #0
|
|
8008dea: 751a strb r2, [r3, #20]
|
|
/* reset the local port to prevent the pcb from being 'bound' */
|
|
pcb->local_port = 0;
|
|
8008dec: 683b ldr r3, [r7, #0]
|
|
8008dee: 2200 movs r2, #0
|
|
8008df0: 82da strh r2, [r3, #22]
|
|
|
|
LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
|
|
}
|
|
8008df2: bf00 nop
|
|
8008df4: 3710 adds r7, #16
|
|
8008df6: 46bd mov sp, r7
|
|
8008df8: bd80 pop {r7, pc}
|
|
8008dfa: bf00 nop
|
|
8008dfc: 08012a08 .word 0x08012a08
|
|
8008e00: 08013070 .word 0x08013070
|
|
8008e04: 08012a4c .word 0x08012a4c
|
|
8008e08: 0801308c .word 0x0801308c
|
|
8008e0c: 080130ac .word 0x080130ac
|
|
8008e10: 080130c4 .word 0x080130c4
|
|
8008e14: 080130e0 .word 0x080130e0
|
|
|
|
08008e18 <tcp_next_iss>:
|
|
*
|
|
* @return u32_t pseudo random sequence number
|
|
*/
|
|
u32_t
|
|
tcp_next_iss(struct tcp_pcb *pcb)
|
|
{
|
|
8008e18: b580 push {r7, lr}
|
|
8008e1a: b082 sub sp, #8
|
|
8008e1c: af00 add r7, sp, #0
|
|
8008e1e: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("tcp_next_iss: invalid pcb", pcb != NULL);
|
|
return LWIP_HOOK_TCP_ISN(&pcb->local_ip, pcb->local_port, &pcb->remote_ip, pcb->remote_port);
|
|
#else /* LWIP_HOOK_TCP_ISN */
|
|
static u32_t iss = 6510;
|
|
|
|
LWIP_ASSERT("tcp_next_iss: invalid pcb", pcb != NULL);
|
|
8008e20: 687b ldr r3, [r7, #4]
|
|
8008e22: 2b00 cmp r3, #0
|
|
8008e24: d106 bne.n 8008e34 <tcp_next_iss+0x1c>
|
|
8008e26: 4b0a ldr r3, [pc, #40] ; (8008e50 <tcp_next_iss+0x38>)
|
|
8008e28: f640 02af movw r2, #2223 ; 0x8af
|
|
8008e2c: 4909 ldr r1, [pc, #36] ; (8008e54 <tcp_next_iss+0x3c>)
|
|
8008e2e: 480a ldr r0, [pc, #40] ; (8008e58 <tcp_next_iss+0x40>)
|
|
8008e30: f007 feca bl 8010bc8 <iprintf>
|
|
LWIP_UNUSED_ARG(pcb);
|
|
|
|
iss += tcp_ticks; /* XXX */
|
|
8008e34: 4b09 ldr r3, [pc, #36] ; (8008e5c <tcp_next_iss+0x44>)
|
|
8008e36: 681a ldr r2, [r3, #0]
|
|
8008e38: 4b09 ldr r3, [pc, #36] ; (8008e60 <tcp_next_iss+0x48>)
|
|
8008e3a: 681b ldr r3, [r3, #0]
|
|
8008e3c: 4413 add r3, r2
|
|
8008e3e: 4a07 ldr r2, [pc, #28] ; (8008e5c <tcp_next_iss+0x44>)
|
|
8008e40: 6013 str r3, [r2, #0]
|
|
return iss;
|
|
8008e42: 4b06 ldr r3, [pc, #24] ; (8008e5c <tcp_next_iss+0x44>)
|
|
8008e44: 681b ldr r3, [r3, #0]
|
|
#endif /* LWIP_HOOK_TCP_ISN */
|
|
}
|
|
8008e46: 4618 mov r0, r3
|
|
8008e48: 3708 adds r7, #8
|
|
8008e4a: 46bd mov sp, r7
|
|
8008e4c: bd80 pop {r7, pc}
|
|
8008e4e: bf00 nop
|
|
8008e50: 08012a08 .word 0x08012a08
|
|
8008e54: 080130f8 .word 0x080130f8
|
|
8008e58: 08012a4c .word 0x08012a4c
|
|
8008e5c: 2400006c .word 0x2400006c
|
|
8008e60: 24007b6c .word 0x24007b6c
|
|
|
|
08008e64 <tcp_eff_send_mss_netif>:
|
|
* by calculating the minimum of TCP_MSS and the mtu (if set) of the target
|
|
* netif (if not NULL).
|
|
*/
|
|
u16_t
|
|
tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, const ip_addr_t *dest)
|
|
{
|
|
8008e64: b580 push {r7, lr}
|
|
8008e66: b086 sub sp, #24
|
|
8008e68: af00 add r7, sp, #0
|
|
8008e6a: 4603 mov r3, r0
|
|
8008e6c: 60b9 str r1, [r7, #8]
|
|
8008e6e: 607a str r2, [r7, #4]
|
|
8008e70: 81fb strh r3, [r7, #14]
|
|
u16_t mss_s;
|
|
u16_t mtu;
|
|
|
|
LWIP_UNUSED_ARG(dest); /* in case IPv6 is disabled */
|
|
|
|
LWIP_ASSERT("tcp_eff_send_mss_netif: invalid dst_ip", dest != NULL);
|
|
8008e72: 687b ldr r3, [r7, #4]
|
|
8008e74: 2b00 cmp r3, #0
|
|
8008e76: d106 bne.n 8008e86 <tcp_eff_send_mss_netif+0x22>
|
|
8008e78: 4b14 ldr r3, [pc, #80] ; (8008ecc <tcp_eff_send_mss_netif+0x68>)
|
|
8008e7a: f640 02c5 movw r2, #2245 ; 0x8c5
|
|
8008e7e: 4914 ldr r1, [pc, #80] ; (8008ed0 <tcp_eff_send_mss_netif+0x6c>)
|
|
8008e80: 4814 ldr r0, [pc, #80] ; (8008ed4 <tcp_eff_send_mss_netif+0x70>)
|
|
8008e82: f007 fea1 bl 8010bc8 <iprintf>
|
|
else
|
|
#endif /* LWIP_IPV4 */
|
|
#endif /* LWIP_IPV6 */
|
|
#if LWIP_IPV4
|
|
{
|
|
if (outif == NULL) {
|
|
8008e86: 68bb ldr r3, [r7, #8]
|
|
8008e88: 2b00 cmp r3, #0
|
|
8008e8a: d101 bne.n 8008e90 <tcp_eff_send_mss_netif+0x2c>
|
|
return sendmss;
|
|
8008e8c: 89fb ldrh r3, [r7, #14]
|
|
8008e8e: e019 b.n 8008ec4 <tcp_eff_send_mss_netif+0x60>
|
|
}
|
|
mtu = outif->mtu;
|
|
8008e90: 68bb ldr r3, [r7, #8]
|
|
8008e92: 8c9b ldrh r3, [r3, #36] ; 0x24
|
|
8008e94: 82fb strh r3, [r7, #22]
|
|
}
|
|
#endif /* LWIP_IPV4 */
|
|
|
|
if (mtu != 0) {
|
|
8008e96: 8afb ldrh r3, [r7, #22]
|
|
8008e98: 2b00 cmp r3, #0
|
|
8008e9a: d012 beq.n 8008ec2 <tcp_eff_send_mss_netif+0x5e>
|
|
else
|
|
#endif /* LWIP_IPV4 */
|
|
#endif /* LWIP_IPV6 */
|
|
#if LWIP_IPV4
|
|
{
|
|
offset = IP_HLEN + TCP_HLEN;
|
|
8008e9c: 2328 movs r3, #40 ; 0x28
|
|
8008e9e: 82bb strh r3, [r7, #20]
|
|
}
|
|
#endif /* LWIP_IPV4 */
|
|
mss_s = (mtu > offset) ? (u16_t)(mtu - offset) : 0;
|
|
8008ea0: 8afa ldrh r2, [r7, #22]
|
|
8008ea2: 8abb ldrh r3, [r7, #20]
|
|
8008ea4: 429a cmp r2, r3
|
|
8008ea6: d904 bls.n 8008eb2 <tcp_eff_send_mss_netif+0x4e>
|
|
8008ea8: 8afa ldrh r2, [r7, #22]
|
|
8008eaa: 8abb ldrh r3, [r7, #20]
|
|
8008eac: 1ad3 subs r3, r2, r3
|
|
8008eae: b29b uxth r3, r3
|
|
8008eb0: e000 b.n 8008eb4 <tcp_eff_send_mss_netif+0x50>
|
|
8008eb2: 2300 movs r3, #0
|
|
8008eb4: 827b strh r3, [r7, #18]
|
|
/* RFC 1122, chap 4.2.2.6:
|
|
* Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize
|
|
* We correct for TCP options in tcp_write(), and don't support IP options.
|
|
*/
|
|
sendmss = LWIP_MIN(sendmss, mss_s);
|
|
8008eb6: 8a7a ldrh r2, [r7, #18]
|
|
8008eb8: 89fb ldrh r3, [r7, #14]
|
|
8008eba: 4293 cmp r3, r2
|
|
8008ebc: bf28 it cs
|
|
8008ebe: 4613 movcs r3, r2
|
|
8008ec0: 81fb strh r3, [r7, #14]
|
|
}
|
|
return sendmss;
|
|
8008ec2: 89fb ldrh r3, [r7, #14]
|
|
}
|
|
8008ec4: 4618 mov r0, r3
|
|
8008ec6: 3718 adds r7, #24
|
|
8008ec8: 46bd mov sp, r7
|
|
8008eca: bd80 pop {r7, pc}
|
|
8008ecc: 08012a08 .word 0x08012a08
|
|
8008ed0: 08013114 .word 0x08013114
|
|
8008ed4: 08012a4c .word 0x08012a4c
|
|
|
|
08008ed8 <tcp_netif_ip_addr_changed_pcblist>:
|
|
#endif /* TCP_CALCULATE_EFF_SEND_MSS */
|
|
|
|
/** Helper function for tcp_netif_ip_addr_changed() that iterates a pcb list */
|
|
static void
|
|
tcp_netif_ip_addr_changed_pcblist(const ip_addr_t *old_addr, struct tcp_pcb *pcb_list)
|
|
{
|
|
8008ed8: b580 push {r7, lr}
|
|
8008eda: b084 sub sp, #16
|
|
8008edc: af00 add r7, sp, #0
|
|
8008ede: 6078 str r0, [r7, #4]
|
|
8008ee0: 6039 str r1, [r7, #0]
|
|
struct tcp_pcb *pcb;
|
|
pcb = pcb_list;
|
|
8008ee2: 683b ldr r3, [r7, #0]
|
|
8008ee4: 60fb str r3, [r7, #12]
|
|
|
|
LWIP_ASSERT("tcp_netif_ip_addr_changed_pcblist: invalid old_addr", old_addr != NULL);
|
|
8008ee6: 687b ldr r3, [r7, #4]
|
|
8008ee8: 2b00 cmp r3, #0
|
|
8008eea: d11d bne.n 8008f28 <tcp_netif_ip_addr_changed_pcblist+0x50>
|
|
8008eec: 4b12 ldr r3, [pc, #72] ; (8008f38 <tcp_netif_ip_addr_changed_pcblist+0x60>)
|
|
8008eee: f44f 6210 mov.w r2, #2304 ; 0x900
|
|
8008ef2: 4912 ldr r1, [pc, #72] ; (8008f3c <tcp_netif_ip_addr_changed_pcblist+0x64>)
|
|
8008ef4: 4812 ldr r0, [pc, #72] ; (8008f40 <tcp_netif_ip_addr_changed_pcblist+0x68>)
|
|
8008ef6: f007 fe67 bl 8010bc8 <iprintf>
|
|
|
|
while (pcb != NULL) {
|
|
8008efa: e015 b.n 8008f28 <tcp_netif_ip_addr_changed_pcblist+0x50>
|
|
/* PCB bound to current local interface address? */
|
|
if (ip_addr_cmp(&pcb->local_ip, old_addr)
|
|
8008efc: 68fb ldr r3, [r7, #12]
|
|
8008efe: 681a ldr r2, [r3, #0]
|
|
8008f00: 687b ldr r3, [r7, #4]
|
|
8008f02: 681b ldr r3, [r3, #0]
|
|
8008f04: 429a cmp r2, r3
|
|
8008f06: d10c bne.n 8008f22 <tcp_netif_ip_addr_changed_pcblist+0x4a>
|
|
/* connections to link-local addresses must persist (RFC3927 ch. 1.9) */
|
|
&& (!IP_IS_V4_VAL(pcb->local_ip) || !ip4_addr_islinklocal(ip_2_ip4(&pcb->local_ip)))
|
|
#endif /* LWIP_AUTOIP */
|
|
) {
|
|
/* this connection must be aborted */
|
|
struct tcp_pcb *next = pcb->next;
|
|
8008f08: 68fb ldr r3, [r7, #12]
|
|
8008f0a: 68db ldr r3, [r3, #12]
|
|
8008f0c: 60bb str r3, [r7, #8]
|
|
LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb));
|
|
8008f0e: 68f9 ldr r1, [r7, #12]
|
|
8008f10: 480c ldr r0, [pc, #48] ; (8008f44 <tcp_netif_ip_addr_changed_pcblist+0x6c>)
|
|
8008f12: f007 fe59 bl 8010bc8 <iprintf>
|
|
tcp_abort(pcb);
|
|
8008f16: 68f8 ldr r0, [r7, #12]
|
|
8008f18: f7fe fde4 bl 8007ae4 <tcp_abort>
|
|
pcb = next;
|
|
8008f1c: 68bb ldr r3, [r7, #8]
|
|
8008f1e: 60fb str r3, [r7, #12]
|
|
8008f20: e002 b.n 8008f28 <tcp_netif_ip_addr_changed_pcblist+0x50>
|
|
} else {
|
|
pcb = pcb->next;
|
|
8008f22: 68fb ldr r3, [r7, #12]
|
|
8008f24: 68db ldr r3, [r3, #12]
|
|
8008f26: 60fb str r3, [r7, #12]
|
|
while (pcb != NULL) {
|
|
8008f28: 68fb ldr r3, [r7, #12]
|
|
8008f2a: 2b00 cmp r3, #0
|
|
8008f2c: d1e6 bne.n 8008efc <tcp_netif_ip_addr_changed_pcblist+0x24>
|
|
}
|
|
}
|
|
}
|
|
8008f2e: bf00 nop
|
|
8008f30: bf00 nop
|
|
8008f32: 3710 adds r7, #16
|
|
8008f34: 46bd mov sp, r7
|
|
8008f36: bd80 pop {r7, pc}
|
|
8008f38: 08012a08 .word 0x08012a08
|
|
8008f3c: 0801313c .word 0x0801313c
|
|
8008f40: 08012a4c .word 0x08012a4c
|
|
8008f44: 08013170 .word 0x08013170
|
|
|
|
08008f48 <tcp_netif_ip_addr_changed>:
|
|
* @param old_addr IP address of the netif before change
|
|
* @param new_addr IP address of the netif after change or NULL if netif has been removed
|
|
*/
|
|
void
|
|
tcp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
|
|
{
|
|
8008f48: b580 push {r7, lr}
|
|
8008f4a: b084 sub sp, #16
|
|
8008f4c: af00 add r7, sp, #0
|
|
8008f4e: 6078 str r0, [r7, #4]
|
|
8008f50: 6039 str r1, [r7, #0]
|
|
struct tcp_pcb_listen *lpcb;
|
|
|
|
if (!ip_addr_isany(old_addr)) {
|
|
8008f52: 687b ldr r3, [r7, #4]
|
|
8008f54: 2b00 cmp r3, #0
|
|
8008f56: d02a beq.n 8008fae <tcp_netif_ip_addr_changed+0x66>
|
|
8008f58: 687b ldr r3, [r7, #4]
|
|
8008f5a: 681b ldr r3, [r3, #0]
|
|
8008f5c: 2b00 cmp r3, #0
|
|
8008f5e: d026 beq.n 8008fae <tcp_netif_ip_addr_changed+0x66>
|
|
tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_active_pcbs);
|
|
8008f60: 4b15 ldr r3, [pc, #84] ; (8008fb8 <tcp_netif_ip_addr_changed+0x70>)
|
|
8008f62: 681b ldr r3, [r3, #0]
|
|
8008f64: 4619 mov r1, r3
|
|
8008f66: 6878 ldr r0, [r7, #4]
|
|
8008f68: f7ff ffb6 bl 8008ed8 <tcp_netif_ip_addr_changed_pcblist>
|
|
tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_bound_pcbs);
|
|
8008f6c: 4b13 ldr r3, [pc, #76] ; (8008fbc <tcp_netif_ip_addr_changed+0x74>)
|
|
8008f6e: 681b ldr r3, [r3, #0]
|
|
8008f70: 4619 mov r1, r3
|
|
8008f72: 6878 ldr r0, [r7, #4]
|
|
8008f74: f7ff ffb0 bl 8008ed8 <tcp_netif_ip_addr_changed_pcblist>
|
|
|
|
if (!ip_addr_isany(new_addr)) {
|
|
8008f78: 683b ldr r3, [r7, #0]
|
|
8008f7a: 2b00 cmp r3, #0
|
|
8008f7c: d017 beq.n 8008fae <tcp_netif_ip_addr_changed+0x66>
|
|
8008f7e: 683b ldr r3, [r7, #0]
|
|
8008f80: 681b ldr r3, [r3, #0]
|
|
8008f82: 2b00 cmp r3, #0
|
|
8008f84: d013 beq.n 8008fae <tcp_netif_ip_addr_changed+0x66>
|
|
/* PCB bound to current local interface address? */
|
|
for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
|
|
8008f86: 4b0e ldr r3, [pc, #56] ; (8008fc0 <tcp_netif_ip_addr_changed+0x78>)
|
|
8008f88: 681b ldr r3, [r3, #0]
|
|
8008f8a: 60fb str r3, [r7, #12]
|
|
8008f8c: e00c b.n 8008fa8 <tcp_netif_ip_addr_changed+0x60>
|
|
/* PCB bound to current local interface address? */
|
|
if (ip_addr_cmp(&lpcb->local_ip, old_addr)) {
|
|
8008f8e: 68fb ldr r3, [r7, #12]
|
|
8008f90: 681a ldr r2, [r3, #0]
|
|
8008f92: 687b ldr r3, [r7, #4]
|
|
8008f94: 681b ldr r3, [r3, #0]
|
|
8008f96: 429a cmp r2, r3
|
|
8008f98: d103 bne.n 8008fa2 <tcp_netif_ip_addr_changed+0x5a>
|
|
/* The PCB is listening to the old ipaddr and
|
|
* is set to listen to the new one instead */
|
|
ip_addr_copy(lpcb->local_ip, *new_addr);
|
|
8008f9a: 683b ldr r3, [r7, #0]
|
|
8008f9c: 681a ldr r2, [r3, #0]
|
|
8008f9e: 68fb ldr r3, [r7, #12]
|
|
8008fa0: 601a str r2, [r3, #0]
|
|
for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
|
|
8008fa2: 68fb ldr r3, [r7, #12]
|
|
8008fa4: 68db ldr r3, [r3, #12]
|
|
8008fa6: 60fb str r3, [r7, #12]
|
|
8008fa8: 68fb ldr r3, [r7, #12]
|
|
8008faa: 2b00 cmp r3, #0
|
|
8008fac: d1ef bne.n 8008f8e <tcp_netif_ip_addr_changed+0x46>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
8008fae: bf00 nop
|
|
8008fb0: 3710 adds r7, #16
|
|
8008fb2: 46bd mov sp, r7
|
|
8008fb4: bd80 pop {r7, pc}
|
|
8008fb6: bf00 nop
|
|
8008fb8: 24007b78 .word 0x24007b78
|
|
8008fbc: 24007b70 .word 0x24007b70
|
|
8008fc0: 24007b74 .word 0x24007b74
|
|
|
|
08008fc4 <tcp_free_ooseq>:
|
|
|
|
#if TCP_QUEUE_OOSEQ
|
|
/* Free all ooseq pbufs (and possibly reset SACK state) */
|
|
void
|
|
tcp_free_ooseq(struct tcp_pcb *pcb)
|
|
{
|
|
8008fc4: b580 push {r7, lr}
|
|
8008fc6: b082 sub sp, #8
|
|
8008fc8: af00 add r7, sp, #0
|
|
8008fca: 6078 str r0, [r7, #4]
|
|
if (pcb->ooseq) {
|
|
8008fcc: 687b ldr r3, [r7, #4]
|
|
8008fce: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
8008fd0: 2b00 cmp r3, #0
|
|
8008fd2: d007 beq.n 8008fe4 <tcp_free_ooseq+0x20>
|
|
tcp_segs_free(pcb->ooseq);
|
|
8008fd4: 687b ldr r3, [r7, #4]
|
|
8008fd6: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
8008fd8: 4618 mov r0, r3
|
|
8008fda: f7ff fbb7 bl 800874c <tcp_segs_free>
|
|
pcb->ooseq = NULL;
|
|
8008fde: 687b ldr r3, [r7, #4]
|
|
8008fe0: 2200 movs r2, #0
|
|
8008fe2: 675a str r2, [r3, #116] ; 0x74
|
|
#if LWIP_TCP_SACK_OUT
|
|
memset(pcb->rcv_sacks, 0, sizeof(pcb->rcv_sacks));
|
|
#endif /* LWIP_TCP_SACK_OUT */
|
|
}
|
|
}
|
|
8008fe4: bf00 nop
|
|
8008fe6: 3708 adds r7, #8
|
|
8008fe8: 46bd mov sp, r7
|
|
8008fea: bd80 pop {r7, pc}
|
|
|
|
08008fec <tcp_input>:
|
|
* @param p received TCP segment to process (p->payload pointing to the TCP header)
|
|
* @param inp network interface on which this segment was received
|
|
*/
|
|
void
|
|
tcp_input(struct pbuf *p, struct netif *inp)
|
|
{
|
|
8008fec: b590 push {r4, r7, lr}
|
|
8008fee: b08d sub sp, #52 ; 0x34
|
|
8008ff0: af04 add r7, sp, #16
|
|
8008ff2: 6078 str r0, [r7, #4]
|
|
8008ff4: 6039 str r1, [r7, #0]
|
|
u8_t hdrlen_bytes;
|
|
err_t err;
|
|
|
|
LWIP_UNUSED_ARG(inp);
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
LWIP_ASSERT("tcp_input: invalid pbuf", p != NULL);
|
|
8008ff6: 687b ldr r3, [r7, #4]
|
|
8008ff8: 2b00 cmp r3, #0
|
|
8008ffa: d105 bne.n 8009008 <tcp_input+0x1c>
|
|
8008ffc: 4b9b ldr r3, [pc, #620] ; (800926c <tcp_input+0x280>)
|
|
8008ffe: 2283 movs r2, #131 ; 0x83
|
|
8009000: 499b ldr r1, [pc, #620] ; (8009270 <tcp_input+0x284>)
|
|
8009002: 489c ldr r0, [pc, #624] ; (8009274 <tcp_input+0x288>)
|
|
8009004: f007 fde0 bl 8010bc8 <iprintf>
|
|
PERF_START;
|
|
|
|
TCP_STATS_INC(tcp.recv);
|
|
MIB2_STATS_INC(mib2.tcpinsegs);
|
|
|
|
tcphdr = (struct tcp_hdr *)p->payload;
|
|
8009008: 687b ldr r3, [r7, #4]
|
|
800900a: 685b ldr r3, [r3, #4]
|
|
800900c: 4a9a ldr r2, [pc, #616] ; (8009278 <tcp_input+0x28c>)
|
|
800900e: 6013 str r3, [r2, #0]
|
|
#if TCP_INPUT_DEBUG
|
|
tcp_debug_print(tcphdr);
|
|
#endif
|
|
|
|
/* Check that TCP header fits in payload */
|
|
if (p->len < TCP_HLEN) {
|
|
8009010: 687b ldr r3, [r7, #4]
|
|
8009012: 895b ldrh r3, [r3, #10]
|
|
8009014: 2b13 cmp r3, #19
|
|
8009016: f240 83d1 bls.w 80097bc <tcp_input+0x7d0>
|
|
TCP_STATS_INC(tcp.lenerr);
|
|
goto dropped;
|
|
}
|
|
|
|
/* Don't even process incoming broadcasts/multicasts. */
|
|
if (ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()) ||
|
|
800901a: 4b98 ldr r3, [pc, #608] ; (800927c <tcp_input+0x290>)
|
|
800901c: 695b ldr r3, [r3, #20]
|
|
800901e: 4a97 ldr r2, [pc, #604] ; (800927c <tcp_input+0x290>)
|
|
8009020: 6812 ldr r2, [r2, #0]
|
|
8009022: 4611 mov r1, r2
|
|
8009024: 4618 mov r0, r3
|
|
8009026: f006 f9c5 bl 800f3b4 <ip4_addr_isbroadcast_u32>
|
|
800902a: 4603 mov r3, r0
|
|
800902c: 2b00 cmp r3, #0
|
|
800902e: f040 83c7 bne.w 80097c0 <tcp_input+0x7d4>
|
|
ip_addr_ismulticast(ip_current_dest_addr())) {
|
|
8009032: 4b92 ldr r3, [pc, #584] ; (800927c <tcp_input+0x290>)
|
|
8009034: 695b ldr r3, [r3, #20]
|
|
8009036: f003 03f0 and.w r3, r3, #240 ; 0xf0
|
|
if (ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()) ||
|
|
800903a: 2be0 cmp r3, #224 ; 0xe0
|
|
800903c: f000 83c0 beq.w 80097c0 <tcp_input+0x7d4>
|
|
}
|
|
}
|
|
#endif /* CHECKSUM_CHECK_TCP */
|
|
|
|
/* sanity-check header length */
|
|
hdrlen_bytes = TCPH_HDRLEN_BYTES(tcphdr);
|
|
8009040: 4b8d ldr r3, [pc, #564] ; (8009278 <tcp_input+0x28c>)
|
|
8009042: 681b ldr r3, [r3, #0]
|
|
8009044: 899b ldrh r3, [r3, #12]
|
|
8009046: b29b uxth r3, r3
|
|
8009048: 4618 mov r0, r3
|
|
800904a: f7fc fa7f bl 800554c <lwip_htons>
|
|
800904e: 4603 mov r3, r0
|
|
8009050: 0b1b lsrs r3, r3, #12
|
|
8009052: b29b uxth r3, r3
|
|
8009054: b2db uxtb r3, r3
|
|
8009056: 009b lsls r3, r3, #2
|
|
8009058: 74bb strb r3, [r7, #18]
|
|
if ((hdrlen_bytes < TCP_HLEN) || (hdrlen_bytes > p->tot_len)) {
|
|
800905a: 7cbb ldrb r3, [r7, #18]
|
|
800905c: 2b13 cmp r3, #19
|
|
800905e: f240 83b1 bls.w 80097c4 <tcp_input+0x7d8>
|
|
8009062: 7cbb ldrb r3, [r7, #18]
|
|
8009064: b29a uxth r2, r3
|
|
8009066: 687b ldr r3, [r7, #4]
|
|
8009068: 891b ldrh r3, [r3, #8]
|
|
800906a: 429a cmp r2, r3
|
|
800906c: f200 83aa bhi.w 80097c4 <tcp_input+0x7d8>
|
|
goto dropped;
|
|
}
|
|
|
|
/* Move the payload pointer in the pbuf so that it points to the
|
|
TCP data instead of the TCP header. */
|
|
tcphdr_optlen = (u16_t)(hdrlen_bytes - TCP_HLEN);
|
|
8009070: 7cbb ldrb r3, [r7, #18]
|
|
8009072: b29b uxth r3, r3
|
|
8009074: 3b14 subs r3, #20
|
|
8009076: b29a uxth r2, r3
|
|
8009078: 4b81 ldr r3, [pc, #516] ; (8009280 <tcp_input+0x294>)
|
|
800907a: 801a strh r2, [r3, #0]
|
|
tcphdr_opt2 = NULL;
|
|
800907c: 4b81 ldr r3, [pc, #516] ; (8009284 <tcp_input+0x298>)
|
|
800907e: 2200 movs r2, #0
|
|
8009080: 601a str r2, [r3, #0]
|
|
if (p->len >= hdrlen_bytes) {
|
|
8009082: 687b ldr r3, [r7, #4]
|
|
8009084: 895a ldrh r2, [r3, #10]
|
|
8009086: 7cbb ldrb r3, [r7, #18]
|
|
8009088: b29b uxth r3, r3
|
|
800908a: 429a cmp r2, r3
|
|
800908c: d309 bcc.n 80090a2 <tcp_input+0xb6>
|
|
/* all options are in the first pbuf */
|
|
tcphdr_opt1len = tcphdr_optlen;
|
|
800908e: 4b7c ldr r3, [pc, #496] ; (8009280 <tcp_input+0x294>)
|
|
8009090: 881a ldrh r2, [r3, #0]
|
|
8009092: 4b7d ldr r3, [pc, #500] ; (8009288 <tcp_input+0x29c>)
|
|
8009094: 801a strh r2, [r3, #0]
|
|
pbuf_remove_header(p, hdrlen_bytes); /* cannot fail */
|
|
8009096: 7cbb ldrb r3, [r7, #18]
|
|
8009098: 4619 mov r1, r3
|
|
800909a: 6878 ldr r0, [r7, #4]
|
|
800909c: f7fd ff14 bl 8006ec8 <pbuf_remove_header>
|
|
80090a0: e04e b.n 8009140 <tcp_input+0x154>
|
|
} else {
|
|
u16_t opt2len;
|
|
/* TCP header fits into first pbuf, options don't - data is in the next pbuf */
|
|
/* there must be a next pbuf, due to hdrlen_bytes sanity check above */
|
|
LWIP_ASSERT("p->next != NULL", p->next != NULL);
|
|
80090a2: 687b ldr r3, [r7, #4]
|
|
80090a4: 681b ldr r3, [r3, #0]
|
|
80090a6: 2b00 cmp r3, #0
|
|
80090a8: d105 bne.n 80090b6 <tcp_input+0xca>
|
|
80090aa: 4b70 ldr r3, [pc, #448] ; (800926c <tcp_input+0x280>)
|
|
80090ac: 22c2 movs r2, #194 ; 0xc2
|
|
80090ae: 4977 ldr r1, [pc, #476] ; (800928c <tcp_input+0x2a0>)
|
|
80090b0: 4870 ldr r0, [pc, #448] ; (8009274 <tcp_input+0x288>)
|
|
80090b2: f007 fd89 bl 8010bc8 <iprintf>
|
|
|
|
/* advance over the TCP header (cannot fail) */
|
|
pbuf_remove_header(p, TCP_HLEN);
|
|
80090b6: 2114 movs r1, #20
|
|
80090b8: 6878 ldr r0, [r7, #4]
|
|
80090ba: f7fd ff05 bl 8006ec8 <pbuf_remove_header>
|
|
|
|
/* determine how long the first and second parts of the options are */
|
|
tcphdr_opt1len = p->len;
|
|
80090be: 687b ldr r3, [r7, #4]
|
|
80090c0: 895a ldrh r2, [r3, #10]
|
|
80090c2: 4b71 ldr r3, [pc, #452] ; (8009288 <tcp_input+0x29c>)
|
|
80090c4: 801a strh r2, [r3, #0]
|
|
opt2len = (u16_t)(tcphdr_optlen - tcphdr_opt1len);
|
|
80090c6: 4b6e ldr r3, [pc, #440] ; (8009280 <tcp_input+0x294>)
|
|
80090c8: 881a ldrh r2, [r3, #0]
|
|
80090ca: 4b6f ldr r3, [pc, #444] ; (8009288 <tcp_input+0x29c>)
|
|
80090cc: 881b ldrh r3, [r3, #0]
|
|
80090ce: 1ad3 subs r3, r2, r3
|
|
80090d0: 823b strh r3, [r7, #16]
|
|
|
|
/* options continue in the next pbuf: set p to zero length and hide the
|
|
options in the next pbuf (adjusting p->tot_len) */
|
|
pbuf_remove_header(p, tcphdr_opt1len);
|
|
80090d2: 4b6d ldr r3, [pc, #436] ; (8009288 <tcp_input+0x29c>)
|
|
80090d4: 881b ldrh r3, [r3, #0]
|
|
80090d6: 4619 mov r1, r3
|
|
80090d8: 6878 ldr r0, [r7, #4]
|
|
80090da: f7fd fef5 bl 8006ec8 <pbuf_remove_header>
|
|
|
|
/* check that the options fit in the second pbuf */
|
|
if (opt2len > p->next->len) {
|
|
80090de: 687b ldr r3, [r7, #4]
|
|
80090e0: 681b ldr r3, [r3, #0]
|
|
80090e2: 895b ldrh r3, [r3, #10]
|
|
80090e4: 8a3a ldrh r2, [r7, #16]
|
|
80090e6: 429a cmp r2, r3
|
|
80090e8: f200 836e bhi.w 80097c8 <tcp_input+0x7dc>
|
|
TCP_STATS_INC(tcp.lenerr);
|
|
goto dropped;
|
|
}
|
|
|
|
/* remember the pointer to the second part of the options */
|
|
tcphdr_opt2 = (u8_t *)p->next->payload;
|
|
80090ec: 687b ldr r3, [r7, #4]
|
|
80090ee: 681b ldr r3, [r3, #0]
|
|
80090f0: 685b ldr r3, [r3, #4]
|
|
80090f2: 4a64 ldr r2, [pc, #400] ; (8009284 <tcp_input+0x298>)
|
|
80090f4: 6013 str r3, [r2, #0]
|
|
|
|
/* advance p->next to point after the options, and manually
|
|
adjust p->tot_len to keep it consistent with the changed p->next */
|
|
pbuf_remove_header(p->next, opt2len);
|
|
80090f6: 687b ldr r3, [r7, #4]
|
|
80090f8: 681b ldr r3, [r3, #0]
|
|
80090fa: 8a3a ldrh r2, [r7, #16]
|
|
80090fc: 4611 mov r1, r2
|
|
80090fe: 4618 mov r0, r3
|
|
8009100: f7fd fee2 bl 8006ec8 <pbuf_remove_header>
|
|
p->tot_len = (u16_t)(p->tot_len - opt2len);
|
|
8009104: 687b ldr r3, [r7, #4]
|
|
8009106: 891a ldrh r2, [r3, #8]
|
|
8009108: 8a3b ldrh r3, [r7, #16]
|
|
800910a: 1ad3 subs r3, r2, r3
|
|
800910c: b29a uxth r2, r3
|
|
800910e: 687b ldr r3, [r7, #4]
|
|
8009110: 811a strh r2, [r3, #8]
|
|
|
|
LWIP_ASSERT("p->len == 0", p->len == 0);
|
|
8009112: 687b ldr r3, [r7, #4]
|
|
8009114: 895b ldrh r3, [r3, #10]
|
|
8009116: 2b00 cmp r3, #0
|
|
8009118: d005 beq.n 8009126 <tcp_input+0x13a>
|
|
800911a: 4b54 ldr r3, [pc, #336] ; (800926c <tcp_input+0x280>)
|
|
800911c: 22df movs r2, #223 ; 0xdf
|
|
800911e: 495c ldr r1, [pc, #368] ; (8009290 <tcp_input+0x2a4>)
|
|
8009120: 4854 ldr r0, [pc, #336] ; (8009274 <tcp_input+0x288>)
|
|
8009122: f007 fd51 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("p->tot_len == p->next->tot_len", p->tot_len == p->next->tot_len);
|
|
8009126: 687b ldr r3, [r7, #4]
|
|
8009128: 891a ldrh r2, [r3, #8]
|
|
800912a: 687b ldr r3, [r7, #4]
|
|
800912c: 681b ldr r3, [r3, #0]
|
|
800912e: 891b ldrh r3, [r3, #8]
|
|
8009130: 429a cmp r2, r3
|
|
8009132: d005 beq.n 8009140 <tcp_input+0x154>
|
|
8009134: 4b4d ldr r3, [pc, #308] ; (800926c <tcp_input+0x280>)
|
|
8009136: 22e0 movs r2, #224 ; 0xe0
|
|
8009138: 4956 ldr r1, [pc, #344] ; (8009294 <tcp_input+0x2a8>)
|
|
800913a: 484e ldr r0, [pc, #312] ; (8009274 <tcp_input+0x288>)
|
|
800913c: f007 fd44 bl 8010bc8 <iprintf>
|
|
}
|
|
|
|
/* Convert fields in TCP header to host byte order. */
|
|
tcphdr->src = lwip_ntohs(tcphdr->src);
|
|
8009140: 4b4d ldr r3, [pc, #308] ; (8009278 <tcp_input+0x28c>)
|
|
8009142: 681b ldr r3, [r3, #0]
|
|
8009144: 881b ldrh r3, [r3, #0]
|
|
8009146: b29b uxth r3, r3
|
|
8009148: 4a4b ldr r2, [pc, #300] ; (8009278 <tcp_input+0x28c>)
|
|
800914a: 6814 ldr r4, [r2, #0]
|
|
800914c: 4618 mov r0, r3
|
|
800914e: f7fc f9fd bl 800554c <lwip_htons>
|
|
8009152: 4603 mov r3, r0
|
|
8009154: 8023 strh r3, [r4, #0]
|
|
tcphdr->dest = lwip_ntohs(tcphdr->dest);
|
|
8009156: 4b48 ldr r3, [pc, #288] ; (8009278 <tcp_input+0x28c>)
|
|
8009158: 681b ldr r3, [r3, #0]
|
|
800915a: 885b ldrh r3, [r3, #2]
|
|
800915c: b29b uxth r3, r3
|
|
800915e: 4a46 ldr r2, [pc, #280] ; (8009278 <tcp_input+0x28c>)
|
|
8009160: 6814 ldr r4, [r2, #0]
|
|
8009162: 4618 mov r0, r3
|
|
8009164: f7fc f9f2 bl 800554c <lwip_htons>
|
|
8009168: 4603 mov r3, r0
|
|
800916a: 8063 strh r3, [r4, #2]
|
|
seqno = tcphdr->seqno = lwip_ntohl(tcphdr->seqno);
|
|
800916c: 4b42 ldr r3, [pc, #264] ; (8009278 <tcp_input+0x28c>)
|
|
800916e: 681b ldr r3, [r3, #0]
|
|
8009170: 685b ldr r3, [r3, #4]
|
|
8009172: 4a41 ldr r2, [pc, #260] ; (8009278 <tcp_input+0x28c>)
|
|
8009174: 6814 ldr r4, [r2, #0]
|
|
8009176: 4618 mov r0, r3
|
|
8009178: f7fc f9fd bl 8005576 <lwip_htonl>
|
|
800917c: 4603 mov r3, r0
|
|
800917e: 6063 str r3, [r4, #4]
|
|
8009180: 6863 ldr r3, [r4, #4]
|
|
8009182: 4a45 ldr r2, [pc, #276] ; (8009298 <tcp_input+0x2ac>)
|
|
8009184: 6013 str r3, [r2, #0]
|
|
ackno = tcphdr->ackno = lwip_ntohl(tcphdr->ackno);
|
|
8009186: 4b3c ldr r3, [pc, #240] ; (8009278 <tcp_input+0x28c>)
|
|
8009188: 681b ldr r3, [r3, #0]
|
|
800918a: 689b ldr r3, [r3, #8]
|
|
800918c: 4a3a ldr r2, [pc, #232] ; (8009278 <tcp_input+0x28c>)
|
|
800918e: 6814 ldr r4, [r2, #0]
|
|
8009190: 4618 mov r0, r3
|
|
8009192: f7fc f9f0 bl 8005576 <lwip_htonl>
|
|
8009196: 4603 mov r3, r0
|
|
8009198: 60a3 str r3, [r4, #8]
|
|
800919a: 68a3 ldr r3, [r4, #8]
|
|
800919c: 4a3f ldr r2, [pc, #252] ; (800929c <tcp_input+0x2b0>)
|
|
800919e: 6013 str r3, [r2, #0]
|
|
tcphdr->wnd = lwip_ntohs(tcphdr->wnd);
|
|
80091a0: 4b35 ldr r3, [pc, #212] ; (8009278 <tcp_input+0x28c>)
|
|
80091a2: 681b ldr r3, [r3, #0]
|
|
80091a4: 89db ldrh r3, [r3, #14]
|
|
80091a6: b29b uxth r3, r3
|
|
80091a8: 4a33 ldr r2, [pc, #204] ; (8009278 <tcp_input+0x28c>)
|
|
80091aa: 6814 ldr r4, [r2, #0]
|
|
80091ac: 4618 mov r0, r3
|
|
80091ae: f7fc f9cd bl 800554c <lwip_htons>
|
|
80091b2: 4603 mov r3, r0
|
|
80091b4: 81e3 strh r3, [r4, #14]
|
|
|
|
flags = TCPH_FLAGS(tcphdr);
|
|
80091b6: 4b30 ldr r3, [pc, #192] ; (8009278 <tcp_input+0x28c>)
|
|
80091b8: 681b ldr r3, [r3, #0]
|
|
80091ba: 899b ldrh r3, [r3, #12]
|
|
80091bc: b29b uxth r3, r3
|
|
80091be: 4618 mov r0, r3
|
|
80091c0: f7fc f9c4 bl 800554c <lwip_htons>
|
|
80091c4: 4603 mov r3, r0
|
|
80091c6: b2db uxtb r3, r3
|
|
80091c8: f003 033f and.w r3, r3, #63 ; 0x3f
|
|
80091cc: b2da uxtb r2, r3
|
|
80091ce: 4b34 ldr r3, [pc, #208] ; (80092a0 <tcp_input+0x2b4>)
|
|
80091d0: 701a strb r2, [r3, #0]
|
|
tcplen = p->tot_len;
|
|
80091d2: 687b ldr r3, [r7, #4]
|
|
80091d4: 891a ldrh r2, [r3, #8]
|
|
80091d6: 4b33 ldr r3, [pc, #204] ; (80092a4 <tcp_input+0x2b8>)
|
|
80091d8: 801a strh r2, [r3, #0]
|
|
if (flags & (TCP_FIN | TCP_SYN)) {
|
|
80091da: 4b31 ldr r3, [pc, #196] ; (80092a0 <tcp_input+0x2b4>)
|
|
80091dc: 781b ldrb r3, [r3, #0]
|
|
80091de: f003 0303 and.w r3, r3, #3
|
|
80091e2: 2b00 cmp r3, #0
|
|
80091e4: d00c beq.n 8009200 <tcp_input+0x214>
|
|
tcplen++;
|
|
80091e6: 4b2f ldr r3, [pc, #188] ; (80092a4 <tcp_input+0x2b8>)
|
|
80091e8: 881b ldrh r3, [r3, #0]
|
|
80091ea: 3301 adds r3, #1
|
|
80091ec: b29a uxth r2, r3
|
|
80091ee: 4b2d ldr r3, [pc, #180] ; (80092a4 <tcp_input+0x2b8>)
|
|
80091f0: 801a strh r2, [r3, #0]
|
|
if (tcplen < p->tot_len) {
|
|
80091f2: 687b ldr r3, [r7, #4]
|
|
80091f4: 891a ldrh r2, [r3, #8]
|
|
80091f6: 4b2b ldr r3, [pc, #172] ; (80092a4 <tcp_input+0x2b8>)
|
|
80091f8: 881b ldrh r3, [r3, #0]
|
|
80091fa: 429a cmp r2, r3
|
|
80091fc: f200 82e6 bhi.w 80097cc <tcp_input+0x7e0>
|
|
}
|
|
}
|
|
|
|
/* Demultiplex an incoming segment. First, we check if it is destined
|
|
for an active connection. */
|
|
prev = NULL;
|
|
8009200: 2300 movs r3, #0
|
|
8009202: 61fb str r3, [r7, #28]
|
|
|
|
for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
8009204: 4b28 ldr r3, [pc, #160] ; (80092a8 <tcp_input+0x2bc>)
|
|
8009206: 681b ldr r3, [r3, #0]
|
|
8009208: 61bb str r3, [r7, #24]
|
|
800920a: e09d b.n 8009348 <tcp_input+0x35c>
|
|
LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
|
|
800920c: 69bb ldr r3, [r7, #24]
|
|
800920e: 7d1b ldrb r3, [r3, #20]
|
|
8009210: 2b00 cmp r3, #0
|
|
8009212: d105 bne.n 8009220 <tcp_input+0x234>
|
|
8009214: 4b15 ldr r3, [pc, #84] ; (800926c <tcp_input+0x280>)
|
|
8009216: 22fb movs r2, #251 ; 0xfb
|
|
8009218: 4924 ldr r1, [pc, #144] ; (80092ac <tcp_input+0x2c0>)
|
|
800921a: 4816 ldr r0, [pc, #88] ; (8009274 <tcp_input+0x288>)
|
|
800921c: f007 fcd4 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
|
|
8009220: 69bb ldr r3, [r7, #24]
|
|
8009222: 7d1b ldrb r3, [r3, #20]
|
|
8009224: 2b0a cmp r3, #10
|
|
8009226: d105 bne.n 8009234 <tcp_input+0x248>
|
|
8009228: 4b10 ldr r3, [pc, #64] ; (800926c <tcp_input+0x280>)
|
|
800922a: 22fc movs r2, #252 ; 0xfc
|
|
800922c: 4920 ldr r1, [pc, #128] ; (80092b0 <tcp_input+0x2c4>)
|
|
800922e: 4811 ldr r0, [pc, #68] ; (8009274 <tcp_input+0x288>)
|
|
8009230: f007 fcca bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
|
|
8009234: 69bb ldr r3, [r7, #24]
|
|
8009236: 7d1b ldrb r3, [r3, #20]
|
|
8009238: 2b01 cmp r3, #1
|
|
800923a: d105 bne.n 8009248 <tcp_input+0x25c>
|
|
800923c: 4b0b ldr r3, [pc, #44] ; (800926c <tcp_input+0x280>)
|
|
800923e: 22fd movs r2, #253 ; 0xfd
|
|
8009240: 491c ldr r1, [pc, #112] ; (80092b4 <tcp_input+0x2c8>)
|
|
8009242: 480c ldr r0, [pc, #48] ; (8009274 <tcp_input+0x288>)
|
|
8009244: f007 fcc0 bl 8010bc8 <iprintf>
|
|
|
|
/* check if PCB is bound to specific netif */
|
|
if ((pcb->netif_idx != NETIF_NO_INDEX) &&
|
|
8009248: 69bb ldr r3, [r7, #24]
|
|
800924a: 7a1b ldrb r3, [r3, #8]
|
|
800924c: 2b00 cmp r3, #0
|
|
800924e: d033 beq.n 80092b8 <tcp_input+0x2cc>
|
|
(pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
|
|
8009250: 69bb ldr r3, [r7, #24]
|
|
8009252: 7a1a ldrb r2, [r3, #8]
|
|
8009254: 4b09 ldr r3, [pc, #36] ; (800927c <tcp_input+0x290>)
|
|
8009256: 685b ldr r3, [r3, #4]
|
|
8009258: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
800925c: 3301 adds r3, #1
|
|
800925e: b2db uxtb r3, r3
|
|
if ((pcb->netif_idx != NETIF_NO_INDEX) &&
|
|
8009260: 429a cmp r2, r3
|
|
8009262: d029 beq.n 80092b8 <tcp_input+0x2cc>
|
|
prev = pcb;
|
|
8009264: 69bb ldr r3, [r7, #24]
|
|
8009266: 61fb str r3, [r7, #28]
|
|
continue;
|
|
8009268: e06b b.n 8009342 <tcp_input+0x356>
|
|
800926a: bf00 nop
|
|
800926c: 08013198 .word 0x08013198
|
|
8009270: 080131cc .word 0x080131cc
|
|
8009274: 080131e4 .word 0x080131e4
|
|
8009278: 24007b98 .word 0x24007b98
|
|
800927c: 24004c10 .word 0x24004c10
|
|
8009280: 24007b9c .word 0x24007b9c
|
|
8009284: 24007ba0 .word 0x24007ba0
|
|
8009288: 24007b9e .word 0x24007b9e
|
|
800928c: 0801320c .word 0x0801320c
|
|
8009290: 0801321c .word 0x0801321c
|
|
8009294: 08013228 .word 0x08013228
|
|
8009298: 24007ba8 .word 0x24007ba8
|
|
800929c: 24007bac .word 0x24007bac
|
|
80092a0: 24007bb4 .word 0x24007bb4
|
|
80092a4: 24007bb2 .word 0x24007bb2
|
|
80092a8: 24007b78 .word 0x24007b78
|
|
80092ac: 08013248 .word 0x08013248
|
|
80092b0: 08013270 .word 0x08013270
|
|
80092b4: 0801329c .word 0x0801329c
|
|
}
|
|
|
|
if (pcb->remote_port == tcphdr->src &&
|
|
80092b8: 69bb ldr r3, [r7, #24]
|
|
80092ba: 8b1a ldrh r2, [r3, #24]
|
|
80092bc: 4b72 ldr r3, [pc, #456] ; (8009488 <tcp_input+0x49c>)
|
|
80092be: 681b ldr r3, [r3, #0]
|
|
80092c0: 881b ldrh r3, [r3, #0]
|
|
80092c2: b29b uxth r3, r3
|
|
80092c4: 429a cmp r2, r3
|
|
80092c6: d13a bne.n 800933e <tcp_input+0x352>
|
|
pcb->local_port == tcphdr->dest &&
|
|
80092c8: 69bb ldr r3, [r7, #24]
|
|
80092ca: 8ada ldrh r2, [r3, #22]
|
|
80092cc: 4b6e ldr r3, [pc, #440] ; (8009488 <tcp_input+0x49c>)
|
|
80092ce: 681b ldr r3, [r3, #0]
|
|
80092d0: 885b ldrh r3, [r3, #2]
|
|
80092d2: b29b uxth r3, r3
|
|
if (pcb->remote_port == tcphdr->src &&
|
|
80092d4: 429a cmp r2, r3
|
|
80092d6: d132 bne.n 800933e <tcp_input+0x352>
|
|
ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
|
|
80092d8: 69bb ldr r3, [r7, #24]
|
|
80092da: 685a ldr r2, [r3, #4]
|
|
80092dc: 4b6b ldr r3, [pc, #428] ; (800948c <tcp_input+0x4a0>)
|
|
80092de: 691b ldr r3, [r3, #16]
|
|
pcb->local_port == tcphdr->dest &&
|
|
80092e0: 429a cmp r2, r3
|
|
80092e2: d12c bne.n 800933e <tcp_input+0x352>
|
|
ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
|
|
80092e4: 69bb ldr r3, [r7, #24]
|
|
80092e6: 681a ldr r2, [r3, #0]
|
|
80092e8: 4b68 ldr r3, [pc, #416] ; (800948c <tcp_input+0x4a0>)
|
|
80092ea: 695b ldr r3, [r3, #20]
|
|
ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
|
|
80092ec: 429a cmp r2, r3
|
|
80092ee: d126 bne.n 800933e <tcp_input+0x352>
|
|
/* Move this PCB to the front of the list so that subsequent
|
|
lookups will be faster (we exploit locality in TCP segment
|
|
arrivals). */
|
|
LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
|
|
80092f0: 69bb ldr r3, [r7, #24]
|
|
80092f2: 68db ldr r3, [r3, #12]
|
|
80092f4: 69ba ldr r2, [r7, #24]
|
|
80092f6: 429a cmp r2, r3
|
|
80092f8: d106 bne.n 8009308 <tcp_input+0x31c>
|
|
80092fa: 4b65 ldr r3, [pc, #404] ; (8009490 <tcp_input+0x4a4>)
|
|
80092fc: f240 120d movw r2, #269 ; 0x10d
|
|
8009300: 4964 ldr r1, [pc, #400] ; (8009494 <tcp_input+0x4a8>)
|
|
8009302: 4865 ldr r0, [pc, #404] ; (8009498 <tcp_input+0x4ac>)
|
|
8009304: f007 fc60 bl 8010bc8 <iprintf>
|
|
if (prev != NULL) {
|
|
8009308: 69fb ldr r3, [r7, #28]
|
|
800930a: 2b00 cmp r3, #0
|
|
800930c: d00a beq.n 8009324 <tcp_input+0x338>
|
|
prev->next = pcb->next;
|
|
800930e: 69bb ldr r3, [r7, #24]
|
|
8009310: 68da ldr r2, [r3, #12]
|
|
8009312: 69fb ldr r3, [r7, #28]
|
|
8009314: 60da str r2, [r3, #12]
|
|
pcb->next = tcp_active_pcbs;
|
|
8009316: 4b61 ldr r3, [pc, #388] ; (800949c <tcp_input+0x4b0>)
|
|
8009318: 681a ldr r2, [r3, #0]
|
|
800931a: 69bb ldr r3, [r7, #24]
|
|
800931c: 60da str r2, [r3, #12]
|
|
tcp_active_pcbs = pcb;
|
|
800931e: 4a5f ldr r2, [pc, #380] ; (800949c <tcp_input+0x4b0>)
|
|
8009320: 69bb ldr r3, [r7, #24]
|
|
8009322: 6013 str r3, [r2, #0]
|
|
} else {
|
|
TCP_STATS_INC(tcp.cachehit);
|
|
}
|
|
LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb);
|
|
8009324: 69bb ldr r3, [r7, #24]
|
|
8009326: 68db ldr r3, [r3, #12]
|
|
8009328: 69ba ldr r2, [r7, #24]
|
|
800932a: 429a cmp r2, r3
|
|
800932c: d111 bne.n 8009352 <tcp_input+0x366>
|
|
800932e: 4b58 ldr r3, [pc, #352] ; (8009490 <tcp_input+0x4a4>)
|
|
8009330: f240 1215 movw r2, #277 ; 0x115
|
|
8009334: 495a ldr r1, [pc, #360] ; (80094a0 <tcp_input+0x4b4>)
|
|
8009336: 4858 ldr r0, [pc, #352] ; (8009498 <tcp_input+0x4ac>)
|
|
8009338: f007 fc46 bl 8010bc8 <iprintf>
|
|
break;
|
|
800933c: e009 b.n 8009352 <tcp_input+0x366>
|
|
}
|
|
prev = pcb;
|
|
800933e: 69bb ldr r3, [r7, #24]
|
|
8009340: 61fb str r3, [r7, #28]
|
|
for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
8009342: 69bb ldr r3, [r7, #24]
|
|
8009344: 68db ldr r3, [r3, #12]
|
|
8009346: 61bb str r3, [r7, #24]
|
|
8009348: 69bb ldr r3, [r7, #24]
|
|
800934a: 2b00 cmp r3, #0
|
|
800934c: f47f af5e bne.w 800920c <tcp_input+0x220>
|
|
8009350: e000 b.n 8009354 <tcp_input+0x368>
|
|
break;
|
|
8009352: bf00 nop
|
|
}
|
|
|
|
if (pcb == NULL) {
|
|
8009354: 69bb ldr r3, [r7, #24]
|
|
8009356: 2b00 cmp r3, #0
|
|
8009358: f040 80aa bne.w 80094b0 <tcp_input+0x4c4>
|
|
/* If it did not go to an active connection, we check the connections
|
|
in the TIME-WAIT state. */
|
|
for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
800935c: 4b51 ldr r3, [pc, #324] ; (80094a4 <tcp_input+0x4b8>)
|
|
800935e: 681b ldr r3, [r3, #0]
|
|
8009360: 61bb str r3, [r7, #24]
|
|
8009362: e03f b.n 80093e4 <tcp_input+0x3f8>
|
|
LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
|
|
8009364: 69bb ldr r3, [r7, #24]
|
|
8009366: 7d1b ldrb r3, [r3, #20]
|
|
8009368: 2b0a cmp r3, #10
|
|
800936a: d006 beq.n 800937a <tcp_input+0x38e>
|
|
800936c: 4b48 ldr r3, [pc, #288] ; (8009490 <tcp_input+0x4a4>)
|
|
800936e: f240 121f movw r2, #287 ; 0x11f
|
|
8009372: 494d ldr r1, [pc, #308] ; (80094a8 <tcp_input+0x4bc>)
|
|
8009374: 4848 ldr r0, [pc, #288] ; (8009498 <tcp_input+0x4ac>)
|
|
8009376: f007 fc27 bl 8010bc8 <iprintf>
|
|
|
|
/* check if PCB is bound to specific netif */
|
|
if ((pcb->netif_idx != NETIF_NO_INDEX) &&
|
|
800937a: 69bb ldr r3, [r7, #24]
|
|
800937c: 7a1b ldrb r3, [r3, #8]
|
|
800937e: 2b00 cmp r3, #0
|
|
8009380: d009 beq.n 8009396 <tcp_input+0x3aa>
|
|
(pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
|
|
8009382: 69bb ldr r3, [r7, #24]
|
|
8009384: 7a1a ldrb r2, [r3, #8]
|
|
8009386: 4b41 ldr r3, [pc, #260] ; (800948c <tcp_input+0x4a0>)
|
|
8009388: 685b ldr r3, [r3, #4]
|
|
800938a: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
800938e: 3301 adds r3, #1
|
|
8009390: b2db uxtb r3, r3
|
|
if ((pcb->netif_idx != NETIF_NO_INDEX) &&
|
|
8009392: 429a cmp r2, r3
|
|
8009394: d122 bne.n 80093dc <tcp_input+0x3f0>
|
|
continue;
|
|
}
|
|
|
|
if (pcb->remote_port == tcphdr->src &&
|
|
8009396: 69bb ldr r3, [r7, #24]
|
|
8009398: 8b1a ldrh r2, [r3, #24]
|
|
800939a: 4b3b ldr r3, [pc, #236] ; (8009488 <tcp_input+0x49c>)
|
|
800939c: 681b ldr r3, [r3, #0]
|
|
800939e: 881b ldrh r3, [r3, #0]
|
|
80093a0: b29b uxth r3, r3
|
|
80093a2: 429a cmp r2, r3
|
|
80093a4: d11b bne.n 80093de <tcp_input+0x3f2>
|
|
pcb->local_port == tcphdr->dest &&
|
|
80093a6: 69bb ldr r3, [r7, #24]
|
|
80093a8: 8ada ldrh r2, [r3, #22]
|
|
80093aa: 4b37 ldr r3, [pc, #220] ; (8009488 <tcp_input+0x49c>)
|
|
80093ac: 681b ldr r3, [r3, #0]
|
|
80093ae: 885b ldrh r3, [r3, #2]
|
|
80093b0: b29b uxth r3, r3
|
|
if (pcb->remote_port == tcphdr->src &&
|
|
80093b2: 429a cmp r2, r3
|
|
80093b4: d113 bne.n 80093de <tcp_input+0x3f2>
|
|
ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
|
|
80093b6: 69bb ldr r3, [r7, #24]
|
|
80093b8: 685a ldr r2, [r3, #4]
|
|
80093ba: 4b34 ldr r3, [pc, #208] ; (800948c <tcp_input+0x4a0>)
|
|
80093bc: 691b ldr r3, [r3, #16]
|
|
pcb->local_port == tcphdr->dest &&
|
|
80093be: 429a cmp r2, r3
|
|
80093c0: d10d bne.n 80093de <tcp_input+0x3f2>
|
|
ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
|
|
80093c2: 69bb ldr r3, [r7, #24]
|
|
80093c4: 681a ldr r2, [r3, #0]
|
|
80093c6: 4b31 ldr r3, [pc, #196] ; (800948c <tcp_input+0x4a0>)
|
|
80093c8: 695b ldr r3, [r3, #20]
|
|
ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
|
|
80093ca: 429a cmp r2, r3
|
|
80093cc: d107 bne.n 80093de <tcp_input+0x3f2>
|
|
#ifdef LWIP_HOOK_TCP_INPACKET_PCB
|
|
if (LWIP_HOOK_TCP_INPACKET_PCB(pcb, tcphdr, tcphdr_optlen, tcphdr_opt1len,
|
|
tcphdr_opt2, p) == ERR_OK)
|
|
#endif
|
|
{
|
|
tcp_timewait_input(pcb);
|
|
80093ce: 69b8 ldr r0, [r7, #24]
|
|
80093d0: f000 fb56 bl 8009a80 <tcp_timewait_input>
|
|
}
|
|
pbuf_free(p);
|
|
80093d4: 6878 ldr r0, [r7, #4]
|
|
80093d6: f7fd fdfd bl 8006fd4 <pbuf_free>
|
|
return;
|
|
80093da: e1fd b.n 80097d8 <tcp_input+0x7ec>
|
|
continue;
|
|
80093dc: bf00 nop
|
|
for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
80093de: 69bb ldr r3, [r7, #24]
|
|
80093e0: 68db ldr r3, [r3, #12]
|
|
80093e2: 61bb str r3, [r7, #24]
|
|
80093e4: 69bb ldr r3, [r7, #24]
|
|
80093e6: 2b00 cmp r3, #0
|
|
80093e8: d1bc bne.n 8009364 <tcp_input+0x378>
|
|
}
|
|
}
|
|
|
|
/* Finally, if we still did not get a match, we check all PCBs that
|
|
are LISTENing for incoming connections. */
|
|
prev = NULL;
|
|
80093ea: 2300 movs r3, #0
|
|
80093ec: 61fb str r3, [r7, #28]
|
|
for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
|
|
80093ee: 4b2f ldr r3, [pc, #188] ; (80094ac <tcp_input+0x4c0>)
|
|
80093f0: 681b ldr r3, [r3, #0]
|
|
80093f2: 617b str r3, [r7, #20]
|
|
80093f4: e02a b.n 800944c <tcp_input+0x460>
|
|
/* check if PCB is bound to specific netif */
|
|
if ((lpcb->netif_idx != NETIF_NO_INDEX) &&
|
|
80093f6: 697b ldr r3, [r7, #20]
|
|
80093f8: 7a1b ldrb r3, [r3, #8]
|
|
80093fa: 2b00 cmp r3, #0
|
|
80093fc: d00c beq.n 8009418 <tcp_input+0x42c>
|
|
(lpcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
|
|
80093fe: 697b ldr r3, [r7, #20]
|
|
8009400: 7a1a ldrb r2, [r3, #8]
|
|
8009402: 4b22 ldr r3, [pc, #136] ; (800948c <tcp_input+0x4a0>)
|
|
8009404: 685b ldr r3, [r3, #4]
|
|
8009406: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
800940a: 3301 adds r3, #1
|
|
800940c: b2db uxtb r3, r3
|
|
if ((lpcb->netif_idx != NETIF_NO_INDEX) &&
|
|
800940e: 429a cmp r2, r3
|
|
8009410: d002 beq.n 8009418 <tcp_input+0x42c>
|
|
prev = (struct tcp_pcb *)lpcb;
|
|
8009412: 697b ldr r3, [r7, #20]
|
|
8009414: 61fb str r3, [r7, #28]
|
|
continue;
|
|
8009416: e016 b.n 8009446 <tcp_input+0x45a>
|
|
}
|
|
|
|
if (lpcb->local_port == tcphdr->dest) {
|
|
8009418: 697b ldr r3, [r7, #20]
|
|
800941a: 8ada ldrh r2, [r3, #22]
|
|
800941c: 4b1a ldr r3, [pc, #104] ; (8009488 <tcp_input+0x49c>)
|
|
800941e: 681b ldr r3, [r3, #0]
|
|
8009420: 885b ldrh r3, [r3, #2]
|
|
8009422: b29b uxth r3, r3
|
|
8009424: 429a cmp r2, r3
|
|
8009426: d10c bne.n 8009442 <tcp_input+0x456>
|
|
lpcb_prev = prev;
|
|
#else /* SO_REUSE */
|
|
break;
|
|
#endif /* SO_REUSE */
|
|
} else if (IP_ADDR_PCB_VERSION_MATCH_EXACT(lpcb, ip_current_dest_addr())) {
|
|
if (ip_addr_cmp(&lpcb->local_ip, ip_current_dest_addr())) {
|
|
8009428: 697b ldr r3, [r7, #20]
|
|
800942a: 681a ldr r2, [r3, #0]
|
|
800942c: 4b17 ldr r3, [pc, #92] ; (800948c <tcp_input+0x4a0>)
|
|
800942e: 695b ldr r3, [r3, #20]
|
|
8009430: 429a cmp r2, r3
|
|
8009432: d00f beq.n 8009454 <tcp_input+0x468>
|
|
/* found an exact match */
|
|
break;
|
|
} else if (ip_addr_isany(&lpcb->local_ip)) {
|
|
8009434: 697b ldr r3, [r7, #20]
|
|
8009436: 2b00 cmp r3, #0
|
|
8009438: d00d beq.n 8009456 <tcp_input+0x46a>
|
|
800943a: 697b ldr r3, [r7, #20]
|
|
800943c: 681b ldr r3, [r3, #0]
|
|
800943e: 2b00 cmp r3, #0
|
|
8009440: d009 beq.n 8009456 <tcp_input+0x46a>
|
|
break;
|
|
#endif /* SO_REUSE */
|
|
}
|
|
}
|
|
}
|
|
prev = (struct tcp_pcb *)lpcb;
|
|
8009442: 697b ldr r3, [r7, #20]
|
|
8009444: 61fb str r3, [r7, #28]
|
|
for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
|
|
8009446: 697b ldr r3, [r7, #20]
|
|
8009448: 68db ldr r3, [r3, #12]
|
|
800944a: 617b str r3, [r7, #20]
|
|
800944c: 697b ldr r3, [r7, #20]
|
|
800944e: 2b00 cmp r3, #0
|
|
8009450: d1d1 bne.n 80093f6 <tcp_input+0x40a>
|
|
8009452: e000 b.n 8009456 <tcp_input+0x46a>
|
|
break;
|
|
8009454: bf00 nop
|
|
/* only pass to ANY if no specific local IP has been found */
|
|
lpcb = lpcb_any;
|
|
prev = lpcb_prev;
|
|
}
|
|
#endif /* SO_REUSE */
|
|
if (lpcb != NULL) {
|
|
8009456: 697b ldr r3, [r7, #20]
|
|
8009458: 2b00 cmp r3, #0
|
|
800945a: d029 beq.n 80094b0 <tcp_input+0x4c4>
|
|
/* Move this PCB to the front of the list so that subsequent
|
|
lookups will be faster (we exploit locality in TCP segment
|
|
arrivals). */
|
|
if (prev != NULL) {
|
|
800945c: 69fb ldr r3, [r7, #28]
|
|
800945e: 2b00 cmp r3, #0
|
|
8009460: d00a beq.n 8009478 <tcp_input+0x48c>
|
|
((struct tcp_pcb_listen *)prev)->next = lpcb->next;
|
|
8009462: 697b ldr r3, [r7, #20]
|
|
8009464: 68da ldr r2, [r3, #12]
|
|
8009466: 69fb ldr r3, [r7, #28]
|
|
8009468: 60da str r2, [r3, #12]
|
|
/* our successor is the remainder of the listening list */
|
|
lpcb->next = tcp_listen_pcbs.listen_pcbs;
|
|
800946a: 4b10 ldr r3, [pc, #64] ; (80094ac <tcp_input+0x4c0>)
|
|
800946c: 681a ldr r2, [r3, #0]
|
|
800946e: 697b ldr r3, [r7, #20]
|
|
8009470: 60da str r2, [r3, #12]
|
|
/* put this listening pcb at the head of the listening list */
|
|
tcp_listen_pcbs.listen_pcbs = lpcb;
|
|
8009472: 4a0e ldr r2, [pc, #56] ; (80094ac <tcp_input+0x4c0>)
|
|
8009474: 697b ldr r3, [r7, #20]
|
|
8009476: 6013 str r3, [r2, #0]
|
|
#ifdef LWIP_HOOK_TCP_INPACKET_PCB
|
|
if (LWIP_HOOK_TCP_INPACKET_PCB((struct tcp_pcb *)lpcb, tcphdr, tcphdr_optlen,
|
|
tcphdr_opt1len, tcphdr_opt2, p) == ERR_OK)
|
|
#endif
|
|
{
|
|
tcp_listen_input(lpcb);
|
|
8009478: 6978 ldr r0, [r7, #20]
|
|
800947a: f000 fa03 bl 8009884 <tcp_listen_input>
|
|
}
|
|
pbuf_free(p);
|
|
800947e: 6878 ldr r0, [r7, #4]
|
|
8009480: f7fd fda8 bl 8006fd4 <pbuf_free>
|
|
return;
|
|
8009484: e1a8 b.n 80097d8 <tcp_input+0x7ec>
|
|
8009486: bf00 nop
|
|
8009488: 24007b98 .word 0x24007b98
|
|
800948c: 24004c10 .word 0x24004c10
|
|
8009490: 08013198 .word 0x08013198
|
|
8009494: 080132c4 .word 0x080132c4
|
|
8009498: 080131e4 .word 0x080131e4
|
|
800949c: 24007b78 .word 0x24007b78
|
|
80094a0: 080132f0 .word 0x080132f0
|
|
80094a4: 24007b7c .word 0x24007b7c
|
|
80094a8: 0801331c .word 0x0801331c
|
|
80094ac: 24007b74 .word 0x24007b74
|
|
tcphdr_opt1len, tcphdr_opt2, p) != ERR_OK) {
|
|
pbuf_free(p);
|
|
return;
|
|
}
|
|
#endif
|
|
if (pcb != NULL) {
|
|
80094b0: 69bb ldr r3, [r7, #24]
|
|
80094b2: 2b00 cmp r3, #0
|
|
80094b4: f000 8158 beq.w 8009768 <tcp_input+0x77c>
|
|
#if TCP_INPUT_DEBUG
|
|
tcp_debug_print_state(pcb->state);
|
|
#endif /* TCP_INPUT_DEBUG */
|
|
|
|
/* Set up a tcp_seg structure. */
|
|
inseg.next = NULL;
|
|
80094b8: 4b95 ldr r3, [pc, #596] ; (8009710 <tcp_input+0x724>)
|
|
80094ba: 2200 movs r2, #0
|
|
80094bc: 601a str r2, [r3, #0]
|
|
inseg.len = p->tot_len;
|
|
80094be: 687b ldr r3, [r7, #4]
|
|
80094c0: 891a ldrh r2, [r3, #8]
|
|
80094c2: 4b93 ldr r3, [pc, #588] ; (8009710 <tcp_input+0x724>)
|
|
80094c4: 811a strh r2, [r3, #8]
|
|
inseg.p = p;
|
|
80094c6: 4a92 ldr r2, [pc, #584] ; (8009710 <tcp_input+0x724>)
|
|
80094c8: 687b ldr r3, [r7, #4]
|
|
80094ca: 6053 str r3, [r2, #4]
|
|
inseg.tcphdr = tcphdr;
|
|
80094cc: 4b91 ldr r3, [pc, #580] ; (8009714 <tcp_input+0x728>)
|
|
80094ce: 681b ldr r3, [r3, #0]
|
|
80094d0: 4a8f ldr r2, [pc, #572] ; (8009710 <tcp_input+0x724>)
|
|
80094d2: 6113 str r3, [r2, #16]
|
|
|
|
recv_data = NULL;
|
|
80094d4: 4b90 ldr r3, [pc, #576] ; (8009718 <tcp_input+0x72c>)
|
|
80094d6: 2200 movs r2, #0
|
|
80094d8: 601a str r2, [r3, #0]
|
|
recv_flags = 0;
|
|
80094da: 4b90 ldr r3, [pc, #576] ; (800971c <tcp_input+0x730>)
|
|
80094dc: 2200 movs r2, #0
|
|
80094de: 701a strb r2, [r3, #0]
|
|
recv_acked = 0;
|
|
80094e0: 4b8f ldr r3, [pc, #572] ; (8009720 <tcp_input+0x734>)
|
|
80094e2: 2200 movs r2, #0
|
|
80094e4: 801a strh r2, [r3, #0]
|
|
|
|
if (flags & TCP_PSH) {
|
|
80094e6: 4b8f ldr r3, [pc, #572] ; (8009724 <tcp_input+0x738>)
|
|
80094e8: 781b ldrb r3, [r3, #0]
|
|
80094ea: f003 0308 and.w r3, r3, #8
|
|
80094ee: 2b00 cmp r3, #0
|
|
80094f0: d006 beq.n 8009500 <tcp_input+0x514>
|
|
p->flags |= PBUF_FLAG_PUSH;
|
|
80094f2: 687b ldr r3, [r7, #4]
|
|
80094f4: 7b5b ldrb r3, [r3, #13]
|
|
80094f6: f043 0301 orr.w r3, r3, #1
|
|
80094fa: b2da uxtb r2, r3
|
|
80094fc: 687b ldr r3, [r7, #4]
|
|
80094fe: 735a strb r2, [r3, #13]
|
|
}
|
|
|
|
/* If there is data which was previously "refused" by upper layer */
|
|
if (pcb->refused_data != NULL) {
|
|
8009500: 69bb ldr r3, [r7, #24]
|
|
8009502: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
8009504: 2b00 cmp r3, #0
|
|
8009506: d017 beq.n 8009538 <tcp_input+0x54c>
|
|
if ((tcp_process_refused_data(pcb) == ERR_ABRT) ||
|
|
8009508: 69b8 ldr r0, [r7, #24]
|
|
800950a: f7ff f8a3 bl 8008654 <tcp_process_refused_data>
|
|
800950e: 4603 mov r3, r0
|
|
8009510: f113 0f0d cmn.w r3, #13
|
|
8009514: d007 beq.n 8009526 <tcp_input+0x53a>
|
|
((pcb->refused_data != NULL) && (tcplen > 0))) {
|
|
8009516: 69bb ldr r3, [r7, #24]
|
|
8009518: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
if ((tcp_process_refused_data(pcb) == ERR_ABRT) ||
|
|
800951a: 2b00 cmp r3, #0
|
|
800951c: d00c beq.n 8009538 <tcp_input+0x54c>
|
|
((pcb->refused_data != NULL) && (tcplen > 0))) {
|
|
800951e: 4b82 ldr r3, [pc, #520] ; (8009728 <tcp_input+0x73c>)
|
|
8009520: 881b ldrh r3, [r3, #0]
|
|
8009522: 2b00 cmp r3, #0
|
|
8009524: d008 beq.n 8009538 <tcp_input+0x54c>
|
|
/* pcb has been aborted or refused data is still refused and the new
|
|
segment contains data */
|
|
if (pcb->rcv_ann_wnd == 0) {
|
|
8009526: 69bb ldr r3, [r7, #24]
|
|
8009528: 8d5b ldrh r3, [r3, #42] ; 0x2a
|
|
800952a: 2b00 cmp r3, #0
|
|
800952c: f040 80e3 bne.w 80096f6 <tcp_input+0x70a>
|
|
/* this is a zero-window probe, we respond to it with current RCV.NXT
|
|
and drop the data segment */
|
|
tcp_send_empty_ack(pcb);
|
|
8009530: 69b8 ldr r0, [r7, #24]
|
|
8009532: f003 fe71 bl 800d218 <tcp_send_empty_ack>
|
|
}
|
|
TCP_STATS_INC(tcp.drop);
|
|
MIB2_STATS_INC(mib2.tcpinerrs);
|
|
goto aborted;
|
|
8009536: e0de b.n 80096f6 <tcp_input+0x70a>
|
|
}
|
|
}
|
|
tcp_input_pcb = pcb;
|
|
8009538: 4a7c ldr r2, [pc, #496] ; (800972c <tcp_input+0x740>)
|
|
800953a: 69bb ldr r3, [r7, #24]
|
|
800953c: 6013 str r3, [r2, #0]
|
|
err = tcp_process(pcb);
|
|
800953e: 69b8 ldr r0, [r7, #24]
|
|
8009540: f000 fb18 bl 8009b74 <tcp_process>
|
|
8009544: 4603 mov r3, r0
|
|
8009546: 74fb strb r3, [r7, #19]
|
|
/* A return value of ERR_ABRT means that tcp_abort() was called
|
|
and that the pcb has been freed. If so, we don't do anything. */
|
|
if (err != ERR_ABRT) {
|
|
8009548: f997 3013 ldrsb.w r3, [r7, #19]
|
|
800954c: f113 0f0d cmn.w r3, #13
|
|
8009550: f000 80d3 beq.w 80096fa <tcp_input+0x70e>
|
|
if (recv_flags & TF_RESET) {
|
|
8009554: 4b71 ldr r3, [pc, #452] ; (800971c <tcp_input+0x730>)
|
|
8009556: 781b ldrb r3, [r3, #0]
|
|
8009558: f003 0308 and.w r3, r3, #8
|
|
800955c: 2b00 cmp r3, #0
|
|
800955e: d015 beq.n 800958c <tcp_input+0x5a0>
|
|
/* TF_RESET means that the connection was reset by the other
|
|
end. We then call the error callback to inform the
|
|
application that the connection is dead before we
|
|
deallocate the PCB. */
|
|
TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_RST);
|
|
8009560: 69bb ldr r3, [r7, #24]
|
|
8009562: f8d3 3090 ldr.w r3, [r3, #144] ; 0x90
|
|
8009566: 2b00 cmp r3, #0
|
|
8009568: d008 beq.n 800957c <tcp_input+0x590>
|
|
800956a: 69bb ldr r3, [r7, #24]
|
|
800956c: f8d3 3090 ldr.w r3, [r3, #144] ; 0x90
|
|
8009570: 69ba ldr r2, [r7, #24]
|
|
8009572: 6912 ldr r2, [r2, #16]
|
|
8009574: f06f 010d mvn.w r1, #13
|
|
8009578: 4610 mov r0, r2
|
|
800957a: 4798 blx r3
|
|
tcp_pcb_remove(&tcp_active_pcbs, pcb);
|
|
800957c: 69b9 ldr r1, [r7, #24]
|
|
800957e: 486c ldr r0, [pc, #432] ; (8009730 <tcp_input+0x744>)
|
|
8009580: f7ff fbb6 bl 8008cf0 <tcp_pcb_remove>
|
|
tcp_free(pcb);
|
|
8009584: 69b8 ldr r0, [r7, #24]
|
|
8009586: f7fd ffc5 bl 8007514 <tcp_free>
|
|
800958a: e0da b.n 8009742 <tcp_input+0x756>
|
|
} else {
|
|
err = ERR_OK;
|
|
800958c: 2300 movs r3, #0
|
|
800958e: 74fb strb r3, [r7, #19]
|
|
/* If the application has registered a "sent" function to be
|
|
called when new send buffer space is available, we call it
|
|
now. */
|
|
if (recv_acked > 0) {
|
|
8009590: 4b63 ldr r3, [pc, #396] ; (8009720 <tcp_input+0x734>)
|
|
8009592: 881b ldrh r3, [r3, #0]
|
|
8009594: 2b00 cmp r3, #0
|
|
8009596: d01d beq.n 80095d4 <tcp_input+0x5e8>
|
|
while (acked > 0) {
|
|
acked16 = (u16_t)LWIP_MIN(acked, 0xffffu);
|
|
acked -= acked16;
|
|
#else
|
|
{
|
|
acked16 = recv_acked;
|
|
8009598: 4b61 ldr r3, [pc, #388] ; (8009720 <tcp_input+0x734>)
|
|
800959a: 881b ldrh r3, [r3, #0]
|
|
800959c: 81fb strh r3, [r7, #14]
|
|
#endif
|
|
TCP_EVENT_SENT(pcb, (u16_t)acked16, err);
|
|
800959e: 69bb ldr r3, [r7, #24]
|
|
80095a0: f8d3 3080 ldr.w r3, [r3, #128] ; 0x80
|
|
80095a4: 2b00 cmp r3, #0
|
|
80095a6: d00a beq.n 80095be <tcp_input+0x5d2>
|
|
80095a8: 69bb ldr r3, [r7, #24]
|
|
80095aa: f8d3 3080 ldr.w r3, [r3, #128] ; 0x80
|
|
80095ae: 69ba ldr r2, [r7, #24]
|
|
80095b0: 6910 ldr r0, [r2, #16]
|
|
80095b2: 89fa ldrh r2, [r7, #14]
|
|
80095b4: 69b9 ldr r1, [r7, #24]
|
|
80095b6: 4798 blx r3
|
|
80095b8: 4603 mov r3, r0
|
|
80095ba: 74fb strb r3, [r7, #19]
|
|
80095bc: e001 b.n 80095c2 <tcp_input+0x5d6>
|
|
80095be: 2300 movs r3, #0
|
|
80095c0: 74fb strb r3, [r7, #19]
|
|
if (err == ERR_ABRT) {
|
|
80095c2: f997 3013 ldrsb.w r3, [r7, #19]
|
|
80095c6: f113 0f0d cmn.w r3, #13
|
|
80095ca: f000 8098 beq.w 80096fe <tcp_input+0x712>
|
|
goto aborted;
|
|
}
|
|
}
|
|
recv_acked = 0;
|
|
80095ce: 4b54 ldr r3, [pc, #336] ; (8009720 <tcp_input+0x734>)
|
|
80095d0: 2200 movs r2, #0
|
|
80095d2: 801a strh r2, [r3, #0]
|
|
}
|
|
if (tcp_input_delayed_close(pcb)) {
|
|
80095d4: 69b8 ldr r0, [r7, #24]
|
|
80095d6: f000 f915 bl 8009804 <tcp_input_delayed_close>
|
|
80095da: 4603 mov r3, r0
|
|
80095dc: 2b00 cmp r3, #0
|
|
80095de: f040 8090 bne.w 8009702 <tcp_input+0x716>
|
|
#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
|
|
while (recv_data != NULL) {
|
|
struct pbuf *rest = NULL;
|
|
pbuf_split_64k(recv_data, &rest);
|
|
#else /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
if (recv_data != NULL) {
|
|
80095e2: 4b4d ldr r3, [pc, #308] ; (8009718 <tcp_input+0x72c>)
|
|
80095e4: 681b ldr r3, [r3, #0]
|
|
80095e6: 2b00 cmp r3, #0
|
|
80095e8: d041 beq.n 800966e <tcp_input+0x682>
|
|
#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
|
|
LWIP_ASSERT("pcb->refused_data == NULL", pcb->refused_data == NULL);
|
|
80095ea: 69bb ldr r3, [r7, #24]
|
|
80095ec: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
80095ee: 2b00 cmp r3, #0
|
|
80095f0: d006 beq.n 8009600 <tcp_input+0x614>
|
|
80095f2: 4b50 ldr r3, [pc, #320] ; (8009734 <tcp_input+0x748>)
|
|
80095f4: f44f 72f3 mov.w r2, #486 ; 0x1e6
|
|
80095f8: 494f ldr r1, [pc, #316] ; (8009738 <tcp_input+0x74c>)
|
|
80095fa: 4850 ldr r0, [pc, #320] ; (800973c <tcp_input+0x750>)
|
|
80095fc: f007 fae4 bl 8010bc8 <iprintf>
|
|
if (pcb->flags & TF_RXCLOSED) {
|
|
8009600: 69bb ldr r3, [r7, #24]
|
|
8009602: 8b5b ldrh r3, [r3, #26]
|
|
8009604: f003 0310 and.w r3, r3, #16
|
|
8009608: 2b00 cmp r3, #0
|
|
800960a: d008 beq.n 800961e <tcp_input+0x632>
|
|
/* received data although already closed -> abort (send RST) to
|
|
notify the remote host that not all data has been processed */
|
|
pbuf_free(recv_data);
|
|
800960c: 4b42 ldr r3, [pc, #264] ; (8009718 <tcp_input+0x72c>)
|
|
800960e: 681b ldr r3, [r3, #0]
|
|
8009610: 4618 mov r0, r3
|
|
8009612: f7fd fcdf bl 8006fd4 <pbuf_free>
|
|
#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
|
|
if (rest != NULL) {
|
|
pbuf_free(rest);
|
|
}
|
|
#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
tcp_abort(pcb);
|
|
8009616: 69b8 ldr r0, [r7, #24]
|
|
8009618: f7fe fa64 bl 8007ae4 <tcp_abort>
|
|
goto aborted;
|
|
800961c: e091 b.n 8009742 <tcp_input+0x756>
|
|
}
|
|
|
|
/* Notify application that data has been received. */
|
|
TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
|
|
800961e: 69bb ldr r3, [r7, #24]
|
|
8009620: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
8009624: 2b00 cmp r3, #0
|
|
8009626: d00c beq.n 8009642 <tcp_input+0x656>
|
|
8009628: 69bb ldr r3, [r7, #24]
|
|
800962a: f8d3 4084 ldr.w r4, [r3, #132] ; 0x84
|
|
800962e: 69bb ldr r3, [r7, #24]
|
|
8009630: 6918 ldr r0, [r3, #16]
|
|
8009632: 4b39 ldr r3, [pc, #228] ; (8009718 <tcp_input+0x72c>)
|
|
8009634: 681a ldr r2, [r3, #0]
|
|
8009636: 2300 movs r3, #0
|
|
8009638: 69b9 ldr r1, [r7, #24]
|
|
800963a: 47a0 blx r4
|
|
800963c: 4603 mov r3, r0
|
|
800963e: 74fb strb r3, [r7, #19]
|
|
8009640: e008 b.n 8009654 <tcp_input+0x668>
|
|
8009642: 4b35 ldr r3, [pc, #212] ; (8009718 <tcp_input+0x72c>)
|
|
8009644: 681a ldr r2, [r3, #0]
|
|
8009646: 2300 movs r3, #0
|
|
8009648: 69b9 ldr r1, [r7, #24]
|
|
800964a: 2000 movs r0, #0
|
|
800964c: f7ff f8d8 bl 8008800 <tcp_recv_null>
|
|
8009650: 4603 mov r3, r0
|
|
8009652: 74fb strb r3, [r7, #19]
|
|
if (err == ERR_ABRT) {
|
|
8009654: f997 3013 ldrsb.w r3, [r7, #19]
|
|
8009658: f113 0f0d cmn.w r3, #13
|
|
800965c: d053 beq.n 8009706 <tcp_input+0x71a>
|
|
#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
goto aborted;
|
|
}
|
|
|
|
/* If the upper layer can't receive this data, store it */
|
|
if (err != ERR_OK) {
|
|
800965e: f997 3013 ldrsb.w r3, [r7, #19]
|
|
8009662: 2b00 cmp r3, #0
|
|
8009664: d003 beq.n 800966e <tcp_input+0x682>
|
|
#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
|
|
if (rest != NULL) {
|
|
pbuf_cat(recv_data, rest);
|
|
}
|
|
#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
|
|
pcb->refused_data = recv_data;
|
|
8009666: 4b2c ldr r3, [pc, #176] ; (8009718 <tcp_input+0x72c>)
|
|
8009668: 681a ldr r2, [r3, #0]
|
|
800966a: 69bb ldr r3, [r7, #24]
|
|
800966c: 679a str r2, [r3, #120] ; 0x78
|
|
}
|
|
}
|
|
|
|
/* If a FIN segment was received, we call the callback
|
|
function with a NULL buffer to indicate EOF. */
|
|
if (recv_flags & TF_GOT_FIN) {
|
|
800966e: 4b2b ldr r3, [pc, #172] ; (800971c <tcp_input+0x730>)
|
|
8009670: 781b ldrb r3, [r3, #0]
|
|
8009672: f003 0320 and.w r3, r3, #32
|
|
8009676: 2b00 cmp r3, #0
|
|
8009678: d030 beq.n 80096dc <tcp_input+0x6f0>
|
|
if (pcb->refused_data != NULL) {
|
|
800967a: 69bb ldr r3, [r7, #24]
|
|
800967c: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
800967e: 2b00 cmp r3, #0
|
|
8009680: d009 beq.n 8009696 <tcp_input+0x6aa>
|
|
/* Delay this if we have refused data. */
|
|
pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN;
|
|
8009682: 69bb ldr r3, [r7, #24]
|
|
8009684: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
8009686: 7b5a ldrb r2, [r3, #13]
|
|
8009688: 69bb ldr r3, [r7, #24]
|
|
800968a: 6f9b ldr r3, [r3, #120] ; 0x78
|
|
800968c: f042 0220 orr.w r2, r2, #32
|
|
8009690: b2d2 uxtb r2, r2
|
|
8009692: 735a strb r2, [r3, #13]
|
|
8009694: e022 b.n 80096dc <tcp_input+0x6f0>
|
|
} else {
|
|
/* correct rcv_wnd as the application won't call tcp_recved()
|
|
for the FIN's seqno */
|
|
if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
|
|
8009696: 69bb ldr r3, [r7, #24]
|
|
8009698: 8d1b ldrh r3, [r3, #40] ; 0x28
|
|
800969a: f5b3 6f06 cmp.w r3, #2144 ; 0x860
|
|
800969e: d005 beq.n 80096ac <tcp_input+0x6c0>
|
|
pcb->rcv_wnd++;
|
|
80096a0: 69bb ldr r3, [r7, #24]
|
|
80096a2: 8d1b ldrh r3, [r3, #40] ; 0x28
|
|
80096a4: 3301 adds r3, #1
|
|
80096a6: b29a uxth r2, r3
|
|
80096a8: 69bb ldr r3, [r7, #24]
|
|
80096aa: 851a strh r2, [r3, #40] ; 0x28
|
|
}
|
|
TCP_EVENT_CLOSED(pcb, err);
|
|
80096ac: 69bb ldr r3, [r7, #24]
|
|
80096ae: f8d3 3084 ldr.w r3, [r3, #132] ; 0x84
|
|
80096b2: 2b00 cmp r3, #0
|
|
80096b4: d00b beq.n 80096ce <tcp_input+0x6e2>
|
|
80096b6: 69bb ldr r3, [r7, #24]
|
|
80096b8: f8d3 4084 ldr.w r4, [r3, #132] ; 0x84
|
|
80096bc: 69bb ldr r3, [r7, #24]
|
|
80096be: 6918 ldr r0, [r3, #16]
|
|
80096c0: 2300 movs r3, #0
|
|
80096c2: 2200 movs r2, #0
|
|
80096c4: 69b9 ldr r1, [r7, #24]
|
|
80096c6: 47a0 blx r4
|
|
80096c8: 4603 mov r3, r0
|
|
80096ca: 74fb strb r3, [r7, #19]
|
|
80096cc: e001 b.n 80096d2 <tcp_input+0x6e6>
|
|
80096ce: 2300 movs r3, #0
|
|
80096d0: 74fb strb r3, [r7, #19]
|
|
if (err == ERR_ABRT) {
|
|
80096d2: f997 3013 ldrsb.w r3, [r7, #19]
|
|
80096d6: f113 0f0d cmn.w r3, #13
|
|
80096da: d016 beq.n 800970a <tcp_input+0x71e>
|
|
goto aborted;
|
|
}
|
|
}
|
|
}
|
|
|
|
tcp_input_pcb = NULL;
|
|
80096dc: 4b13 ldr r3, [pc, #76] ; (800972c <tcp_input+0x740>)
|
|
80096de: 2200 movs r2, #0
|
|
80096e0: 601a str r2, [r3, #0]
|
|
if (tcp_input_delayed_close(pcb)) {
|
|
80096e2: 69b8 ldr r0, [r7, #24]
|
|
80096e4: f000 f88e bl 8009804 <tcp_input_delayed_close>
|
|
80096e8: 4603 mov r3, r0
|
|
80096ea: 2b00 cmp r3, #0
|
|
80096ec: d128 bne.n 8009740 <tcp_input+0x754>
|
|
goto aborted;
|
|
}
|
|
/* Try to send something out. */
|
|
tcp_output(pcb);
|
|
80096ee: 69b8 ldr r0, [r7, #24]
|
|
80096f0: f002 ff80 bl 800c5f4 <tcp_output>
|
|
80096f4: e025 b.n 8009742 <tcp_input+0x756>
|
|
goto aborted;
|
|
80096f6: bf00 nop
|
|
80096f8: e023 b.n 8009742 <tcp_input+0x756>
|
|
#endif /* TCP_INPUT_DEBUG */
|
|
}
|
|
}
|
|
/* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
|
|
Below this line, 'pcb' may not be dereferenced! */
|
|
aborted:
|
|
80096fa: bf00 nop
|
|
80096fc: e021 b.n 8009742 <tcp_input+0x756>
|
|
goto aborted;
|
|
80096fe: bf00 nop
|
|
8009700: e01f b.n 8009742 <tcp_input+0x756>
|
|
goto aborted;
|
|
8009702: bf00 nop
|
|
8009704: e01d b.n 8009742 <tcp_input+0x756>
|
|
goto aborted;
|
|
8009706: bf00 nop
|
|
8009708: e01b b.n 8009742 <tcp_input+0x756>
|
|
goto aborted;
|
|
800970a: bf00 nop
|
|
800970c: e019 b.n 8009742 <tcp_input+0x756>
|
|
800970e: bf00 nop
|
|
8009710: 24007b84 .word 0x24007b84
|
|
8009714: 24007b98 .word 0x24007b98
|
|
8009718: 24007bb8 .word 0x24007bb8
|
|
800971c: 24007bb5 .word 0x24007bb5
|
|
8009720: 24007bb0 .word 0x24007bb0
|
|
8009724: 24007bb4 .word 0x24007bb4
|
|
8009728: 24007bb2 .word 0x24007bb2
|
|
800972c: 24007bbc .word 0x24007bbc
|
|
8009730: 24007b78 .word 0x24007b78
|
|
8009734: 08013198 .word 0x08013198
|
|
8009738: 0801334c .word 0x0801334c
|
|
800973c: 080131e4 .word 0x080131e4
|
|
goto aborted;
|
|
8009740: bf00 nop
|
|
tcp_input_pcb = NULL;
|
|
8009742: 4b27 ldr r3, [pc, #156] ; (80097e0 <tcp_input+0x7f4>)
|
|
8009744: 2200 movs r2, #0
|
|
8009746: 601a str r2, [r3, #0]
|
|
recv_data = NULL;
|
|
8009748: 4b26 ldr r3, [pc, #152] ; (80097e4 <tcp_input+0x7f8>)
|
|
800974a: 2200 movs r2, #0
|
|
800974c: 601a str r2, [r3, #0]
|
|
|
|
/* give up our reference to inseg.p */
|
|
if (inseg.p != NULL) {
|
|
800974e: 4b26 ldr r3, [pc, #152] ; (80097e8 <tcp_input+0x7fc>)
|
|
8009750: 685b ldr r3, [r3, #4]
|
|
8009752: 2b00 cmp r3, #0
|
|
8009754: d03f beq.n 80097d6 <tcp_input+0x7ea>
|
|
pbuf_free(inseg.p);
|
|
8009756: 4b24 ldr r3, [pc, #144] ; (80097e8 <tcp_input+0x7fc>)
|
|
8009758: 685b ldr r3, [r3, #4]
|
|
800975a: 4618 mov r0, r3
|
|
800975c: f7fd fc3a bl 8006fd4 <pbuf_free>
|
|
inseg.p = NULL;
|
|
8009760: 4b21 ldr r3, [pc, #132] ; (80097e8 <tcp_input+0x7fc>)
|
|
8009762: 2200 movs r2, #0
|
|
8009764: 605a str r2, [r3, #4]
|
|
pbuf_free(p);
|
|
}
|
|
|
|
LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
|
|
PERF_STOP("tcp_input");
|
|
return;
|
|
8009766: e036 b.n 80097d6 <tcp_input+0x7ea>
|
|
if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
|
|
8009768: 4b20 ldr r3, [pc, #128] ; (80097ec <tcp_input+0x800>)
|
|
800976a: 681b ldr r3, [r3, #0]
|
|
800976c: 899b ldrh r3, [r3, #12]
|
|
800976e: b29b uxth r3, r3
|
|
8009770: 4618 mov r0, r3
|
|
8009772: f7fb feeb bl 800554c <lwip_htons>
|
|
8009776: 4603 mov r3, r0
|
|
8009778: b2db uxtb r3, r3
|
|
800977a: f003 0304 and.w r3, r3, #4
|
|
800977e: 2b00 cmp r3, #0
|
|
8009780: d118 bne.n 80097b4 <tcp_input+0x7c8>
|
|
tcp_rst(NULL, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
8009782: 4b1b ldr r3, [pc, #108] ; (80097f0 <tcp_input+0x804>)
|
|
8009784: 6819 ldr r1, [r3, #0]
|
|
8009786: 4b1b ldr r3, [pc, #108] ; (80097f4 <tcp_input+0x808>)
|
|
8009788: 881b ldrh r3, [r3, #0]
|
|
800978a: 461a mov r2, r3
|
|
800978c: 4b1a ldr r3, [pc, #104] ; (80097f8 <tcp_input+0x80c>)
|
|
800978e: 681b ldr r3, [r3, #0]
|
|
8009790: 18d0 adds r0, r2, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
8009792: 4b16 ldr r3, [pc, #88] ; (80097ec <tcp_input+0x800>)
|
|
8009794: 681b ldr r3, [r3, #0]
|
|
tcp_rst(NULL, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
8009796: 885b ldrh r3, [r3, #2]
|
|
8009798: b29b uxth r3, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
800979a: 4a14 ldr r2, [pc, #80] ; (80097ec <tcp_input+0x800>)
|
|
800979c: 6812 ldr r2, [r2, #0]
|
|
tcp_rst(NULL, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
800979e: 8812 ldrh r2, [r2, #0]
|
|
80097a0: b292 uxth r2, r2
|
|
80097a2: 9202 str r2, [sp, #8]
|
|
80097a4: 9301 str r3, [sp, #4]
|
|
80097a6: 4b15 ldr r3, [pc, #84] ; (80097fc <tcp_input+0x810>)
|
|
80097a8: 9300 str r3, [sp, #0]
|
|
80097aa: 4b15 ldr r3, [pc, #84] ; (8009800 <tcp_input+0x814>)
|
|
80097ac: 4602 mov r2, r0
|
|
80097ae: 2000 movs r0, #0
|
|
80097b0: f003 fce0 bl 800d174 <tcp_rst>
|
|
pbuf_free(p);
|
|
80097b4: 6878 ldr r0, [r7, #4]
|
|
80097b6: f7fd fc0d bl 8006fd4 <pbuf_free>
|
|
return;
|
|
80097ba: e00c b.n 80097d6 <tcp_input+0x7ea>
|
|
goto dropped;
|
|
80097bc: bf00 nop
|
|
80097be: e006 b.n 80097ce <tcp_input+0x7e2>
|
|
goto dropped;
|
|
80097c0: bf00 nop
|
|
80097c2: e004 b.n 80097ce <tcp_input+0x7e2>
|
|
goto dropped;
|
|
80097c4: bf00 nop
|
|
80097c6: e002 b.n 80097ce <tcp_input+0x7e2>
|
|
goto dropped;
|
|
80097c8: bf00 nop
|
|
80097ca: e000 b.n 80097ce <tcp_input+0x7e2>
|
|
goto dropped;
|
|
80097cc: bf00 nop
|
|
dropped:
|
|
TCP_STATS_INC(tcp.drop);
|
|
MIB2_STATS_INC(mib2.tcpinerrs);
|
|
pbuf_free(p);
|
|
80097ce: 6878 ldr r0, [r7, #4]
|
|
80097d0: f7fd fc00 bl 8006fd4 <pbuf_free>
|
|
80097d4: e000 b.n 80097d8 <tcp_input+0x7ec>
|
|
return;
|
|
80097d6: bf00 nop
|
|
}
|
|
80097d8: 3724 adds r7, #36 ; 0x24
|
|
80097da: 46bd mov sp, r7
|
|
80097dc: bd90 pop {r4, r7, pc}
|
|
80097de: bf00 nop
|
|
80097e0: 24007bbc .word 0x24007bbc
|
|
80097e4: 24007bb8 .word 0x24007bb8
|
|
80097e8: 24007b84 .word 0x24007b84
|
|
80097ec: 24007b98 .word 0x24007b98
|
|
80097f0: 24007bac .word 0x24007bac
|
|
80097f4: 24007bb2 .word 0x24007bb2
|
|
80097f8: 24007ba8 .word 0x24007ba8
|
|
80097fc: 24004c20 .word 0x24004c20
|
|
8009800: 24004c24 .word 0x24004c24
|
|
|
|
08009804 <tcp_input_delayed_close>:
|
|
* any more.
|
|
* @returns 1 if the pcb has been closed and deallocated, 0 otherwise
|
|
*/
|
|
static int
|
|
tcp_input_delayed_close(struct tcp_pcb *pcb)
|
|
{
|
|
8009804: b580 push {r7, lr}
|
|
8009806: b082 sub sp, #8
|
|
8009808: af00 add r7, sp, #0
|
|
800980a: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("tcp_input_delayed_close: invalid pcb", pcb != NULL);
|
|
800980c: 687b ldr r3, [r7, #4]
|
|
800980e: 2b00 cmp r3, #0
|
|
8009810: d106 bne.n 8009820 <tcp_input_delayed_close+0x1c>
|
|
8009812: 4b17 ldr r3, [pc, #92] ; (8009870 <tcp_input_delayed_close+0x6c>)
|
|
8009814: f240 225a movw r2, #602 ; 0x25a
|
|
8009818: 4916 ldr r1, [pc, #88] ; (8009874 <tcp_input_delayed_close+0x70>)
|
|
800981a: 4817 ldr r0, [pc, #92] ; (8009878 <tcp_input_delayed_close+0x74>)
|
|
800981c: f007 f9d4 bl 8010bc8 <iprintf>
|
|
|
|
if (recv_flags & TF_CLOSED) {
|
|
8009820: 4b16 ldr r3, [pc, #88] ; (800987c <tcp_input_delayed_close+0x78>)
|
|
8009822: 781b ldrb r3, [r3, #0]
|
|
8009824: f003 0310 and.w r3, r3, #16
|
|
8009828: 2b00 cmp r3, #0
|
|
800982a: d01c beq.n 8009866 <tcp_input_delayed_close+0x62>
|
|
/* The connection has been closed and we will deallocate the
|
|
PCB. */
|
|
if (!(pcb->flags & TF_RXCLOSED)) {
|
|
800982c: 687b ldr r3, [r7, #4]
|
|
800982e: 8b5b ldrh r3, [r3, #26]
|
|
8009830: f003 0310 and.w r3, r3, #16
|
|
8009834: 2b00 cmp r3, #0
|
|
8009836: d10d bne.n 8009854 <tcp_input_delayed_close+0x50>
|
|
/* Connection closed although the application has only shut down the
|
|
tx side: call the PCB's err callback and indicate the closure to
|
|
ensure the application doesn't continue using the PCB. */
|
|
TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_CLSD);
|
|
8009838: 687b ldr r3, [r7, #4]
|
|
800983a: f8d3 3090 ldr.w r3, [r3, #144] ; 0x90
|
|
800983e: 2b00 cmp r3, #0
|
|
8009840: d008 beq.n 8009854 <tcp_input_delayed_close+0x50>
|
|
8009842: 687b ldr r3, [r7, #4]
|
|
8009844: f8d3 3090 ldr.w r3, [r3, #144] ; 0x90
|
|
8009848: 687a ldr r2, [r7, #4]
|
|
800984a: 6912 ldr r2, [r2, #16]
|
|
800984c: f06f 010e mvn.w r1, #14
|
|
8009850: 4610 mov r0, r2
|
|
8009852: 4798 blx r3
|
|
}
|
|
tcp_pcb_remove(&tcp_active_pcbs, pcb);
|
|
8009854: 6879 ldr r1, [r7, #4]
|
|
8009856: 480a ldr r0, [pc, #40] ; (8009880 <tcp_input_delayed_close+0x7c>)
|
|
8009858: f7ff fa4a bl 8008cf0 <tcp_pcb_remove>
|
|
tcp_free(pcb);
|
|
800985c: 6878 ldr r0, [r7, #4]
|
|
800985e: f7fd fe59 bl 8007514 <tcp_free>
|
|
return 1;
|
|
8009862: 2301 movs r3, #1
|
|
8009864: e000 b.n 8009868 <tcp_input_delayed_close+0x64>
|
|
}
|
|
return 0;
|
|
8009866: 2300 movs r3, #0
|
|
}
|
|
8009868: 4618 mov r0, r3
|
|
800986a: 3708 adds r7, #8
|
|
800986c: 46bd mov sp, r7
|
|
800986e: bd80 pop {r7, pc}
|
|
8009870: 08013198 .word 0x08013198
|
|
8009874: 08013368 .word 0x08013368
|
|
8009878: 080131e4 .word 0x080131e4
|
|
800987c: 24007bb5 .word 0x24007bb5
|
|
8009880: 24007b78 .word 0x24007b78
|
|
|
|
08009884 <tcp_listen_input>:
|
|
* @note the segment which arrived is saved in global variables, therefore only the pcb
|
|
* involved is passed as a parameter to this function
|
|
*/
|
|
static void
|
|
tcp_listen_input(struct tcp_pcb_listen *pcb)
|
|
{
|
|
8009884: b590 push {r4, r7, lr}
|
|
8009886: b08b sub sp, #44 ; 0x2c
|
|
8009888: af04 add r7, sp, #16
|
|
800988a: 6078 str r0, [r7, #4]
|
|
struct tcp_pcb *npcb;
|
|
u32_t iss;
|
|
err_t rc;
|
|
|
|
if (flags & TCP_RST) {
|
|
800988c: 4b6f ldr r3, [pc, #444] ; (8009a4c <tcp_listen_input+0x1c8>)
|
|
800988e: 781b ldrb r3, [r3, #0]
|
|
8009890: f003 0304 and.w r3, r3, #4
|
|
8009894: 2b00 cmp r3, #0
|
|
8009896: f040 80d2 bne.w 8009a3e <tcp_listen_input+0x1ba>
|
|
/* An incoming RST should be ignored. Return. */
|
|
return;
|
|
}
|
|
|
|
LWIP_ASSERT("tcp_listen_input: invalid pcb", pcb != NULL);
|
|
800989a: 687b ldr r3, [r7, #4]
|
|
800989c: 2b00 cmp r3, #0
|
|
800989e: d106 bne.n 80098ae <tcp_listen_input+0x2a>
|
|
80098a0: 4b6b ldr r3, [pc, #428] ; (8009a50 <tcp_listen_input+0x1cc>)
|
|
80098a2: f240 2281 movw r2, #641 ; 0x281
|
|
80098a6: 496b ldr r1, [pc, #428] ; (8009a54 <tcp_listen_input+0x1d0>)
|
|
80098a8: 486b ldr r0, [pc, #428] ; (8009a58 <tcp_listen_input+0x1d4>)
|
|
80098aa: f007 f98d bl 8010bc8 <iprintf>
|
|
|
|
/* In the LISTEN state, we check for incoming SYN segments,
|
|
creates a new PCB, and responds with a SYN|ACK. */
|
|
if (flags & TCP_ACK) {
|
|
80098ae: 4b67 ldr r3, [pc, #412] ; (8009a4c <tcp_listen_input+0x1c8>)
|
|
80098b0: 781b ldrb r3, [r3, #0]
|
|
80098b2: f003 0310 and.w r3, r3, #16
|
|
80098b6: 2b00 cmp r3, #0
|
|
80098b8: d019 beq.n 80098ee <tcp_listen_input+0x6a>
|
|
/* For incoming segments with the ACK flag set, respond with a
|
|
RST. */
|
|
LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n"));
|
|
tcp_rst((const struct tcp_pcb *)pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
80098ba: 4b68 ldr r3, [pc, #416] ; (8009a5c <tcp_listen_input+0x1d8>)
|
|
80098bc: 6819 ldr r1, [r3, #0]
|
|
80098be: 4b68 ldr r3, [pc, #416] ; (8009a60 <tcp_listen_input+0x1dc>)
|
|
80098c0: 881b ldrh r3, [r3, #0]
|
|
80098c2: 461a mov r2, r3
|
|
80098c4: 4b67 ldr r3, [pc, #412] ; (8009a64 <tcp_listen_input+0x1e0>)
|
|
80098c6: 681b ldr r3, [r3, #0]
|
|
80098c8: 18d0 adds r0, r2, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
80098ca: 4b67 ldr r3, [pc, #412] ; (8009a68 <tcp_listen_input+0x1e4>)
|
|
80098cc: 681b ldr r3, [r3, #0]
|
|
tcp_rst((const struct tcp_pcb *)pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
80098ce: 885b ldrh r3, [r3, #2]
|
|
80098d0: b29b uxth r3, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
80098d2: 4a65 ldr r2, [pc, #404] ; (8009a68 <tcp_listen_input+0x1e4>)
|
|
80098d4: 6812 ldr r2, [r2, #0]
|
|
tcp_rst((const struct tcp_pcb *)pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
80098d6: 8812 ldrh r2, [r2, #0]
|
|
80098d8: b292 uxth r2, r2
|
|
80098da: 9202 str r2, [sp, #8]
|
|
80098dc: 9301 str r3, [sp, #4]
|
|
80098de: 4b63 ldr r3, [pc, #396] ; (8009a6c <tcp_listen_input+0x1e8>)
|
|
80098e0: 9300 str r3, [sp, #0]
|
|
80098e2: 4b63 ldr r3, [pc, #396] ; (8009a70 <tcp_listen_input+0x1ec>)
|
|
80098e4: 4602 mov r2, r0
|
|
80098e6: 6878 ldr r0, [r7, #4]
|
|
80098e8: f003 fc44 bl 800d174 <tcp_rst>
|
|
tcp_abandon(npcb, 0);
|
|
return;
|
|
}
|
|
tcp_output(npcb);
|
|
}
|
|
return;
|
|
80098ec: e0a9 b.n 8009a42 <tcp_listen_input+0x1be>
|
|
} else if (flags & TCP_SYN) {
|
|
80098ee: 4b57 ldr r3, [pc, #348] ; (8009a4c <tcp_listen_input+0x1c8>)
|
|
80098f0: 781b ldrb r3, [r3, #0]
|
|
80098f2: f003 0302 and.w r3, r3, #2
|
|
80098f6: 2b00 cmp r3, #0
|
|
80098f8: f000 80a3 beq.w 8009a42 <tcp_listen_input+0x1be>
|
|
npcb = tcp_alloc(pcb->prio);
|
|
80098fc: 687b ldr r3, [r7, #4]
|
|
80098fe: 7d5b ldrb r3, [r3, #21]
|
|
8009900: 4618 mov r0, r3
|
|
8009902: f7ff f8a1 bl 8008a48 <tcp_alloc>
|
|
8009906: 6178 str r0, [r7, #20]
|
|
if (npcb == NULL) {
|
|
8009908: 697b ldr r3, [r7, #20]
|
|
800990a: 2b00 cmp r3, #0
|
|
800990c: d111 bne.n 8009932 <tcp_listen_input+0xae>
|
|
TCP_EVENT_ACCEPT(pcb, NULL, pcb->callback_arg, ERR_MEM, err);
|
|
800990e: 687b ldr r3, [r7, #4]
|
|
8009910: 699b ldr r3, [r3, #24]
|
|
8009912: 2b00 cmp r3, #0
|
|
8009914: d00a beq.n 800992c <tcp_listen_input+0xa8>
|
|
8009916: 687b ldr r3, [r7, #4]
|
|
8009918: 699b ldr r3, [r3, #24]
|
|
800991a: 687a ldr r2, [r7, #4]
|
|
800991c: 6910 ldr r0, [r2, #16]
|
|
800991e: f04f 32ff mov.w r2, #4294967295
|
|
8009922: 2100 movs r1, #0
|
|
8009924: 4798 blx r3
|
|
8009926: 4603 mov r3, r0
|
|
8009928: 73bb strb r3, [r7, #14]
|
|
return;
|
|
800992a: e08b b.n 8009a44 <tcp_listen_input+0x1c0>
|
|
TCP_EVENT_ACCEPT(pcb, NULL, pcb->callback_arg, ERR_MEM, err);
|
|
800992c: 23f0 movs r3, #240 ; 0xf0
|
|
800992e: 73bb strb r3, [r7, #14]
|
|
return;
|
|
8009930: e088 b.n 8009a44 <tcp_listen_input+0x1c0>
|
|
ip_addr_copy(npcb->local_ip, *ip_current_dest_addr());
|
|
8009932: 4b50 ldr r3, [pc, #320] ; (8009a74 <tcp_listen_input+0x1f0>)
|
|
8009934: 695a ldr r2, [r3, #20]
|
|
8009936: 697b ldr r3, [r7, #20]
|
|
8009938: 601a str r2, [r3, #0]
|
|
ip_addr_copy(npcb->remote_ip, *ip_current_src_addr());
|
|
800993a: 4b4e ldr r3, [pc, #312] ; (8009a74 <tcp_listen_input+0x1f0>)
|
|
800993c: 691a ldr r2, [r3, #16]
|
|
800993e: 697b ldr r3, [r7, #20]
|
|
8009940: 605a str r2, [r3, #4]
|
|
npcb->local_port = pcb->local_port;
|
|
8009942: 687b ldr r3, [r7, #4]
|
|
8009944: 8ada ldrh r2, [r3, #22]
|
|
8009946: 697b ldr r3, [r7, #20]
|
|
8009948: 82da strh r2, [r3, #22]
|
|
npcb->remote_port = tcphdr->src;
|
|
800994a: 4b47 ldr r3, [pc, #284] ; (8009a68 <tcp_listen_input+0x1e4>)
|
|
800994c: 681b ldr r3, [r3, #0]
|
|
800994e: 881b ldrh r3, [r3, #0]
|
|
8009950: b29a uxth r2, r3
|
|
8009952: 697b ldr r3, [r7, #20]
|
|
8009954: 831a strh r2, [r3, #24]
|
|
npcb->state = SYN_RCVD;
|
|
8009956: 697b ldr r3, [r7, #20]
|
|
8009958: 2203 movs r2, #3
|
|
800995a: 751a strb r2, [r3, #20]
|
|
npcb->rcv_nxt = seqno + 1;
|
|
800995c: 4b41 ldr r3, [pc, #260] ; (8009a64 <tcp_listen_input+0x1e0>)
|
|
800995e: 681b ldr r3, [r3, #0]
|
|
8009960: 1c5a adds r2, r3, #1
|
|
8009962: 697b ldr r3, [r7, #20]
|
|
8009964: 625a str r2, [r3, #36] ; 0x24
|
|
npcb->rcv_ann_right_edge = npcb->rcv_nxt;
|
|
8009966: 697b ldr r3, [r7, #20]
|
|
8009968: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
800996a: 697b ldr r3, [r7, #20]
|
|
800996c: 62da str r2, [r3, #44] ; 0x2c
|
|
iss = tcp_next_iss(npcb);
|
|
800996e: 6978 ldr r0, [r7, #20]
|
|
8009970: f7ff fa52 bl 8008e18 <tcp_next_iss>
|
|
8009974: 6138 str r0, [r7, #16]
|
|
npcb->snd_wl2 = iss;
|
|
8009976: 697b ldr r3, [r7, #20]
|
|
8009978: 693a ldr r2, [r7, #16]
|
|
800997a: 659a str r2, [r3, #88] ; 0x58
|
|
npcb->snd_nxt = iss;
|
|
800997c: 697b ldr r3, [r7, #20]
|
|
800997e: 693a ldr r2, [r7, #16]
|
|
8009980: 651a str r2, [r3, #80] ; 0x50
|
|
npcb->lastack = iss;
|
|
8009982: 697b ldr r3, [r7, #20]
|
|
8009984: 693a ldr r2, [r7, #16]
|
|
8009986: 645a str r2, [r3, #68] ; 0x44
|
|
npcb->snd_lbb = iss;
|
|
8009988: 697b ldr r3, [r7, #20]
|
|
800998a: 693a ldr r2, [r7, #16]
|
|
800998c: 65da str r2, [r3, #92] ; 0x5c
|
|
npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
|
|
800998e: 4b35 ldr r3, [pc, #212] ; (8009a64 <tcp_listen_input+0x1e0>)
|
|
8009990: 681b ldr r3, [r3, #0]
|
|
8009992: 1e5a subs r2, r3, #1
|
|
8009994: 697b ldr r3, [r7, #20]
|
|
8009996: 655a str r2, [r3, #84] ; 0x54
|
|
npcb->callback_arg = pcb->callback_arg;
|
|
8009998: 687b ldr r3, [r7, #4]
|
|
800999a: 691a ldr r2, [r3, #16]
|
|
800999c: 697b ldr r3, [r7, #20]
|
|
800999e: 611a str r2, [r3, #16]
|
|
npcb->listener = pcb;
|
|
80099a0: 697b ldr r3, [r7, #20]
|
|
80099a2: 687a ldr r2, [r7, #4]
|
|
80099a4: 67da str r2, [r3, #124] ; 0x7c
|
|
npcb->so_options = pcb->so_options & SOF_INHERITED;
|
|
80099a6: 687b ldr r3, [r7, #4]
|
|
80099a8: 7a5b ldrb r3, [r3, #9]
|
|
80099aa: f003 030c and.w r3, r3, #12
|
|
80099ae: b2da uxtb r2, r3
|
|
80099b0: 697b ldr r3, [r7, #20]
|
|
80099b2: 725a strb r2, [r3, #9]
|
|
npcb->netif_idx = pcb->netif_idx;
|
|
80099b4: 687b ldr r3, [r7, #4]
|
|
80099b6: 7a1a ldrb r2, [r3, #8]
|
|
80099b8: 697b ldr r3, [r7, #20]
|
|
80099ba: 721a strb r2, [r3, #8]
|
|
TCP_REG_ACTIVE(npcb);
|
|
80099bc: 4b2e ldr r3, [pc, #184] ; (8009a78 <tcp_listen_input+0x1f4>)
|
|
80099be: 681a ldr r2, [r3, #0]
|
|
80099c0: 697b ldr r3, [r7, #20]
|
|
80099c2: 60da str r2, [r3, #12]
|
|
80099c4: 4a2c ldr r2, [pc, #176] ; (8009a78 <tcp_listen_input+0x1f4>)
|
|
80099c6: 697b ldr r3, [r7, #20]
|
|
80099c8: 6013 str r3, [r2, #0]
|
|
80099ca: f003 fd95 bl 800d4f8 <tcp_timer_needed>
|
|
80099ce: 4b2b ldr r3, [pc, #172] ; (8009a7c <tcp_listen_input+0x1f8>)
|
|
80099d0: 2201 movs r2, #1
|
|
80099d2: 701a strb r2, [r3, #0]
|
|
tcp_parseopt(npcb);
|
|
80099d4: 6978 ldr r0, [r7, #20]
|
|
80099d6: f001 fd8f bl 800b4f8 <tcp_parseopt>
|
|
npcb->snd_wnd = tcphdr->wnd;
|
|
80099da: 4b23 ldr r3, [pc, #140] ; (8009a68 <tcp_listen_input+0x1e4>)
|
|
80099dc: 681b ldr r3, [r3, #0]
|
|
80099de: 89db ldrh r3, [r3, #14]
|
|
80099e0: b29a uxth r2, r3
|
|
80099e2: 697b ldr r3, [r7, #20]
|
|
80099e4: f8a3 2060 strh.w r2, [r3, #96] ; 0x60
|
|
npcb->snd_wnd_max = npcb->snd_wnd;
|
|
80099e8: 697b ldr r3, [r7, #20]
|
|
80099ea: f8b3 2060 ldrh.w r2, [r3, #96] ; 0x60
|
|
80099ee: 697b ldr r3, [r7, #20]
|
|
80099f0: f8a3 2062 strh.w r2, [r3, #98] ; 0x62
|
|
npcb->mss = tcp_eff_send_mss(npcb->mss, &npcb->local_ip, &npcb->remote_ip);
|
|
80099f4: 697b ldr r3, [r7, #20]
|
|
80099f6: 8e5c ldrh r4, [r3, #50] ; 0x32
|
|
80099f8: 697b ldr r3, [r7, #20]
|
|
80099fa: 3304 adds r3, #4
|
|
80099fc: 4618 mov r0, r3
|
|
80099fe: f005 fa43 bl 800ee88 <ip4_route>
|
|
8009a02: 4601 mov r1, r0
|
|
8009a04: 697b ldr r3, [r7, #20]
|
|
8009a06: 3304 adds r3, #4
|
|
8009a08: 461a mov r2, r3
|
|
8009a0a: 4620 mov r0, r4
|
|
8009a0c: f7ff fa2a bl 8008e64 <tcp_eff_send_mss_netif>
|
|
8009a10: 4603 mov r3, r0
|
|
8009a12: 461a mov r2, r3
|
|
8009a14: 697b ldr r3, [r7, #20]
|
|
8009a16: 865a strh r2, [r3, #50] ; 0x32
|
|
rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK);
|
|
8009a18: 2112 movs r1, #18
|
|
8009a1a: 6978 ldr r0, [r7, #20]
|
|
8009a1c: f002 fcfc bl 800c418 <tcp_enqueue_flags>
|
|
8009a20: 4603 mov r3, r0
|
|
8009a22: 73fb strb r3, [r7, #15]
|
|
if (rc != ERR_OK) {
|
|
8009a24: f997 300f ldrsb.w r3, [r7, #15]
|
|
8009a28: 2b00 cmp r3, #0
|
|
8009a2a: d004 beq.n 8009a36 <tcp_listen_input+0x1b2>
|
|
tcp_abandon(npcb, 0);
|
|
8009a2c: 2100 movs r1, #0
|
|
8009a2e: 6978 ldr r0, [r7, #20]
|
|
8009a30: f7fd ff9a bl 8007968 <tcp_abandon>
|
|
return;
|
|
8009a34: e006 b.n 8009a44 <tcp_listen_input+0x1c0>
|
|
tcp_output(npcb);
|
|
8009a36: 6978 ldr r0, [r7, #20]
|
|
8009a38: f002 fddc bl 800c5f4 <tcp_output>
|
|
return;
|
|
8009a3c: e001 b.n 8009a42 <tcp_listen_input+0x1be>
|
|
return;
|
|
8009a3e: bf00 nop
|
|
8009a40: e000 b.n 8009a44 <tcp_listen_input+0x1c0>
|
|
return;
|
|
8009a42: bf00 nop
|
|
}
|
|
8009a44: 371c adds r7, #28
|
|
8009a46: 46bd mov sp, r7
|
|
8009a48: bd90 pop {r4, r7, pc}
|
|
8009a4a: bf00 nop
|
|
8009a4c: 24007bb4 .word 0x24007bb4
|
|
8009a50: 08013198 .word 0x08013198
|
|
8009a54: 08013390 .word 0x08013390
|
|
8009a58: 080131e4 .word 0x080131e4
|
|
8009a5c: 24007bac .word 0x24007bac
|
|
8009a60: 24007bb2 .word 0x24007bb2
|
|
8009a64: 24007ba8 .word 0x24007ba8
|
|
8009a68: 24007b98 .word 0x24007b98
|
|
8009a6c: 24004c20 .word 0x24004c20
|
|
8009a70: 24004c24 .word 0x24004c24
|
|
8009a74: 24004c10 .word 0x24004c10
|
|
8009a78: 24007b78 .word 0x24007b78
|
|
8009a7c: 24007b80 .word 0x24007b80
|
|
|
|
08009a80 <tcp_timewait_input>:
|
|
* @note the segment which arrived is saved in global variables, therefore only the pcb
|
|
* involved is passed as a parameter to this function
|
|
*/
|
|
static void
|
|
tcp_timewait_input(struct tcp_pcb *pcb)
|
|
{
|
|
8009a80: b580 push {r7, lr}
|
|
8009a82: b086 sub sp, #24
|
|
8009a84: af04 add r7, sp, #16
|
|
8009a86: 6078 str r0, [r7, #4]
|
|
/* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */
|
|
/* RFC 793 3.9 Event Processing - Segment Arrives:
|
|
* - first check sequence number - we skip that one in TIME_WAIT (always
|
|
* acceptable since we only send ACKs)
|
|
* - second check the RST bit (... return) */
|
|
if (flags & TCP_RST) {
|
|
8009a88: 4b2f ldr r3, [pc, #188] ; (8009b48 <tcp_timewait_input+0xc8>)
|
|
8009a8a: 781b ldrb r3, [r3, #0]
|
|
8009a8c: f003 0304 and.w r3, r3, #4
|
|
8009a90: 2b00 cmp r3, #0
|
|
8009a92: d153 bne.n 8009b3c <tcp_timewait_input+0xbc>
|
|
return;
|
|
}
|
|
|
|
LWIP_ASSERT("tcp_timewait_input: invalid pcb", pcb != NULL);
|
|
8009a94: 687b ldr r3, [r7, #4]
|
|
8009a96: 2b00 cmp r3, #0
|
|
8009a98: d106 bne.n 8009aa8 <tcp_timewait_input+0x28>
|
|
8009a9a: 4b2c ldr r3, [pc, #176] ; (8009b4c <tcp_timewait_input+0xcc>)
|
|
8009a9c: f240 22ee movw r2, #750 ; 0x2ee
|
|
8009aa0: 492b ldr r1, [pc, #172] ; (8009b50 <tcp_timewait_input+0xd0>)
|
|
8009aa2: 482c ldr r0, [pc, #176] ; (8009b54 <tcp_timewait_input+0xd4>)
|
|
8009aa4: f007 f890 bl 8010bc8 <iprintf>
|
|
|
|
/* - fourth, check the SYN bit, */
|
|
if (flags & TCP_SYN) {
|
|
8009aa8: 4b27 ldr r3, [pc, #156] ; (8009b48 <tcp_timewait_input+0xc8>)
|
|
8009aaa: 781b ldrb r3, [r3, #0]
|
|
8009aac: f003 0302 and.w r3, r3, #2
|
|
8009ab0: 2b00 cmp r3, #0
|
|
8009ab2: d02a beq.n 8009b0a <tcp_timewait_input+0x8a>
|
|
/* If an incoming segment is not acceptable, an acknowledgment
|
|
should be sent in reply */
|
|
if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd)) {
|
|
8009ab4: 4b28 ldr r3, [pc, #160] ; (8009b58 <tcp_timewait_input+0xd8>)
|
|
8009ab6: 681a ldr r2, [r3, #0]
|
|
8009ab8: 687b ldr r3, [r7, #4]
|
|
8009aba: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
8009abc: 1ad3 subs r3, r2, r3
|
|
8009abe: 2b00 cmp r3, #0
|
|
8009ac0: db2d blt.n 8009b1e <tcp_timewait_input+0x9e>
|
|
8009ac2: 4b25 ldr r3, [pc, #148] ; (8009b58 <tcp_timewait_input+0xd8>)
|
|
8009ac4: 681a ldr r2, [r3, #0]
|
|
8009ac6: 687b ldr r3, [r7, #4]
|
|
8009ac8: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
8009aca: 6879 ldr r1, [r7, #4]
|
|
8009acc: 8d09 ldrh r1, [r1, #40] ; 0x28
|
|
8009ace: 440b add r3, r1
|
|
8009ad0: 1ad3 subs r3, r2, r3
|
|
8009ad2: 2b00 cmp r3, #0
|
|
8009ad4: dc23 bgt.n 8009b1e <tcp_timewait_input+0x9e>
|
|
/* If the SYN is in the window it is an error, send a reset */
|
|
tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
8009ad6: 4b21 ldr r3, [pc, #132] ; (8009b5c <tcp_timewait_input+0xdc>)
|
|
8009ad8: 6819 ldr r1, [r3, #0]
|
|
8009ada: 4b21 ldr r3, [pc, #132] ; (8009b60 <tcp_timewait_input+0xe0>)
|
|
8009adc: 881b ldrh r3, [r3, #0]
|
|
8009ade: 461a mov r2, r3
|
|
8009ae0: 4b1d ldr r3, [pc, #116] ; (8009b58 <tcp_timewait_input+0xd8>)
|
|
8009ae2: 681b ldr r3, [r3, #0]
|
|
8009ae4: 18d0 adds r0, r2, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
8009ae6: 4b1f ldr r3, [pc, #124] ; (8009b64 <tcp_timewait_input+0xe4>)
|
|
8009ae8: 681b ldr r3, [r3, #0]
|
|
tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
8009aea: 885b ldrh r3, [r3, #2]
|
|
8009aec: b29b uxth r3, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
8009aee: 4a1d ldr r2, [pc, #116] ; (8009b64 <tcp_timewait_input+0xe4>)
|
|
8009af0: 6812 ldr r2, [r2, #0]
|
|
tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
8009af2: 8812 ldrh r2, [r2, #0]
|
|
8009af4: b292 uxth r2, r2
|
|
8009af6: 9202 str r2, [sp, #8]
|
|
8009af8: 9301 str r3, [sp, #4]
|
|
8009afa: 4b1b ldr r3, [pc, #108] ; (8009b68 <tcp_timewait_input+0xe8>)
|
|
8009afc: 9300 str r3, [sp, #0]
|
|
8009afe: 4b1b ldr r3, [pc, #108] ; (8009b6c <tcp_timewait_input+0xec>)
|
|
8009b00: 4602 mov r2, r0
|
|
8009b02: 6878 ldr r0, [r7, #4]
|
|
8009b04: f003 fb36 bl 800d174 <tcp_rst>
|
|
return;
|
|
8009b08: e01b b.n 8009b42 <tcp_timewait_input+0xc2>
|
|
}
|
|
} else if (flags & TCP_FIN) {
|
|
8009b0a: 4b0f ldr r3, [pc, #60] ; (8009b48 <tcp_timewait_input+0xc8>)
|
|
8009b0c: 781b ldrb r3, [r3, #0]
|
|
8009b0e: f003 0301 and.w r3, r3, #1
|
|
8009b12: 2b00 cmp r3, #0
|
|
8009b14: d003 beq.n 8009b1e <tcp_timewait_input+0x9e>
|
|
/* - eighth, check the FIN bit: Remain in the TIME-WAIT state.
|
|
Restart the 2 MSL time-wait timeout.*/
|
|
pcb->tmr = tcp_ticks;
|
|
8009b16: 4b16 ldr r3, [pc, #88] ; (8009b70 <tcp_timewait_input+0xf0>)
|
|
8009b18: 681a ldr r2, [r3, #0]
|
|
8009b1a: 687b ldr r3, [r7, #4]
|
|
8009b1c: 621a str r2, [r3, #32]
|
|
}
|
|
|
|
if ((tcplen > 0)) {
|
|
8009b1e: 4b10 ldr r3, [pc, #64] ; (8009b60 <tcp_timewait_input+0xe0>)
|
|
8009b20: 881b ldrh r3, [r3, #0]
|
|
8009b22: 2b00 cmp r3, #0
|
|
8009b24: d00c beq.n 8009b40 <tcp_timewait_input+0xc0>
|
|
/* Acknowledge data, FIN or out-of-window SYN */
|
|
tcp_ack_now(pcb);
|
|
8009b26: 687b ldr r3, [r7, #4]
|
|
8009b28: 8b5b ldrh r3, [r3, #26]
|
|
8009b2a: f043 0302 orr.w r3, r3, #2
|
|
8009b2e: b29a uxth r2, r3
|
|
8009b30: 687b ldr r3, [r7, #4]
|
|
8009b32: 835a strh r2, [r3, #26]
|
|
tcp_output(pcb);
|
|
8009b34: 6878 ldr r0, [r7, #4]
|
|
8009b36: f002 fd5d bl 800c5f4 <tcp_output>
|
|
}
|
|
return;
|
|
8009b3a: e001 b.n 8009b40 <tcp_timewait_input+0xc0>
|
|
return;
|
|
8009b3c: bf00 nop
|
|
8009b3e: e000 b.n 8009b42 <tcp_timewait_input+0xc2>
|
|
return;
|
|
8009b40: bf00 nop
|
|
}
|
|
8009b42: 3708 adds r7, #8
|
|
8009b44: 46bd mov sp, r7
|
|
8009b46: bd80 pop {r7, pc}
|
|
8009b48: 24007bb4 .word 0x24007bb4
|
|
8009b4c: 08013198 .word 0x08013198
|
|
8009b50: 080133b0 .word 0x080133b0
|
|
8009b54: 080131e4 .word 0x080131e4
|
|
8009b58: 24007ba8 .word 0x24007ba8
|
|
8009b5c: 24007bac .word 0x24007bac
|
|
8009b60: 24007bb2 .word 0x24007bb2
|
|
8009b64: 24007b98 .word 0x24007b98
|
|
8009b68: 24004c20 .word 0x24004c20
|
|
8009b6c: 24004c24 .word 0x24004c24
|
|
8009b70: 24007b6c .word 0x24007b6c
|
|
|
|
08009b74 <tcp_process>:
|
|
* @note the segment which arrived is saved in global variables, therefore only the pcb
|
|
* involved is passed as a parameter to this function
|
|
*/
|
|
static err_t
|
|
tcp_process(struct tcp_pcb *pcb)
|
|
{
|
|
8009b74: b590 push {r4, r7, lr}
|
|
8009b76: b08d sub sp, #52 ; 0x34
|
|
8009b78: af04 add r7, sp, #16
|
|
8009b7a: 6078 str r0, [r7, #4]
|
|
struct tcp_seg *rseg;
|
|
u8_t acceptable = 0;
|
|
8009b7c: 2300 movs r3, #0
|
|
8009b7e: 77fb strb r3, [r7, #31]
|
|
err_t err;
|
|
|
|
err = ERR_OK;
|
|
8009b80: 2300 movs r3, #0
|
|
8009b82: 77bb strb r3, [r7, #30]
|
|
|
|
LWIP_ASSERT("tcp_process: invalid pcb", pcb != NULL);
|
|
8009b84: 687b ldr r3, [r7, #4]
|
|
8009b86: 2b00 cmp r3, #0
|
|
8009b88: d106 bne.n 8009b98 <tcp_process+0x24>
|
|
8009b8a: 4b9d ldr r3, [pc, #628] ; (8009e00 <tcp_process+0x28c>)
|
|
8009b8c: f44f 7247 mov.w r2, #796 ; 0x31c
|
|
8009b90: 499c ldr r1, [pc, #624] ; (8009e04 <tcp_process+0x290>)
|
|
8009b92: 489d ldr r0, [pc, #628] ; (8009e08 <tcp_process+0x294>)
|
|
8009b94: f007 f818 bl 8010bc8 <iprintf>
|
|
|
|
/* Process incoming RST segments. */
|
|
if (flags & TCP_RST) {
|
|
8009b98: 4b9c ldr r3, [pc, #624] ; (8009e0c <tcp_process+0x298>)
|
|
8009b9a: 781b ldrb r3, [r3, #0]
|
|
8009b9c: f003 0304 and.w r3, r3, #4
|
|
8009ba0: 2b00 cmp r3, #0
|
|
8009ba2: d04e beq.n 8009c42 <tcp_process+0xce>
|
|
/* First, determine if the reset is acceptable. */
|
|
if (pcb->state == SYN_SENT) {
|
|
8009ba4: 687b ldr r3, [r7, #4]
|
|
8009ba6: 7d1b ldrb r3, [r3, #20]
|
|
8009ba8: 2b02 cmp r3, #2
|
|
8009baa: d108 bne.n 8009bbe <tcp_process+0x4a>
|
|
/* "In the SYN-SENT state (a RST received in response to an initial SYN),
|
|
the RST is acceptable if the ACK field acknowledges the SYN." */
|
|
if (ackno == pcb->snd_nxt) {
|
|
8009bac: 687b ldr r3, [r7, #4]
|
|
8009bae: 6d1a ldr r2, [r3, #80] ; 0x50
|
|
8009bb0: 4b97 ldr r3, [pc, #604] ; (8009e10 <tcp_process+0x29c>)
|
|
8009bb2: 681b ldr r3, [r3, #0]
|
|
8009bb4: 429a cmp r2, r3
|
|
8009bb6: d123 bne.n 8009c00 <tcp_process+0x8c>
|
|
acceptable = 1;
|
|
8009bb8: 2301 movs r3, #1
|
|
8009bba: 77fb strb r3, [r7, #31]
|
|
8009bbc: e020 b.n 8009c00 <tcp_process+0x8c>
|
|
}
|
|
} else {
|
|
/* "In all states except SYN-SENT, all reset (RST) segments are validated
|
|
by checking their SEQ-fields." */
|
|
if (seqno == pcb->rcv_nxt) {
|
|
8009bbe: 687b ldr r3, [r7, #4]
|
|
8009bc0: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
8009bc2: 4b94 ldr r3, [pc, #592] ; (8009e14 <tcp_process+0x2a0>)
|
|
8009bc4: 681b ldr r3, [r3, #0]
|
|
8009bc6: 429a cmp r2, r3
|
|
8009bc8: d102 bne.n 8009bd0 <tcp_process+0x5c>
|
|
acceptable = 1;
|
|
8009bca: 2301 movs r3, #1
|
|
8009bcc: 77fb strb r3, [r7, #31]
|
|
8009bce: e017 b.n 8009c00 <tcp_process+0x8c>
|
|
} else if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
|
|
8009bd0: 4b90 ldr r3, [pc, #576] ; (8009e14 <tcp_process+0x2a0>)
|
|
8009bd2: 681a ldr r2, [r3, #0]
|
|
8009bd4: 687b ldr r3, [r7, #4]
|
|
8009bd6: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
8009bd8: 1ad3 subs r3, r2, r3
|
|
8009bda: 2b00 cmp r3, #0
|
|
8009bdc: db10 blt.n 8009c00 <tcp_process+0x8c>
|
|
8009bde: 4b8d ldr r3, [pc, #564] ; (8009e14 <tcp_process+0x2a0>)
|
|
8009be0: 681a ldr r2, [r3, #0]
|
|
8009be2: 687b ldr r3, [r7, #4]
|
|
8009be4: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
8009be6: 6879 ldr r1, [r7, #4]
|
|
8009be8: 8d09 ldrh r1, [r1, #40] ; 0x28
|
|
8009bea: 440b add r3, r1
|
|
8009bec: 1ad3 subs r3, r2, r3
|
|
8009bee: 2b00 cmp r3, #0
|
|
8009bf0: dc06 bgt.n 8009c00 <tcp_process+0x8c>
|
|
pcb->rcv_nxt + pcb->rcv_wnd)) {
|
|
/* If the sequence number is inside the window, we send a challenge ACK
|
|
and wait for a re-send with matching sequence number.
|
|
This follows RFC 5961 section 3.2 and addresses CVE-2004-0230
|
|
(RST spoofing attack), which is present in RFC 793 RST handling. */
|
|
tcp_ack_now(pcb);
|
|
8009bf2: 687b ldr r3, [r7, #4]
|
|
8009bf4: 8b5b ldrh r3, [r3, #26]
|
|
8009bf6: f043 0302 orr.w r3, r3, #2
|
|
8009bfa: b29a uxth r2, r3
|
|
8009bfc: 687b ldr r3, [r7, #4]
|
|
8009bfe: 835a strh r2, [r3, #26]
|
|
}
|
|
}
|
|
|
|
if (acceptable) {
|
|
8009c00: 7ffb ldrb r3, [r7, #31]
|
|
8009c02: 2b00 cmp r3, #0
|
|
8009c04: d01b beq.n 8009c3e <tcp_process+0xca>
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n"));
|
|
LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
|
|
8009c06: 687b ldr r3, [r7, #4]
|
|
8009c08: 7d1b ldrb r3, [r3, #20]
|
|
8009c0a: 2b00 cmp r3, #0
|
|
8009c0c: d106 bne.n 8009c1c <tcp_process+0xa8>
|
|
8009c0e: 4b7c ldr r3, [pc, #496] ; (8009e00 <tcp_process+0x28c>)
|
|
8009c10: f44f 724e mov.w r2, #824 ; 0x338
|
|
8009c14: 4980 ldr r1, [pc, #512] ; (8009e18 <tcp_process+0x2a4>)
|
|
8009c16: 487c ldr r0, [pc, #496] ; (8009e08 <tcp_process+0x294>)
|
|
8009c18: f006 ffd6 bl 8010bc8 <iprintf>
|
|
recv_flags |= TF_RESET;
|
|
8009c1c: 4b7f ldr r3, [pc, #508] ; (8009e1c <tcp_process+0x2a8>)
|
|
8009c1e: 781b ldrb r3, [r3, #0]
|
|
8009c20: f043 0308 orr.w r3, r3, #8
|
|
8009c24: b2da uxtb r2, r3
|
|
8009c26: 4b7d ldr r3, [pc, #500] ; (8009e1c <tcp_process+0x2a8>)
|
|
8009c28: 701a strb r2, [r3, #0]
|
|
tcp_clear_flags(pcb, TF_ACK_DELAY);
|
|
8009c2a: 687b ldr r3, [r7, #4]
|
|
8009c2c: 8b5b ldrh r3, [r3, #26]
|
|
8009c2e: f023 0301 bic.w r3, r3, #1
|
|
8009c32: b29a uxth r2, r3
|
|
8009c34: 687b ldr r3, [r7, #4]
|
|
8009c36: 835a strh r2, [r3, #26]
|
|
return ERR_RST;
|
|
8009c38: f06f 030d mvn.w r3, #13
|
|
8009c3c: e37a b.n 800a334 <tcp_process+0x7c0>
|
|
} else {
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n",
|
|
seqno, pcb->rcv_nxt));
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n",
|
|
seqno, pcb->rcv_nxt));
|
|
return ERR_OK;
|
|
8009c3e: 2300 movs r3, #0
|
|
8009c40: e378 b.n 800a334 <tcp_process+0x7c0>
|
|
}
|
|
}
|
|
|
|
if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) {
|
|
8009c42: 4b72 ldr r3, [pc, #456] ; (8009e0c <tcp_process+0x298>)
|
|
8009c44: 781b ldrb r3, [r3, #0]
|
|
8009c46: f003 0302 and.w r3, r3, #2
|
|
8009c4a: 2b00 cmp r3, #0
|
|
8009c4c: d010 beq.n 8009c70 <tcp_process+0xfc>
|
|
8009c4e: 687b ldr r3, [r7, #4]
|
|
8009c50: 7d1b ldrb r3, [r3, #20]
|
|
8009c52: 2b02 cmp r3, #2
|
|
8009c54: d00c beq.n 8009c70 <tcp_process+0xfc>
|
|
8009c56: 687b ldr r3, [r7, #4]
|
|
8009c58: 7d1b ldrb r3, [r3, #20]
|
|
8009c5a: 2b03 cmp r3, #3
|
|
8009c5c: d008 beq.n 8009c70 <tcp_process+0xfc>
|
|
/* Cope with new connection attempt after remote end crashed */
|
|
tcp_ack_now(pcb);
|
|
8009c5e: 687b ldr r3, [r7, #4]
|
|
8009c60: 8b5b ldrh r3, [r3, #26]
|
|
8009c62: f043 0302 orr.w r3, r3, #2
|
|
8009c66: b29a uxth r2, r3
|
|
8009c68: 687b ldr r3, [r7, #4]
|
|
8009c6a: 835a strh r2, [r3, #26]
|
|
return ERR_OK;
|
|
8009c6c: 2300 movs r3, #0
|
|
8009c6e: e361 b.n 800a334 <tcp_process+0x7c0>
|
|
}
|
|
|
|
if ((pcb->flags & TF_RXCLOSED) == 0) {
|
|
8009c70: 687b ldr r3, [r7, #4]
|
|
8009c72: 8b5b ldrh r3, [r3, #26]
|
|
8009c74: f003 0310 and.w r3, r3, #16
|
|
8009c78: 2b00 cmp r3, #0
|
|
8009c7a: d103 bne.n 8009c84 <tcp_process+0x110>
|
|
/* Update the PCB (in)activity timer unless rx is closed (see tcp_shutdown) */
|
|
pcb->tmr = tcp_ticks;
|
|
8009c7c: 4b68 ldr r3, [pc, #416] ; (8009e20 <tcp_process+0x2ac>)
|
|
8009c7e: 681a ldr r2, [r3, #0]
|
|
8009c80: 687b ldr r3, [r7, #4]
|
|
8009c82: 621a str r2, [r3, #32]
|
|
}
|
|
pcb->keep_cnt_sent = 0;
|
|
8009c84: 687b ldr r3, [r7, #4]
|
|
8009c86: 2200 movs r2, #0
|
|
8009c88: f883 209b strb.w r2, [r3, #155] ; 0x9b
|
|
pcb->persist_probe = 0;
|
|
8009c8c: 687b ldr r3, [r7, #4]
|
|
8009c8e: 2200 movs r2, #0
|
|
8009c90: f883 209a strb.w r2, [r3, #154] ; 0x9a
|
|
|
|
tcp_parseopt(pcb);
|
|
8009c94: 6878 ldr r0, [r7, #4]
|
|
8009c96: f001 fc2f bl 800b4f8 <tcp_parseopt>
|
|
|
|
/* Do different things depending on the TCP state. */
|
|
switch (pcb->state) {
|
|
8009c9a: 687b ldr r3, [r7, #4]
|
|
8009c9c: 7d1b ldrb r3, [r3, #20]
|
|
8009c9e: 3b02 subs r3, #2
|
|
8009ca0: 2b07 cmp r3, #7
|
|
8009ca2: f200 8337 bhi.w 800a314 <tcp_process+0x7a0>
|
|
8009ca6: a201 add r2, pc, #4 ; (adr r2, 8009cac <tcp_process+0x138>)
|
|
8009ca8: f852 f023 ldr.w pc, [r2, r3, lsl #2]
|
|
8009cac: 08009ccd .word 0x08009ccd
|
|
8009cb0: 08009efd .word 0x08009efd
|
|
8009cb4: 0800a075 .word 0x0800a075
|
|
8009cb8: 0800a09f .word 0x0800a09f
|
|
8009cbc: 0800a1c3 .word 0x0800a1c3
|
|
8009cc0: 0800a075 .word 0x0800a075
|
|
8009cc4: 0800a24f .word 0x0800a24f
|
|
8009cc8: 0800a2df .word 0x0800a2df
|
|
case SYN_SENT:
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
|
|
pcb->snd_nxt, lwip_ntohl(pcb->unacked->tcphdr->seqno)));
|
|
/* received SYN ACK with expected sequence number? */
|
|
if ((flags & TCP_ACK) && (flags & TCP_SYN)
|
|
8009ccc: 4b4f ldr r3, [pc, #316] ; (8009e0c <tcp_process+0x298>)
|
|
8009cce: 781b ldrb r3, [r3, #0]
|
|
8009cd0: f003 0310 and.w r3, r3, #16
|
|
8009cd4: 2b00 cmp r3, #0
|
|
8009cd6: f000 80e4 beq.w 8009ea2 <tcp_process+0x32e>
|
|
8009cda: 4b4c ldr r3, [pc, #304] ; (8009e0c <tcp_process+0x298>)
|
|
8009cdc: 781b ldrb r3, [r3, #0]
|
|
8009cde: f003 0302 and.w r3, r3, #2
|
|
8009ce2: 2b00 cmp r3, #0
|
|
8009ce4: f000 80dd beq.w 8009ea2 <tcp_process+0x32e>
|
|
&& (ackno == pcb->lastack + 1)) {
|
|
8009ce8: 687b ldr r3, [r7, #4]
|
|
8009cea: 6c5b ldr r3, [r3, #68] ; 0x44
|
|
8009cec: 1c5a adds r2, r3, #1
|
|
8009cee: 4b48 ldr r3, [pc, #288] ; (8009e10 <tcp_process+0x29c>)
|
|
8009cf0: 681b ldr r3, [r3, #0]
|
|
8009cf2: 429a cmp r2, r3
|
|
8009cf4: f040 80d5 bne.w 8009ea2 <tcp_process+0x32e>
|
|
pcb->rcv_nxt = seqno + 1;
|
|
8009cf8: 4b46 ldr r3, [pc, #280] ; (8009e14 <tcp_process+0x2a0>)
|
|
8009cfa: 681b ldr r3, [r3, #0]
|
|
8009cfc: 1c5a adds r2, r3, #1
|
|
8009cfe: 687b ldr r3, [r7, #4]
|
|
8009d00: 625a str r2, [r3, #36] ; 0x24
|
|
pcb->rcv_ann_right_edge = pcb->rcv_nxt;
|
|
8009d02: 687b ldr r3, [r7, #4]
|
|
8009d04: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
8009d06: 687b ldr r3, [r7, #4]
|
|
8009d08: 62da str r2, [r3, #44] ; 0x2c
|
|
pcb->lastack = ackno;
|
|
8009d0a: 4b41 ldr r3, [pc, #260] ; (8009e10 <tcp_process+0x29c>)
|
|
8009d0c: 681a ldr r2, [r3, #0]
|
|
8009d0e: 687b ldr r3, [r7, #4]
|
|
8009d10: 645a str r2, [r3, #68] ; 0x44
|
|
pcb->snd_wnd = tcphdr->wnd;
|
|
8009d12: 4b44 ldr r3, [pc, #272] ; (8009e24 <tcp_process+0x2b0>)
|
|
8009d14: 681b ldr r3, [r3, #0]
|
|
8009d16: 89db ldrh r3, [r3, #14]
|
|
8009d18: b29a uxth r2, r3
|
|
8009d1a: 687b ldr r3, [r7, #4]
|
|
8009d1c: f8a3 2060 strh.w r2, [r3, #96] ; 0x60
|
|
pcb->snd_wnd_max = pcb->snd_wnd;
|
|
8009d20: 687b ldr r3, [r7, #4]
|
|
8009d22: f8b3 2060 ldrh.w r2, [r3, #96] ; 0x60
|
|
8009d26: 687b ldr r3, [r7, #4]
|
|
8009d28: f8a3 2062 strh.w r2, [r3, #98] ; 0x62
|
|
pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
|
|
8009d2c: 4b39 ldr r3, [pc, #228] ; (8009e14 <tcp_process+0x2a0>)
|
|
8009d2e: 681b ldr r3, [r3, #0]
|
|
8009d30: 1e5a subs r2, r3, #1
|
|
8009d32: 687b ldr r3, [r7, #4]
|
|
8009d34: 655a str r2, [r3, #84] ; 0x54
|
|
pcb->state = ESTABLISHED;
|
|
8009d36: 687b ldr r3, [r7, #4]
|
|
8009d38: 2204 movs r2, #4
|
|
8009d3a: 751a strb r2, [r3, #20]
|
|
|
|
#if TCP_CALCULATE_EFF_SEND_MSS
|
|
pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);
|
|
8009d3c: 687b ldr r3, [r7, #4]
|
|
8009d3e: 8e5c ldrh r4, [r3, #50] ; 0x32
|
|
8009d40: 687b ldr r3, [r7, #4]
|
|
8009d42: 3304 adds r3, #4
|
|
8009d44: 4618 mov r0, r3
|
|
8009d46: f005 f89f bl 800ee88 <ip4_route>
|
|
8009d4a: 4601 mov r1, r0
|
|
8009d4c: 687b ldr r3, [r7, #4]
|
|
8009d4e: 3304 adds r3, #4
|
|
8009d50: 461a mov r2, r3
|
|
8009d52: 4620 mov r0, r4
|
|
8009d54: f7ff f886 bl 8008e64 <tcp_eff_send_mss_netif>
|
|
8009d58: 4603 mov r3, r0
|
|
8009d5a: 461a mov r2, r3
|
|
8009d5c: 687b ldr r3, [r7, #4]
|
|
8009d5e: 865a strh r2, [r3, #50] ; 0x32
|
|
#endif /* TCP_CALCULATE_EFF_SEND_MSS */
|
|
|
|
pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);
|
|
8009d60: 687b ldr r3, [r7, #4]
|
|
8009d62: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009d64: 009a lsls r2, r3, #2
|
|
8009d66: 687b ldr r3, [r7, #4]
|
|
8009d68: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009d6a: 005b lsls r3, r3, #1
|
|
8009d6c: f241 111c movw r1, #4380 ; 0x111c
|
|
8009d70: 428b cmp r3, r1
|
|
8009d72: bf38 it cc
|
|
8009d74: 460b movcc r3, r1
|
|
8009d76: 429a cmp r2, r3
|
|
8009d78: d204 bcs.n 8009d84 <tcp_process+0x210>
|
|
8009d7a: 687b ldr r3, [r7, #4]
|
|
8009d7c: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009d7e: 009b lsls r3, r3, #2
|
|
8009d80: b29b uxth r3, r3
|
|
8009d82: e00d b.n 8009da0 <tcp_process+0x22c>
|
|
8009d84: 687b ldr r3, [r7, #4]
|
|
8009d86: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009d88: 005b lsls r3, r3, #1
|
|
8009d8a: f241 121c movw r2, #4380 ; 0x111c
|
|
8009d8e: 4293 cmp r3, r2
|
|
8009d90: d904 bls.n 8009d9c <tcp_process+0x228>
|
|
8009d92: 687b ldr r3, [r7, #4]
|
|
8009d94: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009d96: 005b lsls r3, r3, #1
|
|
8009d98: b29b uxth r3, r3
|
|
8009d9a: e001 b.n 8009da0 <tcp_process+0x22c>
|
|
8009d9c: f241 131c movw r3, #4380 ; 0x111c
|
|
8009da0: 687a ldr r2, [r7, #4]
|
|
8009da2: f8a2 3048 strh.w r3, [r2, #72] ; 0x48
|
|
LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SENT): cwnd %"TCPWNDSIZE_F
|
|
" ssthresh %"TCPWNDSIZE_F"\n",
|
|
pcb->cwnd, pcb->ssthresh));
|
|
LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
|
|
8009da6: 687b ldr r3, [r7, #4]
|
|
8009da8: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
8009dac: 2b00 cmp r3, #0
|
|
8009dae: d106 bne.n 8009dbe <tcp_process+0x24a>
|
|
8009db0: 4b13 ldr r3, [pc, #76] ; (8009e00 <tcp_process+0x28c>)
|
|
8009db2: f44f 725b mov.w r2, #876 ; 0x36c
|
|
8009db6: 491c ldr r1, [pc, #112] ; (8009e28 <tcp_process+0x2b4>)
|
|
8009db8: 4813 ldr r0, [pc, #76] ; (8009e08 <tcp_process+0x294>)
|
|
8009dba: f006 ff05 bl 8010bc8 <iprintf>
|
|
--pcb->snd_queuelen;
|
|
8009dbe: 687b ldr r3, [r7, #4]
|
|
8009dc0: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
8009dc4: 3b01 subs r3, #1
|
|
8009dc6: b29a uxth r2, r3
|
|
8009dc8: 687b ldr r3, [r7, #4]
|
|
8009dca: f8a3 2066 strh.w r2, [r3, #102] ; 0x66
|
|
LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"TCPWNDSIZE_F"\n", (tcpwnd_size_t)pcb->snd_queuelen));
|
|
rseg = pcb->unacked;
|
|
8009dce: 687b ldr r3, [r7, #4]
|
|
8009dd0: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8009dd2: 617b str r3, [r7, #20]
|
|
if (rseg == NULL) {
|
|
8009dd4: 697b ldr r3, [r7, #20]
|
|
8009dd6: 2b00 cmp r3, #0
|
|
8009dd8: d12a bne.n 8009e30 <tcp_process+0x2bc>
|
|
/* might happen if tcp_output fails in tcp_rexmit_rto()
|
|
in which case the segment is on the unsent list */
|
|
rseg = pcb->unsent;
|
|
8009dda: 687b ldr r3, [r7, #4]
|
|
8009ddc: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
8009dde: 617b str r3, [r7, #20]
|
|
LWIP_ASSERT("no segment to free", rseg != NULL);
|
|
8009de0: 697b ldr r3, [r7, #20]
|
|
8009de2: 2b00 cmp r3, #0
|
|
8009de4: d106 bne.n 8009df4 <tcp_process+0x280>
|
|
8009de6: 4b06 ldr r3, [pc, #24] ; (8009e00 <tcp_process+0x28c>)
|
|
8009de8: f44f 725d mov.w r2, #884 ; 0x374
|
|
8009dec: 490f ldr r1, [pc, #60] ; (8009e2c <tcp_process+0x2b8>)
|
|
8009dee: 4806 ldr r0, [pc, #24] ; (8009e08 <tcp_process+0x294>)
|
|
8009df0: f006 feea bl 8010bc8 <iprintf>
|
|
pcb->unsent = rseg->next;
|
|
8009df4: 697b ldr r3, [r7, #20]
|
|
8009df6: 681a ldr r2, [r3, #0]
|
|
8009df8: 687b ldr r3, [r7, #4]
|
|
8009dfa: 66da str r2, [r3, #108] ; 0x6c
|
|
8009dfc: e01c b.n 8009e38 <tcp_process+0x2c4>
|
|
8009dfe: bf00 nop
|
|
8009e00: 08013198 .word 0x08013198
|
|
8009e04: 080133d0 .word 0x080133d0
|
|
8009e08: 080131e4 .word 0x080131e4
|
|
8009e0c: 24007bb4 .word 0x24007bb4
|
|
8009e10: 24007bac .word 0x24007bac
|
|
8009e14: 24007ba8 .word 0x24007ba8
|
|
8009e18: 080133ec .word 0x080133ec
|
|
8009e1c: 24007bb5 .word 0x24007bb5
|
|
8009e20: 24007b6c .word 0x24007b6c
|
|
8009e24: 24007b98 .word 0x24007b98
|
|
8009e28: 0801340c .word 0x0801340c
|
|
8009e2c: 08013424 .word 0x08013424
|
|
} else {
|
|
pcb->unacked = rseg->next;
|
|
8009e30: 697b ldr r3, [r7, #20]
|
|
8009e32: 681a ldr r2, [r3, #0]
|
|
8009e34: 687b ldr r3, [r7, #4]
|
|
8009e36: 671a str r2, [r3, #112] ; 0x70
|
|
}
|
|
tcp_seg_free(rseg);
|
|
8009e38: 6978 ldr r0, [r7, #20]
|
|
8009e3a: f7fe fc9c bl 8008776 <tcp_seg_free>
|
|
|
|
/* If there's nothing left to acknowledge, stop the retransmit
|
|
timer, otherwise reset it to start again */
|
|
if (pcb->unacked == NULL) {
|
|
8009e3e: 687b ldr r3, [r7, #4]
|
|
8009e40: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
8009e42: 2b00 cmp r3, #0
|
|
8009e44: d104 bne.n 8009e50 <tcp_process+0x2dc>
|
|
pcb->rtime = -1;
|
|
8009e46: 687b ldr r3, [r7, #4]
|
|
8009e48: f64f 72ff movw r2, #65535 ; 0xffff
|
|
8009e4c: 861a strh r2, [r3, #48] ; 0x30
|
|
8009e4e: e006 b.n 8009e5e <tcp_process+0x2ea>
|
|
} else {
|
|
pcb->rtime = 0;
|
|
8009e50: 687b ldr r3, [r7, #4]
|
|
8009e52: 2200 movs r2, #0
|
|
8009e54: 861a strh r2, [r3, #48] ; 0x30
|
|
pcb->nrtx = 0;
|
|
8009e56: 687b ldr r3, [r7, #4]
|
|
8009e58: 2200 movs r2, #0
|
|
8009e5a: f883 2042 strb.w r2, [r3, #66] ; 0x42
|
|
}
|
|
|
|
/* Call the user specified function to call when successfully
|
|
* connected. */
|
|
TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
|
|
8009e5e: 687b ldr r3, [r7, #4]
|
|
8009e60: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
8009e64: 2b00 cmp r3, #0
|
|
8009e66: d00a beq.n 8009e7e <tcp_process+0x30a>
|
|
8009e68: 687b ldr r3, [r7, #4]
|
|
8009e6a: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88
|
|
8009e6e: 687a ldr r2, [r7, #4]
|
|
8009e70: 6910 ldr r0, [r2, #16]
|
|
8009e72: 2200 movs r2, #0
|
|
8009e74: 6879 ldr r1, [r7, #4]
|
|
8009e76: 4798 blx r3
|
|
8009e78: 4603 mov r3, r0
|
|
8009e7a: 77bb strb r3, [r7, #30]
|
|
8009e7c: e001 b.n 8009e82 <tcp_process+0x30e>
|
|
8009e7e: 2300 movs r3, #0
|
|
8009e80: 77bb strb r3, [r7, #30]
|
|
if (err == ERR_ABRT) {
|
|
8009e82: f997 301e ldrsb.w r3, [r7, #30]
|
|
8009e86: f113 0f0d cmn.w r3, #13
|
|
8009e8a: d102 bne.n 8009e92 <tcp_process+0x31e>
|
|
return ERR_ABRT;
|
|
8009e8c: f06f 030c mvn.w r3, #12
|
|
8009e90: e250 b.n 800a334 <tcp_process+0x7c0>
|
|
}
|
|
tcp_ack_now(pcb);
|
|
8009e92: 687b ldr r3, [r7, #4]
|
|
8009e94: 8b5b ldrh r3, [r3, #26]
|
|
8009e96: f043 0302 orr.w r3, r3, #2
|
|
8009e9a: b29a uxth r2, r3
|
|
8009e9c: 687b ldr r3, [r7, #4]
|
|
8009e9e: 835a strh r2, [r3, #26]
|
|
if (pcb->nrtx < TCP_SYNMAXRTX) {
|
|
pcb->rtime = 0;
|
|
tcp_rexmit_rto(pcb);
|
|
}
|
|
}
|
|
break;
|
|
8009ea0: e23a b.n 800a318 <tcp_process+0x7a4>
|
|
else if (flags & TCP_ACK) {
|
|
8009ea2: 4b98 ldr r3, [pc, #608] ; (800a104 <tcp_process+0x590>)
|
|
8009ea4: 781b ldrb r3, [r3, #0]
|
|
8009ea6: f003 0310 and.w r3, r3, #16
|
|
8009eaa: 2b00 cmp r3, #0
|
|
8009eac: f000 8234 beq.w 800a318 <tcp_process+0x7a4>
|
|
tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
8009eb0: 4b95 ldr r3, [pc, #596] ; (800a108 <tcp_process+0x594>)
|
|
8009eb2: 6819 ldr r1, [r3, #0]
|
|
8009eb4: 4b95 ldr r3, [pc, #596] ; (800a10c <tcp_process+0x598>)
|
|
8009eb6: 881b ldrh r3, [r3, #0]
|
|
8009eb8: 461a mov r2, r3
|
|
8009eba: 4b95 ldr r3, [pc, #596] ; (800a110 <tcp_process+0x59c>)
|
|
8009ebc: 681b ldr r3, [r3, #0]
|
|
8009ebe: 18d0 adds r0, r2, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
8009ec0: 4b94 ldr r3, [pc, #592] ; (800a114 <tcp_process+0x5a0>)
|
|
8009ec2: 681b ldr r3, [r3, #0]
|
|
tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
8009ec4: 885b ldrh r3, [r3, #2]
|
|
8009ec6: b29b uxth r3, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
8009ec8: 4a92 ldr r2, [pc, #584] ; (800a114 <tcp_process+0x5a0>)
|
|
8009eca: 6812 ldr r2, [r2, #0]
|
|
tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
8009ecc: 8812 ldrh r2, [r2, #0]
|
|
8009ece: b292 uxth r2, r2
|
|
8009ed0: 9202 str r2, [sp, #8]
|
|
8009ed2: 9301 str r3, [sp, #4]
|
|
8009ed4: 4b90 ldr r3, [pc, #576] ; (800a118 <tcp_process+0x5a4>)
|
|
8009ed6: 9300 str r3, [sp, #0]
|
|
8009ed8: 4b90 ldr r3, [pc, #576] ; (800a11c <tcp_process+0x5a8>)
|
|
8009eda: 4602 mov r2, r0
|
|
8009edc: 6878 ldr r0, [r7, #4]
|
|
8009ede: f003 f949 bl 800d174 <tcp_rst>
|
|
if (pcb->nrtx < TCP_SYNMAXRTX) {
|
|
8009ee2: 687b ldr r3, [r7, #4]
|
|
8009ee4: f893 3042 ldrb.w r3, [r3, #66] ; 0x42
|
|
8009ee8: 2b05 cmp r3, #5
|
|
8009eea: f200 8215 bhi.w 800a318 <tcp_process+0x7a4>
|
|
pcb->rtime = 0;
|
|
8009eee: 687b ldr r3, [r7, #4]
|
|
8009ef0: 2200 movs r2, #0
|
|
8009ef2: 861a strh r2, [r3, #48] ; 0x30
|
|
tcp_rexmit_rto(pcb);
|
|
8009ef4: 6878 ldr r0, [r7, #4]
|
|
8009ef6: f002 ff15 bl 800cd24 <tcp_rexmit_rto>
|
|
break;
|
|
8009efa: e20d b.n 800a318 <tcp_process+0x7a4>
|
|
case SYN_RCVD:
|
|
if (flags & TCP_ACK) {
|
|
8009efc: 4b81 ldr r3, [pc, #516] ; (800a104 <tcp_process+0x590>)
|
|
8009efe: 781b ldrb r3, [r3, #0]
|
|
8009f00: f003 0310 and.w r3, r3, #16
|
|
8009f04: 2b00 cmp r3, #0
|
|
8009f06: f000 80a1 beq.w 800a04c <tcp_process+0x4d8>
|
|
/* expected ACK number? */
|
|
if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
|
|
8009f0a: 4b7f ldr r3, [pc, #508] ; (800a108 <tcp_process+0x594>)
|
|
8009f0c: 681a ldr r2, [r3, #0]
|
|
8009f0e: 687b ldr r3, [r7, #4]
|
|
8009f10: 6c5b ldr r3, [r3, #68] ; 0x44
|
|
8009f12: 1ad3 subs r3, r2, r3
|
|
8009f14: 3b01 subs r3, #1
|
|
8009f16: 2b00 cmp r3, #0
|
|
8009f18: db7e blt.n 800a018 <tcp_process+0x4a4>
|
|
8009f1a: 4b7b ldr r3, [pc, #492] ; (800a108 <tcp_process+0x594>)
|
|
8009f1c: 681a ldr r2, [r3, #0]
|
|
8009f1e: 687b ldr r3, [r7, #4]
|
|
8009f20: 6d1b ldr r3, [r3, #80] ; 0x50
|
|
8009f22: 1ad3 subs r3, r2, r3
|
|
8009f24: 2b00 cmp r3, #0
|
|
8009f26: dc77 bgt.n 800a018 <tcp_process+0x4a4>
|
|
pcb->state = ESTABLISHED;
|
|
8009f28: 687b ldr r3, [r7, #4]
|
|
8009f2a: 2204 movs r2, #4
|
|
8009f2c: 751a strb r2, [r3, #20]
|
|
LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
|
|
#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
|
|
if (pcb->listener == NULL) {
|
|
8009f2e: 687b ldr r3, [r7, #4]
|
|
8009f30: 6fdb ldr r3, [r3, #124] ; 0x7c
|
|
8009f32: 2b00 cmp r3, #0
|
|
8009f34: d102 bne.n 8009f3c <tcp_process+0x3c8>
|
|
/* listen pcb might be closed by now */
|
|
err = ERR_VAL;
|
|
8009f36: 23fa movs r3, #250 ; 0xfa
|
|
8009f38: 77bb strb r3, [r7, #30]
|
|
8009f3a: e01d b.n 8009f78 <tcp_process+0x404>
|
|
} else
|
|
#endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */
|
|
{
|
|
#if LWIP_CALLBACK_API
|
|
LWIP_ASSERT("pcb->listener->accept != NULL", pcb->listener->accept != NULL);
|
|
8009f3c: 687b ldr r3, [r7, #4]
|
|
8009f3e: 6fdb ldr r3, [r3, #124] ; 0x7c
|
|
8009f40: 699b ldr r3, [r3, #24]
|
|
8009f42: 2b00 cmp r3, #0
|
|
8009f44: d106 bne.n 8009f54 <tcp_process+0x3e0>
|
|
8009f46: 4b76 ldr r3, [pc, #472] ; (800a120 <tcp_process+0x5ac>)
|
|
8009f48: f44f 726a mov.w r2, #936 ; 0x3a8
|
|
8009f4c: 4975 ldr r1, [pc, #468] ; (800a124 <tcp_process+0x5b0>)
|
|
8009f4e: 4876 ldr r0, [pc, #472] ; (800a128 <tcp_process+0x5b4>)
|
|
8009f50: f006 fe3a bl 8010bc8 <iprintf>
|
|
#endif
|
|
tcp_backlog_accepted(pcb);
|
|
/* Call the accept function. */
|
|
TCP_EVENT_ACCEPT(pcb->listener, pcb, pcb->callback_arg, ERR_OK, err);
|
|
8009f54: 687b ldr r3, [r7, #4]
|
|
8009f56: 6fdb ldr r3, [r3, #124] ; 0x7c
|
|
8009f58: 699b ldr r3, [r3, #24]
|
|
8009f5a: 2b00 cmp r3, #0
|
|
8009f5c: d00a beq.n 8009f74 <tcp_process+0x400>
|
|
8009f5e: 687b ldr r3, [r7, #4]
|
|
8009f60: 6fdb ldr r3, [r3, #124] ; 0x7c
|
|
8009f62: 699b ldr r3, [r3, #24]
|
|
8009f64: 687a ldr r2, [r7, #4]
|
|
8009f66: 6910 ldr r0, [r2, #16]
|
|
8009f68: 2200 movs r2, #0
|
|
8009f6a: 6879 ldr r1, [r7, #4]
|
|
8009f6c: 4798 blx r3
|
|
8009f6e: 4603 mov r3, r0
|
|
8009f70: 77bb strb r3, [r7, #30]
|
|
8009f72: e001 b.n 8009f78 <tcp_process+0x404>
|
|
8009f74: 23f0 movs r3, #240 ; 0xf0
|
|
8009f76: 77bb strb r3, [r7, #30]
|
|
}
|
|
if (err != ERR_OK) {
|
|
8009f78: f997 301e ldrsb.w r3, [r7, #30]
|
|
8009f7c: 2b00 cmp r3, #0
|
|
8009f7e: d00a beq.n 8009f96 <tcp_process+0x422>
|
|
/* If the accept function returns with an error, we abort
|
|
* the connection. */
|
|
/* Already aborted? */
|
|
if (err != ERR_ABRT) {
|
|
8009f80: f997 301e ldrsb.w r3, [r7, #30]
|
|
8009f84: f113 0f0d cmn.w r3, #13
|
|
8009f88: d002 beq.n 8009f90 <tcp_process+0x41c>
|
|
tcp_abort(pcb);
|
|
8009f8a: 6878 ldr r0, [r7, #4]
|
|
8009f8c: f7fd fdaa bl 8007ae4 <tcp_abort>
|
|
}
|
|
return ERR_ABRT;
|
|
8009f90: f06f 030c mvn.w r3, #12
|
|
8009f94: e1ce b.n 800a334 <tcp_process+0x7c0>
|
|
}
|
|
/* If there was any data contained within this ACK,
|
|
* we'd better pass it on to the application as well. */
|
|
tcp_receive(pcb);
|
|
8009f96: 6878 ldr r0, [r7, #4]
|
|
8009f98: f000 fae0 bl 800a55c <tcp_receive>
|
|
|
|
/* Prevent ACK for SYN to generate a sent event */
|
|
if (recv_acked != 0) {
|
|
8009f9c: 4b63 ldr r3, [pc, #396] ; (800a12c <tcp_process+0x5b8>)
|
|
8009f9e: 881b ldrh r3, [r3, #0]
|
|
8009fa0: 2b00 cmp r3, #0
|
|
8009fa2: d005 beq.n 8009fb0 <tcp_process+0x43c>
|
|
recv_acked--;
|
|
8009fa4: 4b61 ldr r3, [pc, #388] ; (800a12c <tcp_process+0x5b8>)
|
|
8009fa6: 881b ldrh r3, [r3, #0]
|
|
8009fa8: 3b01 subs r3, #1
|
|
8009faa: b29a uxth r2, r3
|
|
8009fac: 4b5f ldr r3, [pc, #380] ; (800a12c <tcp_process+0x5b8>)
|
|
8009fae: 801a strh r2, [r3, #0]
|
|
}
|
|
|
|
pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);
|
|
8009fb0: 687b ldr r3, [r7, #4]
|
|
8009fb2: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009fb4: 009a lsls r2, r3, #2
|
|
8009fb6: 687b ldr r3, [r7, #4]
|
|
8009fb8: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009fba: 005b lsls r3, r3, #1
|
|
8009fbc: f241 111c movw r1, #4380 ; 0x111c
|
|
8009fc0: 428b cmp r3, r1
|
|
8009fc2: bf38 it cc
|
|
8009fc4: 460b movcc r3, r1
|
|
8009fc6: 429a cmp r2, r3
|
|
8009fc8: d204 bcs.n 8009fd4 <tcp_process+0x460>
|
|
8009fca: 687b ldr r3, [r7, #4]
|
|
8009fcc: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009fce: 009b lsls r3, r3, #2
|
|
8009fd0: b29b uxth r3, r3
|
|
8009fd2: e00d b.n 8009ff0 <tcp_process+0x47c>
|
|
8009fd4: 687b ldr r3, [r7, #4]
|
|
8009fd6: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009fd8: 005b lsls r3, r3, #1
|
|
8009fda: f241 121c movw r2, #4380 ; 0x111c
|
|
8009fde: 4293 cmp r3, r2
|
|
8009fe0: d904 bls.n 8009fec <tcp_process+0x478>
|
|
8009fe2: 687b ldr r3, [r7, #4]
|
|
8009fe4: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
8009fe6: 005b lsls r3, r3, #1
|
|
8009fe8: b29b uxth r3, r3
|
|
8009fea: e001 b.n 8009ff0 <tcp_process+0x47c>
|
|
8009fec: f241 131c movw r3, #4380 ; 0x111c
|
|
8009ff0: 687a ldr r2, [r7, #4]
|
|
8009ff2: f8a2 3048 strh.w r3, [r2, #72] ; 0x48
|
|
LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SYN_RCVD): cwnd %"TCPWNDSIZE_F
|
|
" ssthresh %"TCPWNDSIZE_F"\n",
|
|
pcb->cwnd, pcb->ssthresh));
|
|
|
|
if (recv_flags & TF_GOT_FIN) {
|
|
8009ff6: 4b4e ldr r3, [pc, #312] ; (800a130 <tcp_process+0x5bc>)
|
|
8009ff8: 781b ldrb r3, [r3, #0]
|
|
8009ffa: f003 0320 and.w r3, r3, #32
|
|
8009ffe: 2b00 cmp r3, #0
|
|
800a000: d037 beq.n 800a072 <tcp_process+0x4fe>
|
|
tcp_ack_now(pcb);
|
|
800a002: 687b ldr r3, [r7, #4]
|
|
800a004: 8b5b ldrh r3, [r3, #26]
|
|
800a006: f043 0302 orr.w r3, r3, #2
|
|
800a00a: b29a uxth r2, r3
|
|
800a00c: 687b ldr r3, [r7, #4]
|
|
800a00e: 835a strh r2, [r3, #26]
|
|
pcb->state = CLOSE_WAIT;
|
|
800a010: 687b ldr r3, [r7, #4]
|
|
800a012: 2207 movs r2, #7
|
|
800a014: 751a strb r2, [r3, #20]
|
|
if (recv_flags & TF_GOT_FIN) {
|
|
800a016: e02c b.n 800a072 <tcp_process+0x4fe>
|
|
}
|
|
} else {
|
|
/* incorrect ACK number, send RST */
|
|
tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
800a018: 4b3b ldr r3, [pc, #236] ; (800a108 <tcp_process+0x594>)
|
|
800a01a: 6819 ldr r1, [r3, #0]
|
|
800a01c: 4b3b ldr r3, [pc, #236] ; (800a10c <tcp_process+0x598>)
|
|
800a01e: 881b ldrh r3, [r3, #0]
|
|
800a020: 461a mov r2, r3
|
|
800a022: 4b3b ldr r3, [pc, #236] ; (800a110 <tcp_process+0x59c>)
|
|
800a024: 681b ldr r3, [r3, #0]
|
|
800a026: 18d0 adds r0, r2, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
800a028: 4b3a ldr r3, [pc, #232] ; (800a114 <tcp_process+0x5a0>)
|
|
800a02a: 681b ldr r3, [r3, #0]
|
|
tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
800a02c: 885b ldrh r3, [r3, #2]
|
|
800a02e: b29b uxth r3, r3
|
|
ip_current_src_addr(), tcphdr->dest, tcphdr->src);
|
|
800a030: 4a38 ldr r2, [pc, #224] ; (800a114 <tcp_process+0x5a0>)
|
|
800a032: 6812 ldr r2, [r2, #0]
|
|
tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
|
|
800a034: 8812 ldrh r2, [r2, #0]
|
|
800a036: b292 uxth r2, r2
|
|
800a038: 9202 str r2, [sp, #8]
|
|
800a03a: 9301 str r3, [sp, #4]
|
|
800a03c: 4b36 ldr r3, [pc, #216] ; (800a118 <tcp_process+0x5a4>)
|
|
800a03e: 9300 str r3, [sp, #0]
|
|
800a040: 4b36 ldr r3, [pc, #216] ; (800a11c <tcp_process+0x5a8>)
|
|
800a042: 4602 mov r2, r0
|
|
800a044: 6878 ldr r0, [r7, #4]
|
|
800a046: f003 f895 bl 800d174 <tcp_rst>
|
|
}
|
|
} else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {
|
|
/* Looks like another copy of the SYN - retransmit our SYN-ACK */
|
|
tcp_rexmit(pcb);
|
|
}
|
|
break;
|
|
800a04a: e167 b.n 800a31c <tcp_process+0x7a8>
|
|
} else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {
|
|
800a04c: 4b2d ldr r3, [pc, #180] ; (800a104 <tcp_process+0x590>)
|
|
800a04e: 781b ldrb r3, [r3, #0]
|
|
800a050: f003 0302 and.w r3, r3, #2
|
|
800a054: 2b00 cmp r3, #0
|
|
800a056: f000 8161 beq.w 800a31c <tcp_process+0x7a8>
|
|
800a05a: 687b ldr r3, [r7, #4]
|
|
800a05c: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800a05e: 1e5a subs r2, r3, #1
|
|
800a060: 4b2b ldr r3, [pc, #172] ; (800a110 <tcp_process+0x59c>)
|
|
800a062: 681b ldr r3, [r3, #0]
|
|
800a064: 429a cmp r2, r3
|
|
800a066: f040 8159 bne.w 800a31c <tcp_process+0x7a8>
|
|
tcp_rexmit(pcb);
|
|
800a06a: 6878 ldr r0, [r7, #4]
|
|
800a06c: f002 fe7c bl 800cd68 <tcp_rexmit>
|
|
break;
|
|
800a070: e154 b.n 800a31c <tcp_process+0x7a8>
|
|
800a072: e153 b.n 800a31c <tcp_process+0x7a8>
|
|
case CLOSE_WAIT:
|
|
/* FALLTHROUGH */
|
|
case ESTABLISHED:
|
|
tcp_receive(pcb);
|
|
800a074: 6878 ldr r0, [r7, #4]
|
|
800a076: f000 fa71 bl 800a55c <tcp_receive>
|
|
if (recv_flags & TF_GOT_FIN) { /* passive close */
|
|
800a07a: 4b2d ldr r3, [pc, #180] ; (800a130 <tcp_process+0x5bc>)
|
|
800a07c: 781b ldrb r3, [r3, #0]
|
|
800a07e: f003 0320 and.w r3, r3, #32
|
|
800a082: 2b00 cmp r3, #0
|
|
800a084: f000 814c beq.w 800a320 <tcp_process+0x7ac>
|
|
tcp_ack_now(pcb);
|
|
800a088: 687b ldr r3, [r7, #4]
|
|
800a08a: 8b5b ldrh r3, [r3, #26]
|
|
800a08c: f043 0302 orr.w r3, r3, #2
|
|
800a090: b29a uxth r2, r3
|
|
800a092: 687b ldr r3, [r7, #4]
|
|
800a094: 835a strh r2, [r3, #26]
|
|
pcb->state = CLOSE_WAIT;
|
|
800a096: 687b ldr r3, [r7, #4]
|
|
800a098: 2207 movs r2, #7
|
|
800a09a: 751a strb r2, [r3, #20]
|
|
}
|
|
break;
|
|
800a09c: e140 b.n 800a320 <tcp_process+0x7ac>
|
|
case FIN_WAIT_1:
|
|
tcp_receive(pcb);
|
|
800a09e: 6878 ldr r0, [r7, #4]
|
|
800a0a0: f000 fa5c bl 800a55c <tcp_receive>
|
|
if (recv_flags & TF_GOT_FIN) {
|
|
800a0a4: 4b22 ldr r3, [pc, #136] ; (800a130 <tcp_process+0x5bc>)
|
|
800a0a6: 781b ldrb r3, [r3, #0]
|
|
800a0a8: f003 0320 and.w r3, r3, #32
|
|
800a0ac: 2b00 cmp r3, #0
|
|
800a0ae: d071 beq.n 800a194 <tcp_process+0x620>
|
|
if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
|
|
800a0b0: 4b14 ldr r3, [pc, #80] ; (800a104 <tcp_process+0x590>)
|
|
800a0b2: 781b ldrb r3, [r3, #0]
|
|
800a0b4: f003 0310 and.w r3, r3, #16
|
|
800a0b8: 2b00 cmp r3, #0
|
|
800a0ba: d060 beq.n 800a17e <tcp_process+0x60a>
|
|
800a0bc: 687b ldr r3, [r7, #4]
|
|
800a0be: 6d1a ldr r2, [r3, #80] ; 0x50
|
|
800a0c0: 4b11 ldr r3, [pc, #68] ; (800a108 <tcp_process+0x594>)
|
|
800a0c2: 681b ldr r3, [r3, #0]
|
|
800a0c4: 429a cmp r2, r3
|
|
800a0c6: d15a bne.n 800a17e <tcp_process+0x60a>
|
|
pcb->unsent == NULL) {
|
|
800a0c8: 687b ldr r3, [r7, #4]
|
|
800a0ca: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
|
|
800a0cc: 2b00 cmp r3, #0
|
|
800a0ce: d156 bne.n 800a17e <tcp_process+0x60a>
|
|
LWIP_DEBUGF(TCP_DEBUG,
|
|
("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
|
|
tcp_ack_now(pcb);
|
|
800a0d0: 687b ldr r3, [r7, #4]
|
|
800a0d2: 8b5b ldrh r3, [r3, #26]
|
|
800a0d4: f043 0302 orr.w r3, r3, #2
|
|
800a0d8: b29a uxth r2, r3
|
|
800a0da: 687b ldr r3, [r7, #4]
|
|
800a0dc: 835a strh r2, [r3, #26]
|
|
tcp_pcb_purge(pcb);
|
|
800a0de: 6878 ldr r0, [r7, #4]
|
|
800a0e0: f7fe fdb6 bl 8008c50 <tcp_pcb_purge>
|
|
TCP_RMV_ACTIVE(pcb);
|
|
800a0e4: 4b13 ldr r3, [pc, #76] ; (800a134 <tcp_process+0x5c0>)
|
|
800a0e6: 681b ldr r3, [r3, #0]
|
|
800a0e8: 687a ldr r2, [r7, #4]
|
|
800a0ea: 429a cmp r2, r3
|
|
800a0ec: d105 bne.n 800a0fa <tcp_process+0x586>
|
|
800a0ee: 4b11 ldr r3, [pc, #68] ; (800a134 <tcp_process+0x5c0>)
|
|
800a0f0: 681b ldr r3, [r3, #0]
|
|
800a0f2: 68db ldr r3, [r3, #12]
|
|
800a0f4: 4a0f ldr r2, [pc, #60] ; (800a134 <tcp_process+0x5c0>)
|
|
800a0f6: 6013 str r3, [r2, #0]
|
|
800a0f8: e02e b.n 800a158 <tcp_process+0x5e4>
|
|
800a0fa: 4b0e ldr r3, [pc, #56] ; (800a134 <tcp_process+0x5c0>)
|
|
800a0fc: 681b ldr r3, [r3, #0]
|
|
800a0fe: 613b str r3, [r7, #16]
|
|
800a100: e027 b.n 800a152 <tcp_process+0x5de>
|
|
800a102: bf00 nop
|
|
800a104: 24007bb4 .word 0x24007bb4
|
|
800a108: 24007bac .word 0x24007bac
|
|
800a10c: 24007bb2 .word 0x24007bb2
|
|
800a110: 24007ba8 .word 0x24007ba8
|
|
800a114: 24007b98 .word 0x24007b98
|
|
800a118: 24004c20 .word 0x24004c20
|
|
800a11c: 24004c24 .word 0x24004c24
|
|
800a120: 08013198 .word 0x08013198
|
|
800a124: 08013438 .word 0x08013438
|
|
800a128: 080131e4 .word 0x080131e4
|
|
800a12c: 24007bb0 .word 0x24007bb0
|
|
800a130: 24007bb5 .word 0x24007bb5
|
|
800a134: 24007b78 .word 0x24007b78
|
|
800a138: 693b ldr r3, [r7, #16]
|
|
800a13a: 68db ldr r3, [r3, #12]
|
|
800a13c: 687a ldr r2, [r7, #4]
|
|
800a13e: 429a cmp r2, r3
|
|
800a140: d104 bne.n 800a14c <tcp_process+0x5d8>
|
|
800a142: 687b ldr r3, [r7, #4]
|
|
800a144: 68da ldr r2, [r3, #12]
|
|
800a146: 693b ldr r3, [r7, #16]
|
|
800a148: 60da str r2, [r3, #12]
|
|
800a14a: e005 b.n 800a158 <tcp_process+0x5e4>
|
|
800a14c: 693b ldr r3, [r7, #16]
|
|
800a14e: 68db ldr r3, [r3, #12]
|
|
800a150: 613b str r3, [r7, #16]
|
|
800a152: 693b ldr r3, [r7, #16]
|
|
800a154: 2b00 cmp r3, #0
|
|
800a156: d1ef bne.n 800a138 <tcp_process+0x5c4>
|
|
800a158: 687b ldr r3, [r7, #4]
|
|
800a15a: 2200 movs r2, #0
|
|
800a15c: 60da str r2, [r3, #12]
|
|
800a15e: 4b77 ldr r3, [pc, #476] ; (800a33c <tcp_process+0x7c8>)
|
|
800a160: 2201 movs r2, #1
|
|
800a162: 701a strb r2, [r3, #0]
|
|
pcb->state = TIME_WAIT;
|
|
800a164: 687b ldr r3, [r7, #4]
|
|
800a166: 220a movs r2, #10
|
|
800a168: 751a strb r2, [r3, #20]
|
|
TCP_REG(&tcp_tw_pcbs, pcb);
|
|
800a16a: 4b75 ldr r3, [pc, #468] ; (800a340 <tcp_process+0x7cc>)
|
|
800a16c: 681a ldr r2, [r3, #0]
|
|
800a16e: 687b ldr r3, [r7, #4]
|
|
800a170: 60da str r2, [r3, #12]
|
|
800a172: 4a73 ldr r2, [pc, #460] ; (800a340 <tcp_process+0x7cc>)
|
|
800a174: 687b ldr r3, [r7, #4]
|
|
800a176: 6013 str r3, [r2, #0]
|
|
800a178: f003 f9be bl 800d4f8 <tcp_timer_needed>
|
|
}
|
|
} else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
|
|
pcb->unsent == NULL) {
|
|
pcb->state = FIN_WAIT_2;
|
|
}
|
|
break;
|
|
800a17c: e0d2 b.n 800a324 <tcp_process+0x7b0>
|
|
tcp_ack_now(pcb);
|
|
800a17e: 687b ldr r3, [r7, #4]
|
|
800a180: 8b5b ldrh r3, [r3, #26]
|
|
800a182: f043 0302 orr.w r3, r3, #2
|
|
800a186: b29a uxth r2, r3
|
|
800a188: 687b ldr r3, [r7, #4]
|
|
800a18a: 835a strh r2, [r3, #26]
|
|
pcb->state = CLOSING;
|
|
800a18c: 687b ldr r3, [r7, #4]
|
|
800a18e: 2208 movs r2, #8
|
|
800a190: 751a strb r2, [r3, #20]
|
|
break;
|
|
800a192: e0c7 b.n 800a324 <tcp_process+0x7b0>
|
|
} else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
|
|
800a194: 4b6b ldr r3, [pc, #428] ; (800a344 <tcp_process+0x7d0>)
|
|
800a196: 781b ldrb r3, [r3, #0]
|
|
800a198: f003 0310 and.w r3, r3, #16
|
|
800a19c: 2b00 cmp r3, #0
|
|
800a19e: f000 80c1 beq.w 800a324 <tcp_process+0x7b0>
|
|
800a1a2: 687b ldr r3, [r7, #4]
|
|
800a1a4: 6d1a ldr r2, [r3, #80] ; 0x50
|
|
800a1a6: 4b68 ldr r3, [pc, #416] ; (800a348 <tcp_process+0x7d4>)
|
|
800a1a8: 681b ldr r3, [r3, #0]
|
|
800a1aa: 429a cmp r2, r3
|
|
800a1ac: f040 80ba bne.w 800a324 <tcp_process+0x7b0>
|
|
pcb->unsent == NULL) {
|
|
800a1b0: 687b ldr r3, [r7, #4]
|
|
800a1b2: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
} else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
|
|
800a1b4: 2b00 cmp r3, #0
|
|
800a1b6: f040 80b5 bne.w 800a324 <tcp_process+0x7b0>
|
|
pcb->state = FIN_WAIT_2;
|
|
800a1ba: 687b ldr r3, [r7, #4]
|
|
800a1bc: 2206 movs r2, #6
|
|
800a1be: 751a strb r2, [r3, #20]
|
|
break;
|
|
800a1c0: e0b0 b.n 800a324 <tcp_process+0x7b0>
|
|
case FIN_WAIT_2:
|
|
tcp_receive(pcb);
|
|
800a1c2: 6878 ldr r0, [r7, #4]
|
|
800a1c4: f000 f9ca bl 800a55c <tcp_receive>
|
|
if (recv_flags & TF_GOT_FIN) {
|
|
800a1c8: 4b60 ldr r3, [pc, #384] ; (800a34c <tcp_process+0x7d8>)
|
|
800a1ca: 781b ldrb r3, [r3, #0]
|
|
800a1cc: f003 0320 and.w r3, r3, #32
|
|
800a1d0: 2b00 cmp r3, #0
|
|
800a1d2: f000 80a9 beq.w 800a328 <tcp_process+0x7b4>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
|
|
tcp_ack_now(pcb);
|
|
800a1d6: 687b ldr r3, [r7, #4]
|
|
800a1d8: 8b5b ldrh r3, [r3, #26]
|
|
800a1da: f043 0302 orr.w r3, r3, #2
|
|
800a1de: b29a uxth r2, r3
|
|
800a1e0: 687b ldr r3, [r7, #4]
|
|
800a1e2: 835a strh r2, [r3, #26]
|
|
tcp_pcb_purge(pcb);
|
|
800a1e4: 6878 ldr r0, [r7, #4]
|
|
800a1e6: f7fe fd33 bl 8008c50 <tcp_pcb_purge>
|
|
TCP_RMV_ACTIVE(pcb);
|
|
800a1ea: 4b59 ldr r3, [pc, #356] ; (800a350 <tcp_process+0x7dc>)
|
|
800a1ec: 681b ldr r3, [r3, #0]
|
|
800a1ee: 687a ldr r2, [r7, #4]
|
|
800a1f0: 429a cmp r2, r3
|
|
800a1f2: d105 bne.n 800a200 <tcp_process+0x68c>
|
|
800a1f4: 4b56 ldr r3, [pc, #344] ; (800a350 <tcp_process+0x7dc>)
|
|
800a1f6: 681b ldr r3, [r3, #0]
|
|
800a1f8: 68db ldr r3, [r3, #12]
|
|
800a1fa: 4a55 ldr r2, [pc, #340] ; (800a350 <tcp_process+0x7dc>)
|
|
800a1fc: 6013 str r3, [r2, #0]
|
|
800a1fe: e013 b.n 800a228 <tcp_process+0x6b4>
|
|
800a200: 4b53 ldr r3, [pc, #332] ; (800a350 <tcp_process+0x7dc>)
|
|
800a202: 681b ldr r3, [r3, #0]
|
|
800a204: 60fb str r3, [r7, #12]
|
|
800a206: e00c b.n 800a222 <tcp_process+0x6ae>
|
|
800a208: 68fb ldr r3, [r7, #12]
|
|
800a20a: 68db ldr r3, [r3, #12]
|
|
800a20c: 687a ldr r2, [r7, #4]
|
|
800a20e: 429a cmp r2, r3
|
|
800a210: d104 bne.n 800a21c <tcp_process+0x6a8>
|
|
800a212: 687b ldr r3, [r7, #4]
|
|
800a214: 68da ldr r2, [r3, #12]
|
|
800a216: 68fb ldr r3, [r7, #12]
|
|
800a218: 60da str r2, [r3, #12]
|
|
800a21a: e005 b.n 800a228 <tcp_process+0x6b4>
|
|
800a21c: 68fb ldr r3, [r7, #12]
|
|
800a21e: 68db ldr r3, [r3, #12]
|
|
800a220: 60fb str r3, [r7, #12]
|
|
800a222: 68fb ldr r3, [r7, #12]
|
|
800a224: 2b00 cmp r3, #0
|
|
800a226: d1ef bne.n 800a208 <tcp_process+0x694>
|
|
800a228: 687b ldr r3, [r7, #4]
|
|
800a22a: 2200 movs r2, #0
|
|
800a22c: 60da str r2, [r3, #12]
|
|
800a22e: 4b43 ldr r3, [pc, #268] ; (800a33c <tcp_process+0x7c8>)
|
|
800a230: 2201 movs r2, #1
|
|
800a232: 701a strb r2, [r3, #0]
|
|
pcb->state = TIME_WAIT;
|
|
800a234: 687b ldr r3, [r7, #4]
|
|
800a236: 220a movs r2, #10
|
|
800a238: 751a strb r2, [r3, #20]
|
|
TCP_REG(&tcp_tw_pcbs, pcb);
|
|
800a23a: 4b41 ldr r3, [pc, #260] ; (800a340 <tcp_process+0x7cc>)
|
|
800a23c: 681a ldr r2, [r3, #0]
|
|
800a23e: 687b ldr r3, [r7, #4]
|
|
800a240: 60da str r2, [r3, #12]
|
|
800a242: 4a3f ldr r2, [pc, #252] ; (800a340 <tcp_process+0x7cc>)
|
|
800a244: 687b ldr r3, [r7, #4]
|
|
800a246: 6013 str r3, [r2, #0]
|
|
800a248: f003 f956 bl 800d4f8 <tcp_timer_needed>
|
|
}
|
|
break;
|
|
800a24c: e06c b.n 800a328 <tcp_process+0x7b4>
|
|
case CLOSING:
|
|
tcp_receive(pcb);
|
|
800a24e: 6878 ldr r0, [r7, #4]
|
|
800a250: f000 f984 bl 800a55c <tcp_receive>
|
|
if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {
|
|
800a254: 4b3b ldr r3, [pc, #236] ; (800a344 <tcp_process+0x7d0>)
|
|
800a256: 781b ldrb r3, [r3, #0]
|
|
800a258: f003 0310 and.w r3, r3, #16
|
|
800a25c: 2b00 cmp r3, #0
|
|
800a25e: d065 beq.n 800a32c <tcp_process+0x7b8>
|
|
800a260: 687b ldr r3, [r7, #4]
|
|
800a262: 6d1a ldr r2, [r3, #80] ; 0x50
|
|
800a264: 4b38 ldr r3, [pc, #224] ; (800a348 <tcp_process+0x7d4>)
|
|
800a266: 681b ldr r3, [r3, #0]
|
|
800a268: 429a cmp r2, r3
|
|
800a26a: d15f bne.n 800a32c <tcp_process+0x7b8>
|
|
800a26c: 687b ldr r3, [r7, #4]
|
|
800a26e: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800a270: 2b00 cmp r3, #0
|
|
800a272: d15b bne.n 800a32c <tcp_process+0x7b8>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
|
|
tcp_pcb_purge(pcb);
|
|
800a274: 6878 ldr r0, [r7, #4]
|
|
800a276: f7fe fceb bl 8008c50 <tcp_pcb_purge>
|
|
TCP_RMV_ACTIVE(pcb);
|
|
800a27a: 4b35 ldr r3, [pc, #212] ; (800a350 <tcp_process+0x7dc>)
|
|
800a27c: 681b ldr r3, [r3, #0]
|
|
800a27e: 687a ldr r2, [r7, #4]
|
|
800a280: 429a cmp r2, r3
|
|
800a282: d105 bne.n 800a290 <tcp_process+0x71c>
|
|
800a284: 4b32 ldr r3, [pc, #200] ; (800a350 <tcp_process+0x7dc>)
|
|
800a286: 681b ldr r3, [r3, #0]
|
|
800a288: 68db ldr r3, [r3, #12]
|
|
800a28a: 4a31 ldr r2, [pc, #196] ; (800a350 <tcp_process+0x7dc>)
|
|
800a28c: 6013 str r3, [r2, #0]
|
|
800a28e: e013 b.n 800a2b8 <tcp_process+0x744>
|
|
800a290: 4b2f ldr r3, [pc, #188] ; (800a350 <tcp_process+0x7dc>)
|
|
800a292: 681b ldr r3, [r3, #0]
|
|
800a294: 61bb str r3, [r7, #24]
|
|
800a296: e00c b.n 800a2b2 <tcp_process+0x73e>
|
|
800a298: 69bb ldr r3, [r7, #24]
|
|
800a29a: 68db ldr r3, [r3, #12]
|
|
800a29c: 687a ldr r2, [r7, #4]
|
|
800a29e: 429a cmp r2, r3
|
|
800a2a0: d104 bne.n 800a2ac <tcp_process+0x738>
|
|
800a2a2: 687b ldr r3, [r7, #4]
|
|
800a2a4: 68da ldr r2, [r3, #12]
|
|
800a2a6: 69bb ldr r3, [r7, #24]
|
|
800a2a8: 60da str r2, [r3, #12]
|
|
800a2aa: e005 b.n 800a2b8 <tcp_process+0x744>
|
|
800a2ac: 69bb ldr r3, [r7, #24]
|
|
800a2ae: 68db ldr r3, [r3, #12]
|
|
800a2b0: 61bb str r3, [r7, #24]
|
|
800a2b2: 69bb ldr r3, [r7, #24]
|
|
800a2b4: 2b00 cmp r3, #0
|
|
800a2b6: d1ef bne.n 800a298 <tcp_process+0x724>
|
|
800a2b8: 687b ldr r3, [r7, #4]
|
|
800a2ba: 2200 movs r2, #0
|
|
800a2bc: 60da str r2, [r3, #12]
|
|
800a2be: 4b1f ldr r3, [pc, #124] ; (800a33c <tcp_process+0x7c8>)
|
|
800a2c0: 2201 movs r2, #1
|
|
800a2c2: 701a strb r2, [r3, #0]
|
|
pcb->state = TIME_WAIT;
|
|
800a2c4: 687b ldr r3, [r7, #4]
|
|
800a2c6: 220a movs r2, #10
|
|
800a2c8: 751a strb r2, [r3, #20]
|
|
TCP_REG(&tcp_tw_pcbs, pcb);
|
|
800a2ca: 4b1d ldr r3, [pc, #116] ; (800a340 <tcp_process+0x7cc>)
|
|
800a2cc: 681a ldr r2, [r3, #0]
|
|
800a2ce: 687b ldr r3, [r7, #4]
|
|
800a2d0: 60da str r2, [r3, #12]
|
|
800a2d2: 4a1b ldr r2, [pc, #108] ; (800a340 <tcp_process+0x7cc>)
|
|
800a2d4: 687b ldr r3, [r7, #4]
|
|
800a2d6: 6013 str r3, [r2, #0]
|
|
800a2d8: f003 f90e bl 800d4f8 <tcp_timer_needed>
|
|
}
|
|
break;
|
|
800a2dc: e026 b.n 800a32c <tcp_process+0x7b8>
|
|
case LAST_ACK:
|
|
tcp_receive(pcb);
|
|
800a2de: 6878 ldr r0, [r7, #4]
|
|
800a2e0: f000 f93c bl 800a55c <tcp_receive>
|
|
if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {
|
|
800a2e4: 4b17 ldr r3, [pc, #92] ; (800a344 <tcp_process+0x7d0>)
|
|
800a2e6: 781b ldrb r3, [r3, #0]
|
|
800a2e8: f003 0310 and.w r3, r3, #16
|
|
800a2ec: 2b00 cmp r3, #0
|
|
800a2ee: d01f beq.n 800a330 <tcp_process+0x7bc>
|
|
800a2f0: 687b ldr r3, [r7, #4]
|
|
800a2f2: 6d1a ldr r2, [r3, #80] ; 0x50
|
|
800a2f4: 4b14 ldr r3, [pc, #80] ; (800a348 <tcp_process+0x7d4>)
|
|
800a2f6: 681b ldr r3, [r3, #0]
|
|
800a2f8: 429a cmp r2, r3
|
|
800a2fa: d119 bne.n 800a330 <tcp_process+0x7bc>
|
|
800a2fc: 687b ldr r3, [r7, #4]
|
|
800a2fe: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800a300: 2b00 cmp r3, #0
|
|
800a302: d115 bne.n 800a330 <tcp_process+0x7bc>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
|
|
/* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */
|
|
recv_flags |= TF_CLOSED;
|
|
800a304: 4b11 ldr r3, [pc, #68] ; (800a34c <tcp_process+0x7d8>)
|
|
800a306: 781b ldrb r3, [r3, #0]
|
|
800a308: f043 0310 orr.w r3, r3, #16
|
|
800a30c: b2da uxtb r2, r3
|
|
800a30e: 4b0f ldr r3, [pc, #60] ; (800a34c <tcp_process+0x7d8>)
|
|
800a310: 701a strb r2, [r3, #0]
|
|
}
|
|
break;
|
|
800a312: e00d b.n 800a330 <tcp_process+0x7bc>
|
|
default:
|
|
break;
|
|
800a314: bf00 nop
|
|
800a316: e00c b.n 800a332 <tcp_process+0x7be>
|
|
break;
|
|
800a318: bf00 nop
|
|
800a31a: e00a b.n 800a332 <tcp_process+0x7be>
|
|
break;
|
|
800a31c: bf00 nop
|
|
800a31e: e008 b.n 800a332 <tcp_process+0x7be>
|
|
break;
|
|
800a320: bf00 nop
|
|
800a322: e006 b.n 800a332 <tcp_process+0x7be>
|
|
break;
|
|
800a324: bf00 nop
|
|
800a326: e004 b.n 800a332 <tcp_process+0x7be>
|
|
break;
|
|
800a328: bf00 nop
|
|
800a32a: e002 b.n 800a332 <tcp_process+0x7be>
|
|
break;
|
|
800a32c: bf00 nop
|
|
800a32e: e000 b.n 800a332 <tcp_process+0x7be>
|
|
break;
|
|
800a330: bf00 nop
|
|
}
|
|
return ERR_OK;
|
|
800a332: 2300 movs r3, #0
|
|
}
|
|
800a334: 4618 mov r0, r3
|
|
800a336: 3724 adds r7, #36 ; 0x24
|
|
800a338: 46bd mov sp, r7
|
|
800a33a: bd90 pop {r4, r7, pc}
|
|
800a33c: 24007b80 .word 0x24007b80
|
|
800a340: 24007b7c .word 0x24007b7c
|
|
800a344: 24007bb4 .word 0x24007bb4
|
|
800a348: 24007bac .word 0x24007bac
|
|
800a34c: 24007bb5 .word 0x24007bb5
|
|
800a350: 24007b78 .word 0x24007b78
|
|
|
|
0800a354 <tcp_oos_insert_segment>:
|
|
*
|
|
* Called from tcp_receive()
|
|
*/
|
|
static void
|
|
tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next)
|
|
{
|
|
800a354: b590 push {r4, r7, lr}
|
|
800a356: b085 sub sp, #20
|
|
800a358: af00 add r7, sp, #0
|
|
800a35a: 6078 str r0, [r7, #4]
|
|
800a35c: 6039 str r1, [r7, #0]
|
|
struct tcp_seg *old_seg;
|
|
|
|
LWIP_ASSERT("tcp_oos_insert_segment: invalid cseg", cseg != NULL);
|
|
800a35e: 687b ldr r3, [r7, #4]
|
|
800a360: 2b00 cmp r3, #0
|
|
800a362: d106 bne.n 800a372 <tcp_oos_insert_segment+0x1e>
|
|
800a364: 4b3b ldr r3, [pc, #236] ; (800a454 <tcp_oos_insert_segment+0x100>)
|
|
800a366: f240 421f movw r2, #1055 ; 0x41f
|
|
800a36a: 493b ldr r1, [pc, #236] ; (800a458 <tcp_oos_insert_segment+0x104>)
|
|
800a36c: 483b ldr r0, [pc, #236] ; (800a45c <tcp_oos_insert_segment+0x108>)
|
|
800a36e: f006 fc2b bl 8010bc8 <iprintf>
|
|
|
|
if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
|
|
800a372: 687b ldr r3, [r7, #4]
|
|
800a374: 691b ldr r3, [r3, #16]
|
|
800a376: 899b ldrh r3, [r3, #12]
|
|
800a378: b29b uxth r3, r3
|
|
800a37a: 4618 mov r0, r3
|
|
800a37c: f7fb f8e6 bl 800554c <lwip_htons>
|
|
800a380: 4603 mov r3, r0
|
|
800a382: b2db uxtb r3, r3
|
|
800a384: f003 0301 and.w r3, r3, #1
|
|
800a388: 2b00 cmp r3, #0
|
|
800a38a: d028 beq.n 800a3de <tcp_oos_insert_segment+0x8a>
|
|
/* received segment overlaps all following segments */
|
|
tcp_segs_free(next);
|
|
800a38c: 6838 ldr r0, [r7, #0]
|
|
800a38e: f7fe f9dd bl 800874c <tcp_segs_free>
|
|
next = NULL;
|
|
800a392: 2300 movs r3, #0
|
|
800a394: 603b str r3, [r7, #0]
|
|
800a396: e056 b.n 800a446 <tcp_oos_insert_segment+0xf2>
|
|
oos queue may have segments with FIN flag */
|
|
while (next &&
|
|
TCP_SEQ_GEQ((seqno + cseg->len),
|
|
(next->tcphdr->seqno + next->len))) {
|
|
/* cseg with FIN already processed */
|
|
if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {
|
|
800a398: 683b ldr r3, [r7, #0]
|
|
800a39a: 691b ldr r3, [r3, #16]
|
|
800a39c: 899b ldrh r3, [r3, #12]
|
|
800a39e: b29b uxth r3, r3
|
|
800a3a0: 4618 mov r0, r3
|
|
800a3a2: f7fb f8d3 bl 800554c <lwip_htons>
|
|
800a3a6: 4603 mov r3, r0
|
|
800a3a8: b2db uxtb r3, r3
|
|
800a3aa: f003 0301 and.w r3, r3, #1
|
|
800a3ae: 2b00 cmp r3, #0
|
|
800a3b0: d00d beq.n 800a3ce <tcp_oos_insert_segment+0x7a>
|
|
TCPH_SET_FLAG(cseg->tcphdr, TCP_FIN);
|
|
800a3b2: 687b ldr r3, [r7, #4]
|
|
800a3b4: 691b ldr r3, [r3, #16]
|
|
800a3b6: 899b ldrh r3, [r3, #12]
|
|
800a3b8: b29c uxth r4, r3
|
|
800a3ba: 2001 movs r0, #1
|
|
800a3bc: f7fb f8c6 bl 800554c <lwip_htons>
|
|
800a3c0: 4603 mov r3, r0
|
|
800a3c2: 461a mov r2, r3
|
|
800a3c4: 687b ldr r3, [r7, #4]
|
|
800a3c6: 691b ldr r3, [r3, #16]
|
|
800a3c8: 4322 orrs r2, r4
|
|
800a3ca: b292 uxth r2, r2
|
|
800a3cc: 819a strh r2, [r3, #12]
|
|
}
|
|
old_seg = next;
|
|
800a3ce: 683b ldr r3, [r7, #0]
|
|
800a3d0: 60fb str r3, [r7, #12]
|
|
next = next->next;
|
|
800a3d2: 683b ldr r3, [r7, #0]
|
|
800a3d4: 681b ldr r3, [r3, #0]
|
|
800a3d6: 603b str r3, [r7, #0]
|
|
tcp_seg_free(old_seg);
|
|
800a3d8: 68f8 ldr r0, [r7, #12]
|
|
800a3da: f7fe f9cc bl 8008776 <tcp_seg_free>
|
|
while (next &&
|
|
800a3de: 683b ldr r3, [r7, #0]
|
|
800a3e0: 2b00 cmp r3, #0
|
|
800a3e2: d00e beq.n 800a402 <tcp_oos_insert_segment+0xae>
|
|
TCP_SEQ_GEQ((seqno + cseg->len),
|
|
800a3e4: 687b ldr r3, [r7, #4]
|
|
800a3e6: 891b ldrh r3, [r3, #8]
|
|
800a3e8: 461a mov r2, r3
|
|
800a3ea: 4b1d ldr r3, [pc, #116] ; (800a460 <tcp_oos_insert_segment+0x10c>)
|
|
800a3ec: 681b ldr r3, [r3, #0]
|
|
800a3ee: 441a add r2, r3
|
|
800a3f0: 683b ldr r3, [r7, #0]
|
|
800a3f2: 691b ldr r3, [r3, #16]
|
|
800a3f4: 685b ldr r3, [r3, #4]
|
|
800a3f6: 6839 ldr r1, [r7, #0]
|
|
800a3f8: 8909 ldrh r1, [r1, #8]
|
|
800a3fa: 440b add r3, r1
|
|
800a3fc: 1ad3 subs r3, r2, r3
|
|
while (next &&
|
|
800a3fe: 2b00 cmp r3, #0
|
|
800a400: daca bge.n 800a398 <tcp_oos_insert_segment+0x44>
|
|
}
|
|
if (next &&
|
|
800a402: 683b ldr r3, [r7, #0]
|
|
800a404: 2b00 cmp r3, #0
|
|
800a406: d01e beq.n 800a446 <tcp_oos_insert_segment+0xf2>
|
|
TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) {
|
|
800a408: 687b ldr r3, [r7, #4]
|
|
800a40a: 891b ldrh r3, [r3, #8]
|
|
800a40c: 461a mov r2, r3
|
|
800a40e: 4b14 ldr r3, [pc, #80] ; (800a460 <tcp_oos_insert_segment+0x10c>)
|
|
800a410: 681b ldr r3, [r3, #0]
|
|
800a412: 441a add r2, r3
|
|
800a414: 683b ldr r3, [r7, #0]
|
|
800a416: 691b ldr r3, [r3, #16]
|
|
800a418: 685b ldr r3, [r3, #4]
|
|
800a41a: 1ad3 subs r3, r2, r3
|
|
if (next &&
|
|
800a41c: 2b00 cmp r3, #0
|
|
800a41e: dd12 ble.n 800a446 <tcp_oos_insert_segment+0xf2>
|
|
/* We need to trim the incoming segment. */
|
|
cseg->len = (u16_t)(next->tcphdr->seqno - seqno);
|
|
800a420: 683b ldr r3, [r7, #0]
|
|
800a422: 691b ldr r3, [r3, #16]
|
|
800a424: 685b ldr r3, [r3, #4]
|
|
800a426: b29a uxth r2, r3
|
|
800a428: 4b0d ldr r3, [pc, #52] ; (800a460 <tcp_oos_insert_segment+0x10c>)
|
|
800a42a: 681b ldr r3, [r3, #0]
|
|
800a42c: b29b uxth r3, r3
|
|
800a42e: 1ad3 subs r3, r2, r3
|
|
800a430: b29a uxth r2, r3
|
|
800a432: 687b ldr r3, [r7, #4]
|
|
800a434: 811a strh r2, [r3, #8]
|
|
pbuf_realloc(cseg->p, cseg->len);
|
|
800a436: 687b ldr r3, [r7, #4]
|
|
800a438: 685a ldr r2, [r3, #4]
|
|
800a43a: 687b ldr r3, [r7, #4]
|
|
800a43c: 891b ldrh r3, [r3, #8]
|
|
800a43e: 4619 mov r1, r3
|
|
800a440: 4610 mov r0, r2
|
|
800a442: f7fc fc41 bl 8006cc8 <pbuf_realloc>
|
|
}
|
|
}
|
|
cseg->next = next;
|
|
800a446: 687b ldr r3, [r7, #4]
|
|
800a448: 683a ldr r2, [r7, #0]
|
|
800a44a: 601a str r2, [r3, #0]
|
|
}
|
|
800a44c: bf00 nop
|
|
800a44e: 3714 adds r7, #20
|
|
800a450: 46bd mov sp, r7
|
|
800a452: bd90 pop {r4, r7, pc}
|
|
800a454: 08013198 .word 0x08013198
|
|
800a458: 08013458 .word 0x08013458
|
|
800a45c: 080131e4 .word 0x080131e4
|
|
800a460: 24007ba8 .word 0x24007ba8
|
|
|
|
0800a464 <tcp_free_acked_segments>:
|
|
|
|
/** Remove segments from a list if the incoming ACK acknowledges them */
|
|
static struct tcp_seg *
|
|
tcp_free_acked_segments(struct tcp_pcb *pcb, struct tcp_seg *seg_list, const char *dbg_list_name,
|
|
struct tcp_seg *dbg_other_seg_list)
|
|
{
|
|
800a464: b5b0 push {r4, r5, r7, lr}
|
|
800a466: b086 sub sp, #24
|
|
800a468: af00 add r7, sp, #0
|
|
800a46a: 60f8 str r0, [r7, #12]
|
|
800a46c: 60b9 str r1, [r7, #8]
|
|
800a46e: 607a str r2, [r7, #4]
|
|
800a470: 603b str r3, [r7, #0]
|
|
u16_t clen;
|
|
|
|
LWIP_UNUSED_ARG(dbg_list_name);
|
|
LWIP_UNUSED_ARG(dbg_other_seg_list);
|
|
|
|
while (seg_list != NULL &&
|
|
800a472: e03e b.n 800a4f2 <tcp_free_acked_segments+0x8e>
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->%s\n",
|
|
lwip_ntohl(seg_list->tcphdr->seqno),
|
|
lwip_ntohl(seg_list->tcphdr->seqno) + TCP_TCPLEN(seg_list),
|
|
dbg_list_name));
|
|
|
|
next = seg_list;
|
|
800a474: 68bb ldr r3, [r7, #8]
|
|
800a476: 617b str r3, [r7, #20]
|
|
seg_list = seg_list->next;
|
|
800a478: 68bb ldr r3, [r7, #8]
|
|
800a47a: 681b ldr r3, [r3, #0]
|
|
800a47c: 60bb str r3, [r7, #8]
|
|
|
|
clen = pbuf_clen(next->p);
|
|
800a47e: 697b ldr r3, [r7, #20]
|
|
800a480: 685b ldr r3, [r3, #4]
|
|
800a482: 4618 mov r0, r3
|
|
800a484: f7fc fe2e bl 80070e4 <pbuf_clen>
|
|
800a488: 4603 mov r3, r0
|
|
800a48a: 827b strh r3, [r7, #18]
|
|
LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"TCPWNDSIZE_F" ... ",
|
|
(tcpwnd_size_t)pcb->snd_queuelen));
|
|
LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= clen));
|
|
800a48c: 68fb ldr r3, [r7, #12]
|
|
800a48e: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800a492: 8a7a ldrh r2, [r7, #18]
|
|
800a494: 429a cmp r2, r3
|
|
800a496: d906 bls.n 800a4a6 <tcp_free_acked_segments+0x42>
|
|
800a498: 4b2a ldr r3, [pc, #168] ; (800a544 <tcp_free_acked_segments+0xe0>)
|
|
800a49a: f240 4257 movw r2, #1111 ; 0x457
|
|
800a49e: 492a ldr r1, [pc, #168] ; (800a548 <tcp_free_acked_segments+0xe4>)
|
|
800a4a0: 482a ldr r0, [pc, #168] ; (800a54c <tcp_free_acked_segments+0xe8>)
|
|
800a4a2: f006 fb91 bl 8010bc8 <iprintf>
|
|
|
|
pcb->snd_queuelen = (u16_t)(pcb->snd_queuelen - clen);
|
|
800a4a6: 68fb ldr r3, [r7, #12]
|
|
800a4a8: f8b3 2066 ldrh.w r2, [r3, #102] ; 0x66
|
|
800a4ac: 8a7b ldrh r3, [r7, #18]
|
|
800a4ae: 1ad3 subs r3, r2, r3
|
|
800a4b0: b29a uxth r2, r3
|
|
800a4b2: 68fb ldr r3, [r7, #12]
|
|
800a4b4: f8a3 2066 strh.w r2, [r3, #102] ; 0x66
|
|
recv_acked = (tcpwnd_size_t)(recv_acked + next->len);
|
|
800a4b8: 697b ldr r3, [r7, #20]
|
|
800a4ba: 891a ldrh r2, [r3, #8]
|
|
800a4bc: 4b24 ldr r3, [pc, #144] ; (800a550 <tcp_free_acked_segments+0xec>)
|
|
800a4be: 881b ldrh r3, [r3, #0]
|
|
800a4c0: 4413 add r3, r2
|
|
800a4c2: b29a uxth r2, r3
|
|
800a4c4: 4b22 ldr r3, [pc, #136] ; (800a550 <tcp_free_acked_segments+0xec>)
|
|
800a4c6: 801a strh r2, [r3, #0]
|
|
tcp_seg_free(next);
|
|
800a4c8: 6978 ldr r0, [r7, #20]
|
|
800a4ca: f7fe f954 bl 8008776 <tcp_seg_free>
|
|
|
|
LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"TCPWNDSIZE_F" (after freeing %s)\n",
|
|
(tcpwnd_size_t)pcb->snd_queuelen,
|
|
dbg_list_name));
|
|
if (pcb->snd_queuelen != 0) {
|
|
800a4ce: 68fb ldr r3, [r7, #12]
|
|
800a4d0: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800a4d4: 2b00 cmp r3, #0
|
|
800a4d6: d00c beq.n 800a4f2 <tcp_free_acked_segments+0x8e>
|
|
LWIP_ASSERT("tcp_receive: valid queue length",
|
|
800a4d8: 68bb ldr r3, [r7, #8]
|
|
800a4da: 2b00 cmp r3, #0
|
|
800a4dc: d109 bne.n 800a4f2 <tcp_free_acked_segments+0x8e>
|
|
800a4de: 683b ldr r3, [r7, #0]
|
|
800a4e0: 2b00 cmp r3, #0
|
|
800a4e2: d106 bne.n 800a4f2 <tcp_free_acked_segments+0x8e>
|
|
800a4e4: 4b17 ldr r3, [pc, #92] ; (800a544 <tcp_free_acked_segments+0xe0>)
|
|
800a4e6: f240 4261 movw r2, #1121 ; 0x461
|
|
800a4ea: 491a ldr r1, [pc, #104] ; (800a554 <tcp_free_acked_segments+0xf0>)
|
|
800a4ec: 4817 ldr r0, [pc, #92] ; (800a54c <tcp_free_acked_segments+0xe8>)
|
|
800a4ee: f006 fb6b bl 8010bc8 <iprintf>
|
|
while (seg_list != NULL &&
|
|
800a4f2: 68bb ldr r3, [r7, #8]
|
|
800a4f4: 2b00 cmp r3, #0
|
|
800a4f6: d020 beq.n 800a53a <tcp_free_acked_segments+0xd6>
|
|
TCP_SEQ_LEQ(lwip_ntohl(seg_list->tcphdr->seqno) +
|
|
800a4f8: 68bb ldr r3, [r7, #8]
|
|
800a4fa: 691b ldr r3, [r3, #16]
|
|
800a4fc: 685b ldr r3, [r3, #4]
|
|
800a4fe: 4618 mov r0, r3
|
|
800a500: f7fb f839 bl 8005576 <lwip_htonl>
|
|
800a504: 4604 mov r4, r0
|
|
800a506: 68bb ldr r3, [r7, #8]
|
|
800a508: 891b ldrh r3, [r3, #8]
|
|
800a50a: 461d mov r5, r3
|
|
800a50c: 68bb ldr r3, [r7, #8]
|
|
800a50e: 691b ldr r3, [r3, #16]
|
|
800a510: 899b ldrh r3, [r3, #12]
|
|
800a512: b29b uxth r3, r3
|
|
800a514: 4618 mov r0, r3
|
|
800a516: f7fb f819 bl 800554c <lwip_htons>
|
|
800a51a: 4603 mov r3, r0
|
|
800a51c: b2db uxtb r3, r3
|
|
800a51e: f003 0303 and.w r3, r3, #3
|
|
800a522: 2b00 cmp r3, #0
|
|
800a524: d001 beq.n 800a52a <tcp_free_acked_segments+0xc6>
|
|
800a526: 2301 movs r3, #1
|
|
800a528: e000 b.n 800a52c <tcp_free_acked_segments+0xc8>
|
|
800a52a: 2300 movs r3, #0
|
|
800a52c: 442b add r3, r5
|
|
800a52e: 18e2 adds r2, r4, r3
|
|
800a530: 4b09 ldr r3, [pc, #36] ; (800a558 <tcp_free_acked_segments+0xf4>)
|
|
800a532: 681b ldr r3, [r3, #0]
|
|
800a534: 1ad3 subs r3, r2, r3
|
|
while (seg_list != NULL &&
|
|
800a536: 2b00 cmp r3, #0
|
|
800a538: dd9c ble.n 800a474 <tcp_free_acked_segments+0x10>
|
|
seg_list != NULL || dbg_other_seg_list != NULL);
|
|
}
|
|
}
|
|
return seg_list;
|
|
800a53a: 68bb ldr r3, [r7, #8]
|
|
}
|
|
800a53c: 4618 mov r0, r3
|
|
800a53e: 3718 adds r7, #24
|
|
800a540: 46bd mov sp, r7
|
|
800a542: bdb0 pop {r4, r5, r7, pc}
|
|
800a544: 08013198 .word 0x08013198
|
|
800a548: 08013480 .word 0x08013480
|
|
800a54c: 080131e4 .word 0x080131e4
|
|
800a550: 24007bb0 .word 0x24007bb0
|
|
800a554: 080134a8 .word 0x080134a8
|
|
800a558: 24007bac .word 0x24007bac
|
|
|
|
0800a55c <tcp_receive>:
|
|
*
|
|
* Called from tcp_process().
|
|
*/
|
|
static void
|
|
tcp_receive(struct tcp_pcb *pcb)
|
|
{
|
|
800a55c: b5b0 push {r4, r5, r7, lr}
|
|
800a55e: b094 sub sp, #80 ; 0x50
|
|
800a560: af00 add r7, sp, #0
|
|
800a562: 6078 str r0, [r7, #4]
|
|
s16_t m;
|
|
u32_t right_wnd_edge;
|
|
int found_dupack = 0;
|
|
800a564: 2300 movs r3, #0
|
|
800a566: 64bb str r3, [r7, #72] ; 0x48
|
|
|
|
LWIP_ASSERT("tcp_receive: invalid pcb", pcb != NULL);
|
|
800a568: 687b ldr r3, [r7, #4]
|
|
800a56a: 2b00 cmp r3, #0
|
|
800a56c: d106 bne.n 800a57c <tcp_receive+0x20>
|
|
800a56e: 4b91 ldr r3, [pc, #580] ; (800a7b4 <tcp_receive+0x258>)
|
|
800a570: f240 427b movw r2, #1147 ; 0x47b
|
|
800a574: 4990 ldr r1, [pc, #576] ; (800a7b8 <tcp_receive+0x25c>)
|
|
800a576: 4891 ldr r0, [pc, #580] ; (800a7bc <tcp_receive+0x260>)
|
|
800a578: f006 fb26 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
|
|
800a57c: 687b ldr r3, [r7, #4]
|
|
800a57e: 7d1b ldrb r3, [r3, #20]
|
|
800a580: 2b03 cmp r3, #3
|
|
800a582: d806 bhi.n 800a592 <tcp_receive+0x36>
|
|
800a584: 4b8b ldr r3, [pc, #556] ; (800a7b4 <tcp_receive+0x258>)
|
|
800a586: f240 427c movw r2, #1148 ; 0x47c
|
|
800a58a: 498d ldr r1, [pc, #564] ; (800a7c0 <tcp_receive+0x264>)
|
|
800a58c: 488b ldr r0, [pc, #556] ; (800a7bc <tcp_receive+0x260>)
|
|
800a58e: f006 fb1b bl 8010bc8 <iprintf>
|
|
|
|
if (flags & TCP_ACK) {
|
|
800a592: 4b8c ldr r3, [pc, #560] ; (800a7c4 <tcp_receive+0x268>)
|
|
800a594: 781b ldrb r3, [r3, #0]
|
|
800a596: f003 0310 and.w r3, r3, #16
|
|
800a59a: 2b00 cmp r3, #0
|
|
800a59c: f000 8264 beq.w 800aa68 <tcp_receive+0x50c>
|
|
right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
|
|
800a5a0: 687b ldr r3, [r7, #4]
|
|
800a5a2: f8b3 3060 ldrh.w r3, [r3, #96] ; 0x60
|
|
800a5a6: 461a mov r2, r3
|
|
800a5a8: 687b ldr r3, [r7, #4]
|
|
800a5aa: 6d9b ldr r3, [r3, #88] ; 0x58
|
|
800a5ac: 4413 add r3, r2
|
|
800a5ae: 633b str r3, [r7, #48] ; 0x30
|
|
|
|
/* Update window. */
|
|
if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
|
|
800a5b0: 687b ldr r3, [r7, #4]
|
|
800a5b2: 6d5a ldr r2, [r3, #84] ; 0x54
|
|
800a5b4: 4b84 ldr r3, [pc, #528] ; (800a7c8 <tcp_receive+0x26c>)
|
|
800a5b6: 681b ldr r3, [r3, #0]
|
|
800a5b8: 1ad3 subs r3, r2, r3
|
|
800a5ba: 2b00 cmp r3, #0
|
|
800a5bc: db1b blt.n 800a5f6 <tcp_receive+0x9a>
|
|
(pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
|
|
800a5be: 687b ldr r3, [r7, #4]
|
|
800a5c0: 6d5a ldr r2, [r3, #84] ; 0x54
|
|
800a5c2: 4b81 ldr r3, [pc, #516] ; (800a7c8 <tcp_receive+0x26c>)
|
|
800a5c4: 681b ldr r3, [r3, #0]
|
|
if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
|
|
800a5c6: 429a cmp r2, r3
|
|
800a5c8: d106 bne.n 800a5d8 <tcp_receive+0x7c>
|
|
(pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
|
|
800a5ca: 687b ldr r3, [r7, #4]
|
|
800a5cc: 6d9a ldr r2, [r3, #88] ; 0x58
|
|
800a5ce: 4b7f ldr r3, [pc, #508] ; (800a7cc <tcp_receive+0x270>)
|
|
800a5d0: 681b ldr r3, [r3, #0]
|
|
800a5d2: 1ad3 subs r3, r2, r3
|
|
800a5d4: 2b00 cmp r3, #0
|
|
800a5d6: db0e blt.n 800a5f6 <tcp_receive+0x9a>
|
|
(pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) {
|
|
800a5d8: 687b ldr r3, [r7, #4]
|
|
800a5da: 6d9a ldr r2, [r3, #88] ; 0x58
|
|
800a5dc: 4b7b ldr r3, [pc, #492] ; (800a7cc <tcp_receive+0x270>)
|
|
800a5de: 681b ldr r3, [r3, #0]
|
|
(pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
|
|
800a5e0: 429a cmp r2, r3
|
|
800a5e2: d125 bne.n 800a630 <tcp_receive+0xd4>
|
|
(pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) {
|
|
800a5e4: 4b7a ldr r3, [pc, #488] ; (800a7d0 <tcp_receive+0x274>)
|
|
800a5e6: 681b ldr r3, [r3, #0]
|
|
800a5e8: 89db ldrh r3, [r3, #14]
|
|
800a5ea: b29a uxth r2, r3
|
|
800a5ec: 687b ldr r3, [r7, #4]
|
|
800a5ee: f8b3 3060 ldrh.w r3, [r3, #96] ; 0x60
|
|
800a5f2: 429a cmp r2, r3
|
|
800a5f4: d91c bls.n 800a630 <tcp_receive+0xd4>
|
|
pcb->snd_wnd = SND_WND_SCALE(pcb, tcphdr->wnd);
|
|
800a5f6: 4b76 ldr r3, [pc, #472] ; (800a7d0 <tcp_receive+0x274>)
|
|
800a5f8: 681b ldr r3, [r3, #0]
|
|
800a5fa: 89db ldrh r3, [r3, #14]
|
|
800a5fc: b29a uxth r2, r3
|
|
800a5fe: 687b ldr r3, [r7, #4]
|
|
800a600: f8a3 2060 strh.w r2, [r3, #96] ; 0x60
|
|
/* keep track of the biggest window announced by the remote host to calculate
|
|
the maximum segment size */
|
|
if (pcb->snd_wnd_max < pcb->snd_wnd) {
|
|
800a604: 687b ldr r3, [r7, #4]
|
|
800a606: f8b3 2062 ldrh.w r2, [r3, #98] ; 0x62
|
|
800a60a: 687b ldr r3, [r7, #4]
|
|
800a60c: f8b3 3060 ldrh.w r3, [r3, #96] ; 0x60
|
|
800a610: 429a cmp r2, r3
|
|
800a612: d205 bcs.n 800a620 <tcp_receive+0xc4>
|
|
pcb->snd_wnd_max = pcb->snd_wnd;
|
|
800a614: 687b ldr r3, [r7, #4]
|
|
800a616: f8b3 2060 ldrh.w r2, [r3, #96] ; 0x60
|
|
800a61a: 687b ldr r3, [r7, #4]
|
|
800a61c: f8a3 2062 strh.w r2, [r3, #98] ; 0x62
|
|
}
|
|
pcb->snd_wl1 = seqno;
|
|
800a620: 4b69 ldr r3, [pc, #420] ; (800a7c8 <tcp_receive+0x26c>)
|
|
800a622: 681a ldr r2, [r3, #0]
|
|
800a624: 687b ldr r3, [r7, #4]
|
|
800a626: 655a str r2, [r3, #84] ; 0x54
|
|
pcb->snd_wl2 = ackno;
|
|
800a628: 4b68 ldr r3, [pc, #416] ; (800a7cc <tcp_receive+0x270>)
|
|
800a62a: 681a ldr r2, [r3, #0]
|
|
800a62c: 687b ldr r3, [r7, #4]
|
|
800a62e: 659a str r2, [r3, #88] ; 0x58
|
|
* If it only passes 1, should reset dupack counter
|
|
*
|
|
*/
|
|
|
|
/* Clause 1 */
|
|
if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
|
|
800a630: 4b66 ldr r3, [pc, #408] ; (800a7cc <tcp_receive+0x270>)
|
|
800a632: 681a ldr r2, [r3, #0]
|
|
800a634: 687b ldr r3, [r7, #4]
|
|
800a636: 6c5b ldr r3, [r3, #68] ; 0x44
|
|
800a638: 1ad3 subs r3, r2, r3
|
|
800a63a: 2b00 cmp r3, #0
|
|
800a63c: dc58 bgt.n 800a6f0 <tcp_receive+0x194>
|
|
/* Clause 2 */
|
|
if (tcplen == 0) {
|
|
800a63e: 4b65 ldr r3, [pc, #404] ; (800a7d4 <tcp_receive+0x278>)
|
|
800a640: 881b ldrh r3, [r3, #0]
|
|
800a642: 2b00 cmp r3, #0
|
|
800a644: d14b bne.n 800a6de <tcp_receive+0x182>
|
|
/* Clause 3 */
|
|
if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) {
|
|
800a646: 687b ldr r3, [r7, #4]
|
|
800a648: 6d9b ldr r3, [r3, #88] ; 0x58
|
|
800a64a: 687a ldr r2, [r7, #4]
|
|
800a64c: f8b2 2060 ldrh.w r2, [r2, #96] ; 0x60
|
|
800a650: 4413 add r3, r2
|
|
800a652: 6b3a ldr r2, [r7, #48] ; 0x30
|
|
800a654: 429a cmp r2, r3
|
|
800a656: d142 bne.n 800a6de <tcp_receive+0x182>
|
|
/* Clause 4 */
|
|
if (pcb->rtime >= 0) {
|
|
800a658: 687b ldr r3, [r7, #4]
|
|
800a65a: f9b3 3030 ldrsh.w r3, [r3, #48] ; 0x30
|
|
800a65e: 2b00 cmp r3, #0
|
|
800a660: db3d blt.n 800a6de <tcp_receive+0x182>
|
|
/* Clause 5 */
|
|
if (pcb->lastack == ackno) {
|
|
800a662: 687b ldr r3, [r7, #4]
|
|
800a664: 6c5a ldr r2, [r3, #68] ; 0x44
|
|
800a666: 4b59 ldr r3, [pc, #356] ; (800a7cc <tcp_receive+0x270>)
|
|
800a668: 681b ldr r3, [r3, #0]
|
|
800a66a: 429a cmp r2, r3
|
|
800a66c: d137 bne.n 800a6de <tcp_receive+0x182>
|
|
found_dupack = 1;
|
|
800a66e: 2301 movs r3, #1
|
|
800a670: 64bb str r3, [r7, #72] ; 0x48
|
|
if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) {
|
|
800a672: 687b ldr r3, [r7, #4]
|
|
800a674: f893 3043 ldrb.w r3, [r3, #67] ; 0x43
|
|
800a678: 2bff cmp r3, #255 ; 0xff
|
|
800a67a: d007 beq.n 800a68c <tcp_receive+0x130>
|
|
++pcb->dupacks;
|
|
800a67c: 687b ldr r3, [r7, #4]
|
|
800a67e: f893 3043 ldrb.w r3, [r3, #67] ; 0x43
|
|
800a682: 3301 adds r3, #1
|
|
800a684: b2da uxtb r2, r3
|
|
800a686: 687b ldr r3, [r7, #4]
|
|
800a688: f883 2043 strb.w r2, [r3, #67] ; 0x43
|
|
}
|
|
if (pcb->dupacks > 3) {
|
|
800a68c: 687b ldr r3, [r7, #4]
|
|
800a68e: f893 3043 ldrb.w r3, [r3, #67] ; 0x43
|
|
800a692: 2b03 cmp r3, #3
|
|
800a694: d91b bls.n 800a6ce <tcp_receive+0x172>
|
|
/* Inflate the congestion window */
|
|
TCP_WND_INC(pcb->cwnd, pcb->mss);
|
|
800a696: 687b ldr r3, [r7, #4]
|
|
800a698: f8b3 2048 ldrh.w r2, [r3, #72] ; 0x48
|
|
800a69c: 687b ldr r3, [r7, #4]
|
|
800a69e: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800a6a0: 4413 add r3, r2
|
|
800a6a2: b29a uxth r2, r3
|
|
800a6a4: 687b ldr r3, [r7, #4]
|
|
800a6a6: f8b3 3048 ldrh.w r3, [r3, #72] ; 0x48
|
|
800a6aa: 429a cmp r2, r3
|
|
800a6ac: d30a bcc.n 800a6c4 <tcp_receive+0x168>
|
|
800a6ae: 687b ldr r3, [r7, #4]
|
|
800a6b0: f8b3 2048 ldrh.w r2, [r3, #72] ; 0x48
|
|
800a6b4: 687b ldr r3, [r7, #4]
|
|
800a6b6: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800a6b8: 4413 add r3, r2
|
|
800a6ba: b29a uxth r2, r3
|
|
800a6bc: 687b ldr r3, [r7, #4]
|
|
800a6be: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
800a6c2: e004 b.n 800a6ce <tcp_receive+0x172>
|
|
800a6c4: 687b ldr r3, [r7, #4]
|
|
800a6c6: f64f 72ff movw r2, #65535 ; 0xffff
|
|
800a6ca: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
}
|
|
if (pcb->dupacks >= 3) {
|
|
800a6ce: 687b ldr r3, [r7, #4]
|
|
800a6d0: f893 3043 ldrb.w r3, [r3, #67] ; 0x43
|
|
800a6d4: 2b02 cmp r3, #2
|
|
800a6d6: d902 bls.n 800a6de <tcp_receive+0x182>
|
|
/* Do fast retransmit (checked via TF_INFR, not via dupacks count) */
|
|
tcp_rexmit_fast(pcb);
|
|
800a6d8: 6878 ldr r0, [r7, #4]
|
|
800a6da: f002 fbb1 bl 800ce40 <tcp_rexmit_fast>
|
|
}
|
|
}
|
|
}
|
|
/* If Clause (1) or more is true, but not a duplicate ack, reset
|
|
* count of consecutive duplicate acks */
|
|
if (!found_dupack) {
|
|
800a6de: 6cbb ldr r3, [r7, #72] ; 0x48
|
|
800a6e0: 2b00 cmp r3, #0
|
|
800a6e2: f040 8161 bne.w 800a9a8 <tcp_receive+0x44c>
|
|
pcb->dupacks = 0;
|
|
800a6e6: 687b ldr r3, [r7, #4]
|
|
800a6e8: 2200 movs r2, #0
|
|
800a6ea: f883 2043 strb.w r2, [r3, #67] ; 0x43
|
|
800a6ee: e15b b.n 800a9a8 <tcp_receive+0x44c>
|
|
}
|
|
} else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
|
|
800a6f0: 4b36 ldr r3, [pc, #216] ; (800a7cc <tcp_receive+0x270>)
|
|
800a6f2: 681a ldr r2, [r3, #0]
|
|
800a6f4: 687b ldr r3, [r7, #4]
|
|
800a6f6: 6c5b ldr r3, [r3, #68] ; 0x44
|
|
800a6f8: 1ad3 subs r3, r2, r3
|
|
800a6fa: 3b01 subs r3, #1
|
|
800a6fc: 2b00 cmp r3, #0
|
|
800a6fe: f2c0 814e blt.w 800a99e <tcp_receive+0x442>
|
|
800a702: 4b32 ldr r3, [pc, #200] ; (800a7cc <tcp_receive+0x270>)
|
|
800a704: 681a ldr r2, [r3, #0]
|
|
800a706: 687b ldr r3, [r7, #4]
|
|
800a708: 6d1b ldr r3, [r3, #80] ; 0x50
|
|
800a70a: 1ad3 subs r3, r2, r3
|
|
800a70c: 2b00 cmp r3, #0
|
|
800a70e: f300 8146 bgt.w 800a99e <tcp_receive+0x442>
|
|
tcpwnd_size_t acked;
|
|
|
|
/* Reset the "IN Fast Retransmit" flag, since we are no longer
|
|
in fast retransmit. Also reset the congestion window to the
|
|
slow start threshold. */
|
|
if (pcb->flags & TF_INFR) {
|
|
800a712: 687b ldr r3, [r7, #4]
|
|
800a714: 8b5b ldrh r3, [r3, #26]
|
|
800a716: f003 0304 and.w r3, r3, #4
|
|
800a71a: 2b00 cmp r3, #0
|
|
800a71c: d010 beq.n 800a740 <tcp_receive+0x1e4>
|
|
tcp_clear_flags(pcb, TF_INFR);
|
|
800a71e: 687b ldr r3, [r7, #4]
|
|
800a720: 8b5b ldrh r3, [r3, #26]
|
|
800a722: f023 0304 bic.w r3, r3, #4
|
|
800a726: b29a uxth r2, r3
|
|
800a728: 687b ldr r3, [r7, #4]
|
|
800a72a: 835a strh r2, [r3, #26]
|
|
pcb->cwnd = pcb->ssthresh;
|
|
800a72c: 687b ldr r3, [r7, #4]
|
|
800a72e: f8b3 204a ldrh.w r2, [r3, #74] ; 0x4a
|
|
800a732: 687b ldr r3, [r7, #4]
|
|
800a734: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
pcb->bytes_acked = 0;
|
|
800a738: 687b ldr r3, [r7, #4]
|
|
800a73a: 2200 movs r2, #0
|
|
800a73c: f8a3 206a strh.w r2, [r3, #106] ; 0x6a
|
|
}
|
|
|
|
/* Reset the number of retransmissions. */
|
|
pcb->nrtx = 0;
|
|
800a740: 687b ldr r3, [r7, #4]
|
|
800a742: 2200 movs r2, #0
|
|
800a744: f883 2042 strb.w r2, [r3, #66] ; 0x42
|
|
|
|
/* Reset the retransmission time-out. */
|
|
pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv);
|
|
800a748: 687b ldr r3, [r7, #4]
|
|
800a74a: f9b3 303c ldrsh.w r3, [r3, #60] ; 0x3c
|
|
800a74e: 10db asrs r3, r3, #3
|
|
800a750: b21b sxth r3, r3
|
|
800a752: b29a uxth r2, r3
|
|
800a754: 687b ldr r3, [r7, #4]
|
|
800a756: f9b3 303e ldrsh.w r3, [r3, #62] ; 0x3e
|
|
800a75a: b29b uxth r3, r3
|
|
800a75c: 4413 add r3, r2
|
|
800a75e: b29b uxth r3, r3
|
|
800a760: b21a sxth r2, r3
|
|
800a762: 687b ldr r3, [r7, #4]
|
|
800a764: f8a3 2040 strh.w r2, [r3, #64] ; 0x40
|
|
|
|
/* Record how much data this ACK acks */
|
|
acked = (tcpwnd_size_t)(ackno - pcb->lastack);
|
|
800a768: 4b18 ldr r3, [pc, #96] ; (800a7cc <tcp_receive+0x270>)
|
|
800a76a: 681b ldr r3, [r3, #0]
|
|
800a76c: b29a uxth r2, r3
|
|
800a76e: 687b ldr r3, [r7, #4]
|
|
800a770: 6c5b ldr r3, [r3, #68] ; 0x44
|
|
800a772: b29b uxth r3, r3
|
|
800a774: 1ad3 subs r3, r2, r3
|
|
800a776: 85fb strh r3, [r7, #46] ; 0x2e
|
|
|
|
/* Reset the fast retransmit variables. */
|
|
pcb->dupacks = 0;
|
|
800a778: 687b ldr r3, [r7, #4]
|
|
800a77a: 2200 movs r2, #0
|
|
800a77c: f883 2043 strb.w r2, [r3, #67] ; 0x43
|
|
pcb->lastack = ackno;
|
|
800a780: 4b12 ldr r3, [pc, #72] ; (800a7cc <tcp_receive+0x270>)
|
|
800a782: 681a ldr r2, [r3, #0]
|
|
800a784: 687b ldr r3, [r7, #4]
|
|
800a786: 645a str r2, [r3, #68] ; 0x44
|
|
|
|
/* Update the congestion control variables (cwnd and
|
|
ssthresh). */
|
|
if (pcb->state >= ESTABLISHED) {
|
|
800a788: 687b ldr r3, [r7, #4]
|
|
800a78a: 7d1b ldrb r3, [r3, #20]
|
|
800a78c: 2b03 cmp r3, #3
|
|
800a78e: f240 8097 bls.w 800a8c0 <tcp_receive+0x364>
|
|
if (pcb->cwnd < pcb->ssthresh) {
|
|
800a792: 687b ldr r3, [r7, #4]
|
|
800a794: f8b3 2048 ldrh.w r2, [r3, #72] ; 0x48
|
|
800a798: 687b ldr r3, [r7, #4]
|
|
800a79a: f8b3 304a ldrh.w r3, [r3, #74] ; 0x4a
|
|
800a79e: 429a cmp r2, r3
|
|
800a7a0: d245 bcs.n 800a82e <tcp_receive+0x2d2>
|
|
tcpwnd_size_t increase;
|
|
/* limit to 1 SMSS segment during period following RTO */
|
|
u8_t num_seg = (pcb->flags & TF_RTO) ? 1 : 2;
|
|
800a7a2: 687b ldr r3, [r7, #4]
|
|
800a7a4: 8b5b ldrh r3, [r3, #26]
|
|
800a7a6: f403 6300 and.w r3, r3, #2048 ; 0x800
|
|
800a7aa: 2b00 cmp r3, #0
|
|
800a7ac: d014 beq.n 800a7d8 <tcp_receive+0x27c>
|
|
800a7ae: 2301 movs r3, #1
|
|
800a7b0: e013 b.n 800a7da <tcp_receive+0x27e>
|
|
800a7b2: bf00 nop
|
|
800a7b4: 08013198 .word 0x08013198
|
|
800a7b8: 080134c8 .word 0x080134c8
|
|
800a7bc: 080131e4 .word 0x080131e4
|
|
800a7c0: 080134e4 .word 0x080134e4
|
|
800a7c4: 24007bb4 .word 0x24007bb4
|
|
800a7c8: 24007ba8 .word 0x24007ba8
|
|
800a7cc: 24007bac .word 0x24007bac
|
|
800a7d0: 24007b98 .word 0x24007b98
|
|
800a7d4: 24007bb2 .word 0x24007bb2
|
|
800a7d8: 2302 movs r3, #2
|
|
800a7da: f887 302d strb.w r3, [r7, #45] ; 0x2d
|
|
/* RFC 3465, section 2.2 Slow Start */
|
|
increase = LWIP_MIN(acked, (tcpwnd_size_t)(num_seg * pcb->mss));
|
|
800a7de: f897 302d ldrb.w r3, [r7, #45] ; 0x2d
|
|
800a7e2: b29a uxth r2, r3
|
|
800a7e4: 687b ldr r3, [r7, #4]
|
|
800a7e6: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800a7e8: fb12 f303 smulbb r3, r2, r3
|
|
800a7ec: b29b uxth r3, r3
|
|
800a7ee: 8dfa ldrh r2, [r7, #46] ; 0x2e
|
|
800a7f0: 4293 cmp r3, r2
|
|
800a7f2: bf28 it cs
|
|
800a7f4: 4613 movcs r3, r2
|
|
800a7f6: 857b strh r3, [r7, #42] ; 0x2a
|
|
TCP_WND_INC(pcb->cwnd, increase);
|
|
800a7f8: 687b ldr r3, [r7, #4]
|
|
800a7fa: f8b3 2048 ldrh.w r2, [r3, #72] ; 0x48
|
|
800a7fe: 8d7b ldrh r3, [r7, #42] ; 0x2a
|
|
800a800: 4413 add r3, r2
|
|
800a802: b29a uxth r2, r3
|
|
800a804: 687b ldr r3, [r7, #4]
|
|
800a806: f8b3 3048 ldrh.w r3, [r3, #72] ; 0x48
|
|
800a80a: 429a cmp r2, r3
|
|
800a80c: d309 bcc.n 800a822 <tcp_receive+0x2c6>
|
|
800a80e: 687b ldr r3, [r7, #4]
|
|
800a810: f8b3 2048 ldrh.w r2, [r3, #72] ; 0x48
|
|
800a814: 8d7b ldrh r3, [r7, #42] ; 0x2a
|
|
800a816: 4413 add r3, r2
|
|
800a818: b29a uxth r2, r3
|
|
800a81a: 687b ldr r3, [r7, #4]
|
|
800a81c: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
800a820: e04e b.n 800a8c0 <tcp_receive+0x364>
|
|
800a822: 687b ldr r3, [r7, #4]
|
|
800a824: f64f 72ff movw r2, #65535 ; 0xffff
|
|
800a828: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
800a82c: e048 b.n 800a8c0 <tcp_receive+0x364>
|
|
LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"TCPWNDSIZE_F"\n", pcb->cwnd));
|
|
} else {
|
|
/* RFC 3465, section 2.1 Congestion Avoidance */
|
|
TCP_WND_INC(pcb->bytes_acked, acked);
|
|
800a82e: 687b ldr r3, [r7, #4]
|
|
800a830: f8b3 206a ldrh.w r2, [r3, #106] ; 0x6a
|
|
800a834: 8dfb ldrh r3, [r7, #46] ; 0x2e
|
|
800a836: 4413 add r3, r2
|
|
800a838: b29a uxth r2, r3
|
|
800a83a: 687b ldr r3, [r7, #4]
|
|
800a83c: f8b3 306a ldrh.w r3, [r3, #106] ; 0x6a
|
|
800a840: 429a cmp r2, r3
|
|
800a842: d309 bcc.n 800a858 <tcp_receive+0x2fc>
|
|
800a844: 687b ldr r3, [r7, #4]
|
|
800a846: f8b3 206a ldrh.w r2, [r3, #106] ; 0x6a
|
|
800a84a: 8dfb ldrh r3, [r7, #46] ; 0x2e
|
|
800a84c: 4413 add r3, r2
|
|
800a84e: b29a uxth r2, r3
|
|
800a850: 687b ldr r3, [r7, #4]
|
|
800a852: f8a3 206a strh.w r2, [r3, #106] ; 0x6a
|
|
800a856: e004 b.n 800a862 <tcp_receive+0x306>
|
|
800a858: 687b ldr r3, [r7, #4]
|
|
800a85a: f64f 72ff movw r2, #65535 ; 0xffff
|
|
800a85e: f8a3 206a strh.w r2, [r3, #106] ; 0x6a
|
|
if (pcb->bytes_acked >= pcb->cwnd) {
|
|
800a862: 687b ldr r3, [r7, #4]
|
|
800a864: f8b3 206a ldrh.w r2, [r3, #106] ; 0x6a
|
|
800a868: 687b ldr r3, [r7, #4]
|
|
800a86a: f8b3 3048 ldrh.w r3, [r3, #72] ; 0x48
|
|
800a86e: 429a cmp r2, r3
|
|
800a870: d326 bcc.n 800a8c0 <tcp_receive+0x364>
|
|
pcb->bytes_acked = (tcpwnd_size_t)(pcb->bytes_acked - pcb->cwnd);
|
|
800a872: 687b ldr r3, [r7, #4]
|
|
800a874: f8b3 206a ldrh.w r2, [r3, #106] ; 0x6a
|
|
800a878: 687b ldr r3, [r7, #4]
|
|
800a87a: f8b3 3048 ldrh.w r3, [r3, #72] ; 0x48
|
|
800a87e: 1ad3 subs r3, r2, r3
|
|
800a880: b29a uxth r2, r3
|
|
800a882: 687b ldr r3, [r7, #4]
|
|
800a884: f8a3 206a strh.w r2, [r3, #106] ; 0x6a
|
|
TCP_WND_INC(pcb->cwnd, pcb->mss);
|
|
800a888: 687b ldr r3, [r7, #4]
|
|
800a88a: f8b3 2048 ldrh.w r2, [r3, #72] ; 0x48
|
|
800a88e: 687b ldr r3, [r7, #4]
|
|
800a890: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800a892: 4413 add r3, r2
|
|
800a894: b29a uxth r2, r3
|
|
800a896: 687b ldr r3, [r7, #4]
|
|
800a898: f8b3 3048 ldrh.w r3, [r3, #72] ; 0x48
|
|
800a89c: 429a cmp r2, r3
|
|
800a89e: d30a bcc.n 800a8b6 <tcp_receive+0x35a>
|
|
800a8a0: 687b ldr r3, [r7, #4]
|
|
800a8a2: f8b3 2048 ldrh.w r2, [r3, #72] ; 0x48
|
|
800a8a6: 687b ldr r3, [r7, #4]
|
|
800a8a8: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800a8aa: 4413 add r3, r2
|
|
800a8ac: b29a uxth r2, r3
|
|
800a8ae: 687b ldr r3, [r7, #4]
|
|
800a8b0: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
800a8b4: e004 b.n 800a8c0 <tcp_receive+0x364>
|
|
800a8b6: 687b ldr r3, [r7, #4]
|
|
800a8b8: f64f 72ff movw r2, #65535 ; 0xffff
|
|
800a8bc: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
pcb->unacked != NULL ?
|
|
lwip_ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked) : 0));
|
|
|
|
/* Remove segment from the unacknowledged list if the incoming
|
|
ACK acknowledges them. */
|
|
pcb->unacked = tcp_free_acked_segments(pcb, pcb->unacked, "unacked", pcb->unsent);
|
|
800a8c0: 687b ldr r3, [r7, #4]
|
|
800a8c2: 6f19 ldr r1, [r3, #112] ; 0x70
|
|
800a8c4: 687b ldr r3, [r7, #4]
|
|
800a8c6: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800a8c8: 4a98 ldr r2, [pc, #608] ; (800ab2c <tcp_receive+0x5d0>)
|
|
800a8ca: 6878 ldr r0, [r7, #4]
|
|
800a8cc: f7ff fdca bl 800a464 <tcp_free_acked_segments>
|
|
800a8d0: 4602 mov r2, r0
|
|
800a8d2: 687b ldr r3, [r7, #4]
|
|
800a8d4: 671a str r2, [r3, #112] ; 0x70
|
|
on the list are acknowledged by the ACK. This may seem
|
|
strange since an "unsent" segment shouldn't be acked. The
|
|
rationale is that lwIP puts all outstanding segments on the
|
|
->unsent list after a retransmission, so these segments may
|
|
in fact have been sent once. */
|
|
pcb->unsent = tcp_free_acked_segments(pcb, pcb->unsent, "unsent", pcb->unacked);
|
|
800a8d6: 687b ldr r3, [r7, #4]
|
|
800a8d8: 6ed9 ldr r1, [r3, #108] ; 0x6c
|
|
800a8da: 687b ldr r3, [r7, #4]
|
|
800a8dc: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800a8de: 4a94 ldr r2, [pc, #592] ; (800ab30 <tcp_receive+0x5d4>)
|
|
800a8e0: 6878 ldr r0, [r7, #4]
|
|
800a8e2: f7ff fdbf bl 800a464 <tcp_free_acked_segments>
|
|
800a8e6: 4602 mov r2, r0
|
|
800a8e8: 687b ldr r3, [r7, #4]
|
|
800a8ea: 66da str r2, [r3, #108] ; 0x6c
|
|
|
|
/* If there's nothing left to acknowledge, stop the retransmit
|
|
timer, otherwise reset it to start again */
|
|
if (pcb->unacked == NULL) {
|
|
800a8ec: 687b ldr r3, [r7, #4]
|
|
800a8ee: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800a8f0: 2b00 cmp r3, #0
|
|
800a8f2: d104 bne.n 800a8fe <tcp_receive+0x3a2>
|
|
pcb->rtime = -1;
|
|
800a8f4: 687b ldr r3, [r7, #4]
|
|
800a8f6: f64f 72ff movw r2, #65535 ; 0xffff
|
|
800a8fa: 861a strh r2, [r3, #48] ; 0x30
|
|
800a8fc: e002 b.n 800a904 <tcp_receive+0x3a8>
|
|
} else {
|
|
pcb->rtime = 0;
|
|
800a8fe: 687b ldr r3, [r7, #4]
|
|
800a900: 2200 movs r2, #0
|
|
800a902: 861a strh r2, [r3, #48] ; 0x30
|
|
}
|
|
|
|
pcb->polltmr = 0;
|
|
800a904: 687b ldr r3, [r7, #4]
|
|
800a906: 2200 movs r2, #0
|
|
800a908: 771a strb r2, [r3, #28]
|
|
|
|
#if TCP_OVERSIZE
|
|
if (pcb->unsent == NULL) {
|
|
800a90a: 687b ldr r3, [r7, #4]
|
|
800a90c: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800a90e: 2b00 cmp r3, #0
|
|
800a910: d103 bne.n 800a91a <tcp_receive+0x3be>
|
|
pcb->unsent_oversize = 0;
|
|
800a912: 687b ldr r3, [r7, #4]
|
|
800a914: 2200 movs r2, #0
|
|
800a916: f8a3 2068 strh.w r2, [r3, #104] ; 0x68
|
|
/* Inform neighbor reachability of forward progress. */
|
|
nd6_reachability_hint(ip6_current_src_addr());
|
|
}
|
|
#endif /* LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS*/
|
|
|
|
pcb->snd_buf = (tcpwnd_size_t)(pcb->snd_buf + recv_acked);
|
|
800a91a: 687b ldr r3, [r7, #4]
|
|
800a91c: f8b3 2064 ldrh.w r2, [r3, #100] ; 0x64
|
|
800a920: 4b84 ldr r3, [pc, #528] ; (800ab34 <tcp_receive+0x5d8>)
|
|
800a922: 881b ldrh r3, [r3, #0]
|
|
800a924: 4413 add r3, r2
|
|
800a926: b29a uxth r2, r3
|
|
800a928: 687b ldr r3, [r7, #4]
|
|
800a92a: f8a3 2064 strh.w r2, [r3, #100] ; 0x64
|
|
/* check if this ACK ends our retransmission of in-flight data */
|
|
if (pcb->flags & TF_RTO) {
|
|
800a92e: 687b ldr r3, [r7, #4]
|
|
800a930: 8b5b ldrh r3, [r3, #26]
|
|
800a932: f403 6300 and.w r3, r3, #2048 ; 0x800
|
|
800a936: 2b00 cmp r3, #0
|
|
800a938: d035 beq.n 800a9a6 <tcp_receive+0x44a>
|
|
/* RTO is done if
|
|
1) both queues are empty or
|
|
2) unacked is empty and unsent head contains data not part of RTO or
|
|
3) unacked head contains data not part of RTO */
|
|
if (pcb->unacked == NULL) {
|
|
800a93a: 687b ldr r3, [r7, #4]
|
|
800a93c: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800a93e: 2b00 cmp r3, #0
|
|
800a940: d118 bne.n 800a974 <tcp_receive+0x418>
|
|
if ((pcb->unsent == NULL) ||
|
|
800a942: 687b ldr r3, [r7, #4]
|
|
800a944: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800a946: 2b00 cmp r3, #0
|
|
800a948: d00c beq.n 800a964 <tcp_receive+0x408>
|
|
(TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unsent->tcphdr->seqno)))) {
|
|
800a94a: 687b ldr r3, [r7, #4]
|
|
800a94c: 6cdc ldr r4, [r3, #76] ; 0x4c
|
|
800a94e: 687b ldr r3, [r7, #4]
|
|
800a950: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800a952: 691b ldr r3, [r3, #16]
|
|
800a954: 685b ldr r3, [r3, #4]
|
|
800a956: 4618 mov r0, r3
|
|
800a958: f7fa fe0d bl 8005576 <lwip_htonl>
|
|
800a95c: 4603 mov r3, r0
|
|
800a95e: 1ae3 subs r3, r4, r3
|
|
if ((pcb->unsent == NULL) ||
|
|
800a960: 2b00 cmp r3, #0
|
|
800a962: dc20 bgt.n 800a9a6 <tcp_receive+0x44a>
|
|
tcp_clear_flags(pcb, TF_RTO);
|
|
800a964: 687b ldr r3, [r7, #4]
|
|
800a966: 8b5b ldrh r3, [r3, #26]
|
|
800a968: f423 6300 bic.w r3, r3, #2048 ; 0x800
|
|
800a96c: b29a uxth r2, r3
|
|
800a96e: 687b ldr r3, [r7, #4]
|
|
800a970: 835a strh r2, [r3, #26]
|
|
} else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
|
|
800a972: e018 b.n 800a9a6 <tcp_receive+0x44a>
|
|
}
|
|
} else if (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unacked->tcphdr->seqno))) {
|
|
800a974: 687b ldr r3, [r7, #4]
|
|
800a976: 6cdc ldr r4, [r3, #76] ; 0x4c
|
|
800a978: 687b ldr r3, [r7, #4]
|
|
800a97a: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800a97c: 691b ldr r3, [r3, #16]
|
|
800a97e: 685b ldr r3, [r3, #4]
|
|
800a980: 4618 mov r0, r3
|
|
800a982: f7fa fdf8 bl 8005576 <lwip_htonl>
|
|
800a986: 4603 mov r3, r0
|
|
800a988: 1ae3 subs r3, r4, r3
|
|
800a98a: 2b00 cmp r3, #0
|
|
800a98c: dc0b bgt.n 800a9a6 <tcp_receive+0x44a>
|
|
tcp_clear_flags(pcb, TF_RTO);
|
|
800a98e: 687b ldr r3, [r7, #4]
|
|
800a990: 8b5b ldrh r3, [r3, #26]
|
|
800a992: f423 6300 bic.w r3, r3, #2048 ; 0x800
|
|
800a996: b29a uxth r2, r3
|
|
800a998: 687b ldr r3, [r7, #4]
|
|
800a99a: 835a strh r2, [r3, #26]
|
|
} else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
|
|
800a99c: e003 b.n 800a9a6 <tcp_receive+0x44a>
|
|
}
|
|
}
|
|
/* End of ACK for new data processing. */
|
|
} else {
|
|
/* Out of sequence ACK, didn't really ack anything */
|
|
tcp_send_empty_ack(pcb);
|
|
800a99e: 6878 ldr r0, [r7, #4]
|
|
800a9a0: f002 fc3a bl 800d218 <tcp_send_empty_ack>
|
|
800a9a4: e000 b.n 800a9a8 <tcp_receive+0x44c>
|
|
} else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
|
|
800a9a6: bf00 nop
|
|
pcb->rttest, pcb->rtseq, ackno));
|
|
|
|
/* RTT estimation calculations. This is done by checking if the
|
|
incoming segment acknowledges the segment we use to take a
|
|
round-trip time measurement. */
|
|
if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
|
|
800a9a8: 687b ldr r3, [r7, #4]
|
|
800a9aa: 6b5b ldr r3, [r3, #52] ; 0x34
|
|
800a9ac: 2b00 cmp r3, #0
|
|
800a9ae: d05b beq.n 800aa68 <tcp_receive+0x50c>
|
|
800a9b0: 687b ldr r3, [r7, #4]
|
|
800a9b2: 6b9a ldr r2, [r3, #56] ; 0x38
|
|
800a9b4: 4b60 ldr r3, [pc, #384] ; (800ab38 <tcp_receive+0x5dc>)
|
|
800a9b6: 681b ldr r3, [r3, #0]
|
|
800a9b8: 1ad3 subs r3, r2, r3
|
|
800a9ba: 2b00 cmp r3, #0
|
|
800a9bc: da54 bge.n 800aa68 <tcp_receive+0x50c>
|
|
/* diff between this shouldn't exceed 32K since this are tcp timer ticks
|
|
and a round-trip shouldn't be that long... */
|
|
m = (s16_t)(tcp_ticks - pcb->rttest);
|
|
800a9be: 4b5f ldr r3, [pc, #380] ; (800ab3c <tcp_receive+0x5e0>)
|
|
800a9c0: 681b ldr r3, [r3, #0]
|
|
800a9c2: b29a uxth r2, r3
|
|
800a9c4: 687b ldr r3, [r7, #4]
|
|
800a9c6: 6b5b ldr r3, [r3, #52] ; 0x34
|
|
800a9c8: b29b uxth r3, r3
|
|
800a9ca: 1ad3 subs r3, r2, r3
|
|
800a9cc: b29b uxth r3, r3
|
|
800a9ce: f8a7 304e strh.w r3, [r7, #78] ; 0x4e
|
|
|
|
LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
|
|
m, (u16_t)(m * TCP_SLOW_INTERVAL)));
|
|
|
|
/* This is taken directly from VJs original code in his paper */
|
|
m = (s16_t)(m - (pcb->sa >> 3));
|
|
800a9d2: f8b7 204e ldrh.w r2, [r7, #78] ; 0x4e
|
|
800a9d6: 687b ldr r3, [r7, #4]
|
|
800a9d8: f9b3 303c ldrsh.w r3, [r3, #60] ; 0x3c
|
|
800a9dc: 10db asrs r3, r3, #3
|
|
800a9de: b21b sxth r3, r3
|
|
800a9e0: b29b uxth r3, r3
|
|
800a9e2: 1ad3 subs r3, r2, r3
|
|
800a9e4: b29b uxth r3, r3
|
|
800a9e6: f8a7 304e strh.w r3, [r7, #78] ; 0x4e
|
|
pcb->sa = (s16_t)(pcb->sa + m);
|
|
800a9ea: 687b ldr r3, [r7, #4]
|
|
800a9ec: f9b3 303c ldrsh.w r3, [r3, #60] ; 0x3c
|
|
800a9f0: b29a uxth r2, r3
|
|
800a9f2: f8b7 304e ldrh.w r3, [r7, #78] ; 0x4e
|
|
800a9f6: 4413 add r3, r2
|
|
800a9f8: b29b uxth r3, r3
|
|
800a9fa: b21a sxth r2, r3
|
|
800a9fc: 687b ldr r3, [r7, #4]
|
|
800a9fe: 879a strh r2, [r3, #60] ; 0x3c
|
|
if (m < 0) {
|
|
800aa00: f9b7 304e ldrsh.w r3, [r7, #78] ; 0x4e
|
|
800aa04: 2b00 cmp r3, #0
|
|
800aa06: da05 bge.n 800aa14 <tcp_receive+0x4b8>
|
|
m = (s16_t) - m;
|
|
800aa08: f8b7 304e ldrh.w r3, [r7, #78] ; 0x4e
|
|
800aa0c: 425b negs r3, r3
|
|
800aa0e: b29b uxth r3, r3
|
|
800aa10: f8a7 304e strh.w r3, [r7, #78] ; 0x4e
|
|
}
|
|
m = (s16_t)(m - (pcb->sv >> 2));
|
|
800aa14: f8b7 204e ldrh.w r2, [r7, #78] ; 0x4e
|
|
800aa18: 687b ldr r3, [r7, #4]
|
|
800aa1a: f9b3 303e ldrsh.w r3, [r3, #62] ; 0x3e
|
|
800aa1e: 109b asrs r3, r3, #2
|
|
800aa20: b21b sxth r3, r3
|
|
800aa22: b29b uxth r3, r3
|
|
800aa24: 1ad3 subs r3, r2, r3
|
|
800aa26: b29b uxth r3, r3
|
|
800aa28: f8a7 304e strh.w r3, [r7, #78] ; 0x4e
|
|
pcb->sv = (s16_t)(pcb->sv + m);
|
|
800aa2c: 687b ldr r3, [r7, #4]
|
|
800aa2e: f9b3 303e ldrsh.w r3, [r3, #62] ; 0x3e
|
|
800aa32: b29a uxth r2, r3
|
|
800aa34: f8b7 304e ldrh.w r3, [r7, #78] ; 0x4e
|
|
800aa38: 4413 add r3, r2
|
|
800aa3a: b29b uxth r3, r3
|
|
800aa3c: b21a sxth r2, r3
|
|
800aa3e: 687b ldr r3, [r7, #4]
|
|
800aa40: 87da strh r2, [r3, #62] ; 0x3e
|
|
pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv);
|
|
800aa42: 687b ldr r3, [r7, #4]
|
|
800aa44: f9b3 303c ldrsh.w r3, [r3, #60] ; 0x3c
|
|
800aa48: 10db asrs r3, r3, #3
|
|
800aa4a: b21b sxth r3, r3
|
|
800aa4c: b29a uxth r2, r3
|
|
800aa4e: 687b ldr r3, [r7, #4]
|
|
800aa50: f9b3 303e ldrsh.w r3, [r3, #62] ; 0x3e
|
|
800aa54: b29b uxth r3, r3
|
|
800aa56: 4413 add r3, r2
|
|
800aa58: b29b uxth r3, r3
|
|
800aa5a: b21a sxth r2, r3
|
|
800aa5c: 687b ldr r3, [r7, #4]
|
|
800aa5e: f8a3 2040 strh.w r2, [r3, #64] ; 0x40
|
|
|
|
LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n",
|
|
pcb->rto, (u16_t)(pcb->rto * TCP_SLOW_INTERVAL)));
|
|
|
|
pcb->rttest = 0;
|
|
800aa62: 687b ldr r3, [r7, #4]
|
|
800aa64: 2200 movs r2, #0
|
|
800aa66: 635a str r2, [r3, #52] ; 0x34
|
|
|
|
/* If the incoming segment contains data, we must process it
|
|
further unless the pcb already received a FIN.
|
|
(RFC 793, chapter 3.9, "SEGMENT ARRIVES" in states CLOSE-WAIT, CLOSING,
|
|
LAST-ACK and TIME-WAIT: "Ignore the segment text.") */
|
|
if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) {
|
|
800aa68: 4b35 ldr r3, [pc, #212] ; (800ab40 <tcp_receive+0x5e4>)
|
|
800aa6a: 881b ldrh r3, [r3, #0]
|
|
800aa6c: 2b00 cmp r3, #0
|
|
800aa6e: f000 84e2 beq.w 800b436 <tcp_receive+0xeda>
|
|
800aa72: 687b ldr r3, [r7, #4]
|
|
800aa74: 7d1b ldrb r3, [r3, #20]
|
|
800aa76: 2b06 cmp r3, #6
|
|
800aa78: f200 84dd bhi.w 800b436 <tcp_receive+0xeda>
|
|
this if the sequence number of the incoming segment is less
|
|
than rcv_nxt, and the sequence number plus the length of the
|
|
segment is larger than rcv_nxt. */
|
|
/* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) {
|
|
if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/
|
|
if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)) {
|
|
800aa7c: 687b ldr r3, [r7, #4]
|
|
800aa7e: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
800aa80: 4b30 ldr r3, [pc, #192] ; (800ab44 <tcp_receive+0x5e8>)
|
|
800aa82: 681b ldr r3, [r3, #0]
|
|
800aa84: 1ad3 subs r3, r2, r3
|
|
800aa86: 3b01 subs r3, #1
|
|
800aa88: 2b00 cmp r3, #0
|
|
800aa8a: f2c0 808f blt.w 800abac <tcp_receive+0x650>
|
|
800aa8e: 687b ldr r3, [r7, #4]
|
|
800aa90: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
800aa92: 4b2b ldr r3, [pc, #172] ; (800ab40 <tcp_receive+0x5e4>)
|
|
800aa94: 881b ldrh r3, [r3, #0]
|
|
800aa96: 4619 mov r1, r3
|
|
800aa98: 4b2a ldr r3, [pc, #168] ; (800ab44 <tcp_receive+0x5e8>)
|
|
800aa9a: 681b ldr r3, [r3, #0]
|
|
800aa9c: 440b add r3, r1
|
|
800aa9e: 1ad3 subs r3, r2, r3
|
|
800aaa0: 3301 adds r3, #1
|
|
800aaa2: 2b00 cmp r3, #0
|
|
800aaa4: f300 8082 bgt.w 800abac <tcp_receive+0x650>
|
|
|
|
After we are done with adjusting the pbuf pointers we must
|
|
adjust the ->data pointer in the seg and the segment
|
|
length.*/
|
|
|
|
struct pbuf *p = inseg.p;
|
|
800aaa8: 4b27 ldr r3, [pc, #156] ; (800ab48 <tcp_receive+0x5ec>)
|
|
800aaaa: 685b ldr r3, [r3, #4]
|
|
800aaac: 647b str r3, [r7, #68] ; 0x44
|
|
u32_t off32 = pcb->rcv_nxt - seqno;
|
|
800aaae: 687b ldr r3, [r7, #4]
|
|
800aab0: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
800aab2: 4b24 ldr r3, [pc, #144] ; (800ab44 <tcp_receive+0x5e8>)
|
|
800aab4: 681b ldr r3, [r3, #0]
|
|
800aab6: 1ad3 subs r3, r2, r3
|
|
800aab8: 627b str r3, [r7, #36] ; 0x24
|
|
u16_t new_tot_len, off;
|
|
LWIP_ASSERT("inseg.p != NULL", inseg.p);
|
|
800aaba: 4b23 ldr r3, [pc, #140] ; (800ab48 <tcp_receive+0x5ec>)
|
|
800aabc: 685b ldr r3, [r3, #4]
|
|
800aabe: 2b00 cmp r3, #0
|
|
800aac0: d106 bne.n 800aad0 <tcp_receive+0x574>
|
|
800aac2: 4b22 ldr r3, [pc, #136] ; (800ab4c <tcp_receive+0x5f0>)
|
|
800aac4: f240 5294 movw r2, #1428 ; 0x594
|
|
800aac8: 4921 ldr r1, [pc, #132] ; (800ab50 <tcp_receive+0x5f4>)
|
|
800aaca: 4822 ldr r0, [pc, #136] ; (800ab54 <tcp_receive+0x5f8>)
|
|
800aacc: f006 f87c bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("insane offset!", (off32 < 0xffff));
|
|
800aad0: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800aad2: f64f 72fe movw r2, #65534 ; 0xfffe
|
|
800aad6: 4293 cmp r3, r2
|
|
800aad8: d906 bls.n 800aae8 <tcp_receive+0x58c>
|
|
800aada: 4b1c ldr r3, [pc, #112] ; (800ab4c <tcp_receive+0x5f0>)
|
|
800aadc: f240 5295 movw r2, #1429 ; 0x595
|
|
800aae0: 491d ldr r1, [pc, #116] ; (800ab58 <tcp_receive+0x5fc>)
|
|
800aae2: 481c ldr r0, [pc, #112] ; (800ab54 <tcp_receive+0x5f8>)
|
|
800aae4: f006 f870 bl 8010bc8 <iprintf>
|
|
off = (u16_t)off32;
|
|
800aae8: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800aaea: f8a7 3042 strh.w r3, [r7, #66] ; 0x42
|
|
LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
|
|
800aaee: 4b16 ldr r3, [pc, #88] ; (800ab48 <tcp_receive+0x5ec>)
|
|
800aaf0: 685b ldr r3, [r3, #4]
|
|
800aaf2: 891b ldrh r3, [r3, #8]
|
|
800aaf4: f8b7 2042 ldrh.w r2, [r7, #66] ; 0x42
|
|
800aaf8: 429a cmp r2, r3
|
|
800aafa: d906 bls.n 800ab0a <tcp_receive+0x5ae>
|
|
800aafc: 4b13 ldr r3, [pc, #76] ; (800ab4c <tcp_receive+0x5f0>)
|
|
800aafe: f240 5297 movw r2, #1431 ; 0x597
|
|
800ab02: 4916 ldr r1, [pc, #88] ; (800ab5c <tcp_receive+0x600>)
|
|
800ab04: 4813 ldr r0, [pc, #76] ; (800ab54 <tcp_receive+0x5f8>)
|
|
800ab06: f006 f85f bl 8010bc8 <iprintf>
|
|
inseg.len -= off;
|
|
800ab0a: 4b0f ldr r3, [pc, #60] ; (800ab48 <tcp_receive+0x5ec>)
|
|
800ab0c: 891a ldrh r2, [r3, #8]
|
|
800ab0e: f8b7 3042 ldrh.w r3, [r7, #66] ; 0x42
|
|
800ab12: 1ad3 subs r3, r2, r3
|
|
800ab14: b29a uxth r2, r3
|
|
800ab16: 4b0c ldr r3, [pc, #48] ; (800ab48 <tcp_receive+0x5ec>)
|
|
800ab18: 811a strh r2, [r3, #8]
|
|
new_tot_len = (u16_t)(inseg.p->tot_len - off);
|
|
800ab1a: 4b0b ldr r3, [pc, #44] ; (800ab48 <tcp_receive+0x5ec>)
|
|
800ab1c: 685b ldr r3, [r3, #4]
|
|
800ab1e: 891a ldrh r2, [r3, #8]
|
|
800ab20: f8b7 3042 ldrh.w r3, [r7, #66] ; 0x42
|
|
800ab24: 1ad3 subs r3, r2, r3
|
|
800ab26: 847b strh r3, [r7, #34] ; 0x22
|
|
while (p->len < off) {
|
|
800ab28: e02a b.n 800ab80 <tcp_receive+0x624>
|
|
800ab2a: bf00 nop
|
|
800ab2c: 08013500 .word 0x08013500
|
|
800ab30: 08013508 .word 0x08013508
|
|
800ab34: 24007bb0 .word 0x24007bb0
|
|
800ab38: 24007bac .word 0x24007bac
|
|
800ab3c: 24007b6c .word 0x24007b6c
|
|
800ab40: 24007bb2 .word 0x24007bb2
|
|
800ab44: 24007ba8 .word 0x24007ba8
|
|
800ab48: 24007b84 .word 0x24007b84
|
|
800ab4c: 08013198 .word 0x08013198
|
|
800ab50: 08013510 .word 0x08013510
|
|
800ab54: 080131e4 .word 0x080131e4
|
|
800ab58: 08013520 .word 0x08013520
|
|
800ab5c: 08013530 .word 0x08013530
|
|
off -= p->len;
|
|
800ab60: 6c7b ldr r3, [r7, #68] ; 0x44
|
|
800ab62: 895b ldrh r3, [r3, #10]
|
|
800ab64: f8b7 2042 ldrh.w r2, [r7, #66] ; 0x42
|
|
800ab68: 1ad3 subs r3, r2, r3
|
|
800ab6a: f8a7 3042 strh.w r3, [r7, #66] ; 0x42
|
|
/* all pbufs up to and including this one have len==0, so tot_len is equal */
|
|
p->tot_len = new_tot_len;
|
|
800ab6e: 6c7b ldr r3, [r7, #68] ; 0x44
|
|
800ab70: 8c7a ldrh r2, [r7, #34] ; 0x22
|
|
800ab72: 811a strh r2, [r3, #8]
|
|
p->len = 0;
|
|
800ab74: 6c7b ldr r3, [r7, #68] ; 0x44
|
|
800ab76: 2200 movs r2, #0
|
|
800ab78: 815a strh r2, [r3, #10]
|
|
p = p->next;
|
|
800ab7a: 6c7b ldr r3, [r7, #68] ; 0x44
|
|
800ab7c: 681b ldr r3, [r3, #0]
|
|
800ab7e: 647b str r3, [r7, #68] ; 0x44
|
|
while (p->len < off) {
|
|
800ab80: 6c7b ldr r3, [r7, #68] ; 0x44
|
|
800ab82: 895b ldrh r3, [r3, #10]
|
|
800ab84: f8b7 2042 ldrh.w r2, [r7, #66] ; 0x42
|
|
800ab88: 429a cmp r2, r3
|
|
800ab8a: d8e9 bhi.n 800ab60 <tcp_receive+0x604>
|
|
}
|
|
/* cannot fail... */
|
|
pbuf_remove_header(p, off);
|
|
800ab8c: f8b7 3042 ldrh.w r3, [r7, #66] ; 0x42
|
|
800ab90: 4619 mov r1, r3
|
|
800ab92: 6c78 ldr r0, [r7, #68] ; 0x44
|
|
800ab94: f7fc f998 bl 8006ec8 <pbuf_remove_header>
|
|
inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
|
|
800ab98: 687b ldr r3, [r7, #4]
|
|
800ab9a: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800ab9c: 4a91 ldr r2, [pc, #580] ; (800ade4 <tcp_receive+0x888>)
|
|
800ab9e: 6013 str r3, [r2, #0]
|
|
800aba0: 4b91 ldr r3, [pc, #580] ; (800ade8 <tcp_receive+0x88c>)
|
|
800aba2: 691b ldr r3, [r3, #16]
|
|
800aba4: 4a8f ldr r2, [pc, #572] ; (800ade4 <tcp_receive+0x888>)
|
|
800aba6: 6812 ldr r2, [r2, #0]
|
|
800aba8: 605a str r2, [r3, #4]
|
|
if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)) {
|
|
800abaa: e00d b.n 800abc8 <tcp_receive+0x66c>
|
|
} else {
|
|
if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) {
|
|
800abac: 4b8d ldr r3, [pc, #564] ; (800ade4 <tcp_receive+0x888>)
|
|
800abae: 681a ldr r2, [r3, #0]
|
|
800abb0: 687b ldr r3, [r7, #4]
|
|
800abb2: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800abb4: 1ad3 subs r3, r2, r3
|
|
800abb6: 2b00 cmp r3, #0
|
|
800abb8: da06 bge.n 800abc8 <tcp_receive+0x66c>
|
|
/* the whole segment is < rcv_nxt */
|
|
/* must be a duplicate of a packet that has already been correctly handled */
|
|
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno));
|
|
tcp_ack_now(pcb);
|
|
800abba: 687b ldr r3, [r7, #4]
|
|
800abbc: 8b5b ldrh r3, [r3, #26]
|
|
800abbe: f043 0302 orr.w r3, r3, #2
|
|
800abc2: b29a uxth r2, r3
|
|
800abc4: 687b ldr r3, [r7, #4]
|
|
800abc6: 835a strh r2, [r3, #26]
|
|
}
|
|
|
|
/* The sequence number must be within the window (above rcv_nxt
|
|
and below rcv_nxt + rcv_wnd) in order to be further
|
|
processed. */
|
|
if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
|
|
800abc8: 4b86 ldr r3, [pc, #536] ; (800ade4 <tcp_receive+0x888>)
|
|
800abca: 681a ldr r2, [r3, #0]
|
|
800abcc: 687b ldr r3, [r7, #4]
|
|
800abce: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800abd0: 1ad3 subs r3, r2, r3
|
|
800abd2: 2b00 cmp r3, #0
|
|
800abd4: f2c0 842a blt.w 800b42c <tcp_receive+0xed0>
|
|
800abd8: 4b82 ldr r3, [pc, #520] ; (800ade4 <tcp_receive+0x888>)
|
|
800abda: 681a ldr r2, [r3, #0]
|
|
800abdc: 687b ldr r3, [r7, #4]
|
|
800abde: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800abe0: 6879 ldr r1, [r7, #4]
|
|
800abe2: 8d09 ldrh r1, [r1, #40] ; 0x28
|
|
800abe4: 440b add r3, r1
|
|
800abe6: 1ad3 subs r3, r2, r3
|
|
800abe8: 3301 adds r3, #1
|
|
800abea: 2b00 cmp r3, #0
|
|
800abec: f300 841e bgt.w 800b42c <tcp_receive+0xed0>
|
|
pcb->rcv_nxt + pcb->rcv_wnd - 1)) {
|
|
if (pcb->rcv_nxt == seqno) {
|
|
800abf0: 687b ldr r3, [r7, #4]
|
|
800abf2: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
800abf4: 4b7b ldr r3, [pc, #492] ; (800ade4 <tcp_receive+0x888>)
|
|
800abf6: 681b ldr r3, [r3, #0]
|
|
800abf8: 429a cmp r2, r3
|
|
800abfa: f040 829a bne.w 800b132 <tcp_receive+0xbd6>
|
|
/* The incoming segment is the next in sequence. We check if
|
|
we have to trim the end of the segment and update rcv_nxt
|
|
and pass the data to the application. */
|
|
tcplen = TCP_TCPLEN(&inseg);
|
|
800abfe: 4b7a ldr r3, [pc, #488] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ac00: 891c ldrh r4, [r3, #8]
|
|
800ac02: 4b79 ldr r3, [pc, #484] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ac04: 691b ldr r3, [r3, #16]
|
|
800ac06: 899b ldrh r3, [r3, #12]
|
|
800ac08: b29b uxth r3, r3
|
|
800ac0a: 4618 mov r0, r3
|
|
800ac0c: f7fa fc9e bl 800554c <lwip_htons>
|
|
800ac10: 4603 mov r3, r0
|
|
800ac12: b2db uxtb r3, r3
|
|
800ac14: f003 0303 and.w r3, r3, #3
|
|
800ac18: 2b00 cmp r3, #0
|
|
800ac1a: d001 beq.n 800ac20 <tcp_receive+0x6c4>
|
|
800ac1c: 2301 movs r3, #1
|
|
800ac1e: e000 b.n 800ac22 <tcp_receive+0x6c6>
|
|
800ac20: 2300 movs r3, #0
|
|
800ac22: 4423 add r3, r4
|
|
800ac24: b29a uxth r2, r3
|
|
800ac26: 4b71 ldr r3, [pc, #452] ; (800adec <tcp_receive+0x890>)
|
|
800ac28: 801a strh r2, [r3, #0]
|
|
|
|
if (tcplen > pcb->rcv_wnd) {
|
|
800ac2a: 687b ldr r3, [r7, #4]
|
|
800ac2c: 8d1a ldrh r2, [r3, #40] ; 0x28
|
|
800ac2e: 4b6f ldr r3, [pc, #444] ; (800adec <tcp_receive+0x890>)
|
|
800ac30: 881b ldrh r3, [r3, #0]
|
|
800ac32: 429a cmp r2, r3
|
|
800ac34: d275 bcs.n 800ad22 <tcp_receive+0x7c6>
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG,
|
|
("tcp_receive: other end overran receive window"
|
|
"seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n",
|
|
seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
|
|
if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
|
|
800ac36: 4b6c ldr r3, [pc, #432] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ac38: 691b ldr r3, [r3, #16]
|
|
800ac3a: 899b ldrh r3, [r3, #12]
|
|
800ac3c: b29b uxth r3, r3
|
|
800ac3e: 4618 mov r0, r3
|
|
800ac40: f7fa fc84 bl 800554c <lwip_htons>
|
|
800ac44: 4603 mov r3, r0
|
|
800ac46: b2db uxtb r3, r3
|
|
800ac48: f003 0301 and.w r3, r3, #1
|
|
800ac4c: 2b00 cmp r3, #0
|
|
800ac4e: d01f beq.n 800ac90 <tcp_receive+0x734>
|
|
/* Must remove the FIN from the header as we're trimming
|
|
* that byte of sequence-space from the packet */
|
|
TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) & ~(unsigned int)TCP_FIN);
|
|
800ac50: 4b65 ldr r3, [pc, #404] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ac52: 691b ldr r3, [r3, #16]
|
|
800ac54: 899b ldrh r3, [r3, #12]
|
|
800ac56: b29b uxth r3, r3
|
|
800ac58: b21b sxth r3, r3
|
|
800ac5a: f423 537c bic.w r3, r3, #16128 ; 0x3f00
|
|
800ac5e: b21c sxth r4, r3
|
|
800ac60: 4b61 ldr r3, [pc, #388] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ac62: 691b ldr r3, [r3, #16]
|
|
800ac64: 899b ldrh r3, [r3, #12]
|
|
800ac66: b29b uxth r3, r3
|
|
800ac68: 4618 mov r0, r3
|
|
800ac6a: f7fa fc6f bl 800554c <lwip_htons>
|
|
800ac6e: 4603 mov r3, r0
|
|
800ac70: b2db uxtb r3, r3
|
|
800ac72: b29b uxth r3, r3
|
|
800ac74: f003 033e and.w r3, r3, #62 ; 0x3e
|
|
800ac78: b29b uxth r3, r3
|
|
800ac7a: 4618 mov r0, r3
|
|
800ac7c: f7fa fc66 bl 800554c <lwip_htons>
|
|
800ac80: 4603 mov r3, r0
|
|
800ac82: b21b sxth r3, r3
|
|
800ac84: 4323 orrs r3, r4
|
|
800ac86: b21a sxth r2, r3
|
|
800ac88: 4b57 ldr r3, [pc, #348] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ac8a: 691b ldr r3, [r3, #16]
|
|
800ac8c: b292 uxth r2, r2
|
|
800ac8e: 819a strh r2, [r3, #12]
|
|
}
|
|
/* Adjust length of segment to fit in the window. */
|
|
TCPWND_CHECK16(pcb->rcv_wnd);
|
|
inseg.len = (u16_t)pcb->rcv_wnd;
|
|
800ac90: 687b ldr r3, [r7, #4]
|
|
800ac92: 8d1a ldrh r2, [r3, #40] ; 0x28
|
|
800ac94: 4b54 ldr r3, [pc, #336] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ac96: 811a strh r2, [r3, #8]
|
|
if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
|
|
800ac98: 4b53 ldr r3, [pc, #332] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ac9a: 691b ldr r3, [r3, #16]
|
|
800ac9c: 899b ldrh r3, [r3, #12]
|
|
800ac9e: b29b uxth r3, r3
|
|
800aca0: 4618 mov r0, r3
|
|
800aca2: f7fa fc53 bl 800554c <lwip_htons>
|
|
800aca6: 4603 mov r3, r0
|
|
800aca8: b2db uxtb r3, r3
|
|
800acaa: f003 0302 and.w r3, r3, #2
|
|
800acae: 2b00 cmp r3, #0
|
|
800acb0: d005 beq.n 800acbe <tcp_receive+0x762>
|
|
inseg.len -= 1;
|
|
800acb2: 4b4d ldr r3, [pc, #308] ; (800ade8 <tcp_receive+0x88c>)
|
|
800acb4: 891b ldrh r3, [r3, #8]
|
|
800acb6: 3b01 subs r3, #1
|
|
800acb8: b29a uxth r2, r3
|
|
800acba: 4b4b ldr r3, [pc, #300] ; (800ade8 <tcp_receive+0x88c>)
|
|
800acbc: 811a strh r2, [r3, #8]
|
|
}
|
|
pbuf_realloc(inseg.p, inseg.len);
|
|
800acbe: 4b4a ldr r3, [pc, #296] ; (800ade8 <tcp_receive+0x88c>)
|
|
800acc0: 685b ldr r3, [r3, #4]
|
|
800acc2: 4a49 ldr r2, [pc, #292] ; (800ade8 <tcp_receive+0x88c>)
|
|
800acc4: 8912 ldrh r2, [r2, #8]
|
|
800acc6: 4611 mov r1, r2
|
|
800acc8: 4618 mov r0, r3
|
|
800acca: f7fb fffd bl 8006cc8 <pbuf_realloc>
|
|
tcplen = TCP_TCPLEN(&inseg);
|
|
800acce: 4b46 ldr r3, [pc, #280] ; (800ade8 <tcp_receive+0x88c>)
|
|
800acd0: 891c ldrh r4, [r3, #8]
|
|
800acd2: 4b45 ldr r3, [pc, #276] ; (800ade8 <tcp_receive+0x88c>)
|
|
800acd4: 691b ldr r3, [r3, #16]
|
|
800acd6: 899b ldrh r3, [r3, #12]
|
|
800acd8: b29b uxth r3, r3
|
|
800acda: 4618 mov r0, r3
|
|
800acdc: f7fa fc36 bl 800554c <lwip_htons>
|
|
800ace0: 4603 mov r3, r0
|
|
800ace2: b2db uxtb r3, r3
|
|
800ace4: f003 0303 and.w r3, r3, #3
|
|
800ace8: 2b00 cmp r3, #0
|
|
800acea: d001 beq.n 800acf0 <tcp_receive+0x794>
|
|
800acec: 2301 movs r3, #1
|
|
800acee: e000 b.n 800acf2 <tcp_receive+0x796>
|
|
800acf0: 2300 movs r3, #0
|
|
800acf2: 4423 add r3, r4
|
|
800acf4: b29a uxth r2, r3
|
|
800acf6: 4b3d ldr r3, [pc, #244] ; (800adec <tcp_receive+0x890>)
|
|
800acf8: 801a strh r2, [r3, #0]
|
|
LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n",
|
|
800acfa: 4b3c ldr r3, [pc, #240] ; (800adec <tcp_receive+0x890>)
|
|
800acfc: 881b ldrh r3, [r3, #0]
|
|
800acfe: 461a mov r2, r3
|
|
800ad00: 4b38 ldr r3, [pc, #224] ; (800ade4 <tcp_receive+0x888>)
|
|
800ad02: 681b ldr r3, [r3, #0]
|
|
800ad04: 441a add r2, r3
|
|
800ad06: 687b ldr r3, [r7, #4]
|
|
800ad08: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800ad0a: 6879 ldr r1, [r7, #4]
|
|
800ad0c: 8d09 ldrh r1, [r1, #40] ; 0x28
|
|
800ad0e: 440b add r3, r1
|
|
800ad10: 429a cmp r2, r3
|
|
800ad12: d006 beq.n 800ad22 <tcp_receive+0x7c6>
|
|
800ad14: 4b36 ldr r3, [pc, #216] ; (800adf0 <tcp_receive+0x894>)
|
|
800ad16: f240 52cb movw r2, #1483 ; 0x5cb
|
|
800ad1a: 4936 ldr r1, [pc, #216] ; (800adf4 <tcp_receive+0x898>)
|
|
800ad1c: 4836 ldr r0, [pc, #216] ; (800adf8 <tcp_receive+0x89c>)
|
|
800ad1e: f005 ff53 bl 8010bc8 <iprintf>
|
|
}
|
|
#if TCP_QUEUE_OOSEQ
|
|
/* Received in-sequence data, adjust ooseq data if:
|
|
- FIN has been received or
|
|
- inseq overlaps with ooseq */
|
|
if (pcb->ooseq != NULL) {
|
|
800ad22: 687b ldr r3, [r7, #4]
|
|
800ad24: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800ad26: 2b00 cmp r3, #0
|
|
800ad28: f000 80e7 beq.w 800aefa <tcp_receive+0x99e>
|
|
if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
|
|
800ad2c: 4b2e ldr r3, [pc, #184] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ad2e: 691b ldr r3, [r3, #16]
|
|
800ad30: 899b ldrh r3, [r3, #12]
|
|
800ad32: b29b uxth r3, r3
|
|
800ad34: 4618 mov r0, r3
|
|
800ad36: f7fa fc09 bl 800554c <lwip_htons>
|
|
800ad3a: 4603 mov r3, r0
|
|
800ad3c: b2db uxtb r3, r3
|
|
800ad3e: f003 0301 and.w r3, r3, #1
|
|
800ad42: 2b00 cmp r3, #0
|
|
800ad44: d010 beq.n 800ad68 <tcp_receive+0x80c>
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG,
|
|
("tcp_receive: received in-order FIN, binning ooseq queue\n"));
|
|
/* Received in-order FIN means anything that was received
|
|
* out of order must now have been received in-order, so
|
|
* bin the ooseq queue */
|
|
while (pcb->ooseq != NULL) {
|
|
800ad46: e00a b.n 800ad5e <tcp_receive+0x802>
|
|
struct tcp_seg *old_ooseq = pcb->ooseq;
|
|
800ad48: 687b ldr r3, [r7, #4]
|
|
800ad4a: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800ad4c: 60fb str r3, [r7, #12]
|
|
pcb->ooseq = pcb->ooseq->next;
|
|
800ad4e: 687b ldr r3, [r7, #4]
|
|
800ad50: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800ad52: 681a ldr r2, [r3, #0]
|
|
800ad54: 687b ldr r3, [r7, #4]
|
|
800ad56: 675a str r2, [r3, #116] ; 0x74
|
|
tcp_seg_free(old_ooseq);
|
|
800ad58: 68f8 ldr r0, [r7, #12]
|
|
800ad5a: f7fd fd0c bl 8008776 <tcp_seg_free>
|
|
while (pcb->ooseq != NULL) {
|
|
800ad5e: 687b ldr r3, [r7, #4]
|
|
800ad60: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800ad62: 2b00 cmp r3, #0
|
|
800ad64: d1f0 bne.n 800ad48 <tcp_receive+0x7ec>
|
|
800ad66: e0c8 b.n 800aefa <tcp_receive+0x99e>
|
|
}
|
|
} else {
|
|
struct tcp_seg *next = pcb->ooseq;
|
|
800ad68: 687b ldr r3, [r7, #4]
|
|
800ad6a: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800ad6c: 63fb str r3, [r7, #60] ; 0x3c
|
|
/* Remove all segments on ooseq that are covered by inseg already.
|
|
* FIN is copied from ooseq to inseg if present. */
|
|
while (next &&
|
|
800ad6e: e052 b.n 800ae16 <tcp_receive+0x8ba>
|
|
TCP_SEQ_GEQ(seqno + tcplen,
|
|
next->tcphdr->seqno + next->len)) {
|
|
struct tcp_seg *tmp;
|
|
/* inseg cannot have FIN here (already processed above) */
|
|
if ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0 &&
|
|
800ad70: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800ad72: 691b ldr r3, [r3, #16]
|
|
800ad74: 899b ldrh r3, [r3, #12]
|
|
800ad76: b29b uxth r3, r3
|
|
800ad78: 4618 mov r0, r3
|
|
800ad7a: f7fa fbe7 bl 800554c <lwip_htons>
|
|
800ad7e: 4603 mov r3, r0
|
|
800ad80: b2db uxtb r3, r3
|
|
800ad82: f003 0301 and.w r3, r3, #1
|
|
800ad86: 2b00 cmp r3, #0
|
|
800ad88: d03d beq.n 800ae06 <tcp_receive+0x8aa>
|
|
(TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) {
|
|
800ad8a: 4b17 ldr r3, [pc, #92] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ad8c: 691b ldr r3, [r3, #16]
|
|
800ad8e: 899b ldrh r3, [r3, #12]
|
|
800ad90: b29b uxth r3, r3
|
|
800ad92: 4618 mov r0, r3
|
|
800ad94: f7fa fbda bl 800554c <lwip_htons>
|
|
800ad98: 4603 mov r3, r0
|
|
800ad9a: b2db uxtb r3, r3
|
|
800ad9c: f003 0302 and.w r3, r3, #2
|
|
if ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0 &&
|
|
800ada0: 2b00 cmp r3, #0
|
|
800ada2: d130 bne.n 800ae06 <tcp_receive+0x8aa>
|
|
TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN);
|
|
800ada4: 4b10 ldr r3, [pc, #64] ; (800ade8 <tcp_receive+0x88c>)
|
|
800ada6: 691b ldr r3, [r3, #16]
|
|
800ada8: 899b ldrh r3, [r3, #12]
|
|
800adaa: b29c uxth r4, r3
|
|
800adac: 2001 movs r0, #1
|
|
800adae: f7fa fbcd bl 800554c <lwip_htons>
|
|
800adb2: 4603 mov r3, r0
|
|
800adb4: 461a mov r2, r3
|
|
800adb6: 4b0c ldr r3, [pc, #48] ; (800ade8 <tcp_receive+0x88c>)
|
|
800adb8: 691b ldr r3, [r3, #16]
|
|
800adba: 4322 orrs r2, r4
|
|
800adbc: b292 uxth r2, r2
|
|
800adbe: 819a strh r2, [r3, #12]
|
|
tcplen = TCP_TCPLEN(&inseg);
|
|
800adc0: 4b09 ldr r3, [pc, #36] ; (800ade8 <tcp_receive+0x88c>)
|
|
800adc2: 891c ldrh r4, [r3, #8]
|
|
800adc4: 4b08 ldr r3, [pc, #32] ; (800ade8 <tcp_receive+0x88c>)
|
|
800adc6: 691b ldr r3, [r3, #16]
|
|
800adc8: 899b ldrh r3, [r3, #12]
|
|
800adca: b29b uxth r3, r3
|
|
800adcc: 4618 mov r0, r3
|
|
800adce: f7fa fbbd bl 800554c <lwip_htons>
|
|
800add2: 4603 mov r3, r0
|
|
800add4: b2db uxtb r3, r3
|
|
800add6: f003 0303 and.w r3, r3, #3
|
|
800adda: 2b00 cmp r3, #0
|
|
800addc: d00e beq.n 800adfc <tcp_receive+0x8a0>
|
|
800adde: 2301 movs r3, #1
|
|
800ade0: e00d b.n 800adfe <tcp_receive+0x8a2>
|
|
800ade2: bf00 nop
|
|
800ade4: 24007ba8 .word 0x24007ba8
|
|
800ade8: 24007b84 .word 0x24007b84
|
|
800adec: 24007bb2 .word 0x24007bb2
|
|
800adf0: 08013198 .word 0x08013198
|
|
800adf4: 08013540 .word 0x08013540
|
|
800adf8: 080131e4 .word 0x080131e4
|
|
800adfc: 2300 movs r3, #0
|
|
800adfe: 4423 add r3, r4
|
|
800ae00: b29a uxth r2, r3
|
|
800ae02: 4b98 ldr r3, [pc, #608] ; (800b064 <tcp_receive+0xb08>)
|
|
800ae04: 801a strh r2, [r3, #0]
|
|
}
|
|
tmp = next;
|
|
800ae06: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800ae08: 613b str r3, [r7, #16]
|
|
next = next->next;
|
|
800ae0a: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800ae0c: 681b ldr r3, [r3, #0]
|
|
800ae0e: 63fb str r3, [r7, #60] ; 0x3c
|
|
tcp_seg_free(tmp);
|
|
800ae10: 6938 ldr r0, [r7, #16]
|
|
800ae12: f7fd fcb0 bl 8008776 <tcp_seg_free>
|
|
while (next &&
|
|
800ae16: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800ae18: 2b00 cmp r3, #0
|
|
800ae1a: d00e beq.n 800ae3a <tcp_receive+0x8de>
|
|
TCP_SEQ_GEQ(seqno + tcplen,
|
|
800ae1c: 4b91 ldr r3, [pc, #580] ; (800b064 <tcp_receive+0xb08>)
|
|
800ae1e: 881b ldrh r3, [r3, #0]
|
|
800ae20: 461a mov r2, r3
|
|
800ae22: 4b91 ldr r3, [pc, #580] ; (800b068 <tcp_receive+0xb0c>)
|
|
800ae24: 681b ldr r3, [r3, #0]
|
|
800ae26: 441a add r2, r3
|
|
800ae28: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800ae2a: 691b ldr r3, [r3, #16]
|
|
800ae2c: 685b ldr r3, [r3, #4]
|
|
800ae2e: 6bf9 ldr r1, [r7, #60] ; 0x3c
|
|
800ae30: 8909 ldrh r1, [r1, #8]
|
|
800ae32: 440b add r3, r1
|
|
800ae34: 1ad3 subs r3, r2, r3
|
|
while (next &&
|
|
800ae36: 2b00 cmp r3, #0
|
|
800ae38: da9a bge.n 800ad70 <tcp_receive+0x814>
|
|
}
|
|
/* Now trim right side of inseg if it overlaps with the first
|
|
* segment on ooseq */
|
|
if (next &&
|
|
800ae3a: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800ae3c: 2b00 cmp r3, #0
|
|
800ae3e: d059 beq.n 800aef4 <tcp_receive+0x998>
|
|
TCP_SEQ_GT(seqno + tcplen,
|
|
800ae40: 4b88 ldr r3, [pc, #544] ; (800b064 <tcp_receive+0xb08>)
|
|
800ae42: 881b ldrh r3, [r3, #0]
|
|
800ae44: 461a mov r2, r3
|
|
800ae46: 4b88 ldr r3, [pc, #544] ; (800b068 <tcp_receive+0xb0c>)
|
|
800ae48: 681b ldr r3, [r3, #0]
|
|
800ae4a: 441a add r2, r3
|
|
800ae4c: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800ae4e: 691b ldr r3, [r3, #16]
|
|
800ae50: 685b ldr r3, [r3, #4]
|
|
800ae52: 1ad3 subs r3, r2, r3
|
|
if (next &&
|
|
800ae54: 2b00 cmp r3, #0
|
|
800ae56: dd4d ble.n 800aef4 <tcp_receive+0x998>
|
|
next->tcphdr->seqno)) {
|
|
/* inseg cannot have FIN here (already processed above) */
|
|
inseg.len = (u16_t)(next->tcphdr->seqno - seqno);
|
|
800ae58: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800ae5a: 691b ldr r3, [r3, #16]
|
|
800ae5c: 685b ldr r3, [r3, #4]
|
|
800ae5e: b29a uxth r2, r3
|
|
800ae60: 4b81 ldr r3, [pc, #516] ; (800b068 <tcp_receive+0xb0c>)
|
|
800ae62: 681b ldr r3, [r3, #0]
|
|
800ae64: b29b uxth r3, r3
|
|
800ae66: 1ad3 subs r3, r2, r3
|
|
800ae68: b29a uxth r2, r3
|
|
800ae6a: 4b80 ldr r3, [pc, #512] ; (800b06c <tcp_receive+0xb10>)
|
|
800ae6c: 811a strh r2, [r3, #8]
|
|
if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
|
|
800ae6e: 4b7f ldr r3, [pc, #508] ; (800b06c <tcp_receive+0xb10>)
|
|
800ae70: 691b ldr r3, [r3, #16]
|
|
800ae72: 899b ldrh r3, [r3, #12]
|
|
800ae74: b29b uxth r3, r3
|
|
800ae76: 4618 mov r0, r3
|
|
800ae78: f7fa fb68 bl 800554c <lwip_htons>
|
|
800ae7c: 4603 mov r3, r0
|
|
800ae7e: b2db uxtb r3, r3
|
|
800ae80: f003 0302 and.w r3, r3, #2
|
|
800ae84: 2b00 cmp r3, #0
|
|
800ae86: d005 beq.n 800ae94 <tcp_receive+0x938>
|
|
inseg.len -= 1;
|
|
800ae88: 4b78 ldr r3, [pc, #480] ; (800b06c <tcp_receive+0xb10>)
|
|
800ae8a: 891b ldrh r3, [r3, #8]
|
|
800ae8c: 3b01 subs r3, #1
|
|
800ae8e: b29a uxth r2, r3
|
|
800ae90: 4b76 ldr r3, [pc, #472] ; (800b06c <tcp_receive+0xb10>)
|
|
800ae92: 811a strh r2, [r3, #8]
|
|
}
|
|
pbuf_realloc(inseg.p, inseg.len);
|
|
800ae94: 4b75 ldr r3, [pc, #468] ; (800b06c <tcp_receive+0xb10>)
|
|
800ae96: 685b ldr r3, [r3, #4]
|
|
800ae98: 4a74 ldr r2, [pc, #464] ; (800b06c <tcp_receive+0xb10>)
|
|
800ae9a: 8912 ldrh r2, [r2, #8]
|
|
800ae9c: 4611 mov r1, r2
|
|
800ae9e: 4618 mov r0, r3
|
|
800aea0: f7fb ff12 bl 8006cc8 <pbuf_realloc>
|
|
tcplen = TCP_TCPLEN(&inseg);
|
|
800aea4: 4b71 ldr r3, [pc, #452] ; (800b06c <tcp_receive+0xb10>)
|
|
800aea6: 891c ldrh r4, [r3, #8]
|
|
800aea8: 4b70 ldr r3, [pc, #448] ; (800b06c <tcp_receive+0xb10>)
|
|
800aeaa: 691b ldr r3, [r3, #16]
|
|
800aeac: 899b ldrh r3, [r3, #12]
|
|
800aeae: b29b uxth r3, r3
|
|
800aeb0: 4618 mov r0, r3
|
|
800aeb2: f7fa fb4b bl 800554c <lwip_htons>
|
|
800aeb6: 4603 mov r3, r0
|
|
800aeb8: b2db uxtb r3, r3
|
|
800aeba: f003 0303 and.w r3, r3, #3
|
|
800aebe: 2b00 cmp r3, #0
|
|
800aec0: d001 beq.n 800aec6 <tcp_receive+0x96a>
|
|
800aec2: 2301 movs r3, #1
|
|
800aec4: e000 b.n 800aec8 <tcp_receive+0x96c>
|
|
800aec6: 2300 movs r3, #0
|
|
800aec8: 4423 add r3, r4
|
|
800aeca: b29a uxth r2, r3
|
|
800aecc: 4b65 ldr r3, [pc, #404] ; (800b064 <tcp_receive+0xb08>)
|
|
800aece: 801a strh r2, [r3, #0]
|
|
LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue\n",
|
|
800aed0: 4b64 ldr r3, [pc, #400] ; (800b064 <tcp_receive+0xb08>)
|
|
800aed2: 881b ldrh r3, [r3, #0]
|
|
800aed4: 461a mov r2, r3
|
|
800aed6: 4b64 ldr r3, [pc, #400] ; (800b068 <tcp_receive+0xb0c>)
|
|
800aed8: 681b ldr r3, [r3, #0]
|
|
800aeda: 441a add r2, r3
|
|
800aedc: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800aede: 691b ldr r3, [r3, #16]
|
|
800aee0: 685b ldr r3, [r3, #4]
|
|
800aee2: 429a cmp r2, r3
|
|
800aee4: d006 beq.n 800aef4 <tcp_receive+0x998>
|
|
800aee6: 4b62 ldr r3, [pc, #392] ; (800b070 <tcp_receive+0xb14>)
|
|
800aee8: f240 52fc movw r2, #1532 ; 0x5fc
|
|
800aeec: 4961 ldr r1, [pc, #388] ; (800b074 <tcp_receive+0xb18>)
|
|
800aeee: 4862 ldr r0, [pc, #392] ; (800b078 <tcp_receive+0xb1c>)
|
|
800aef0: f005 fe6a bl 8010bc8 <iprintf>
|
|
(seqno + tcplen) == next->tcphdr->seqno);
|
|
}
|
|
pcb->ooseq = next;
|
|
800aef4: 687b ldr r3, [r7, #4]
|
|
800aef6: 6bfa ldr r2, [r7, #60] ; 0x3c
|
|
800aef8: 675a str r2, [r3, #116] ; 0x74
|
|
}
|
|
}
|
|
#endif /* TCP_QUEUE_OOSEQ */
|
|
|
|
pcb->rcv_nxt = seqno + tcplen;
|
|
800aefa: 4b5a ldr r3, [pc, #360] ; (800b064 <tcp_receive+0xb08>)
|
|
800aefc: 881b ldrh r3, [r3, #0]
|
|
800aefe: 461a mov r2, r3
|
|
800af00: 4b59 ldr r3, [pc, #356] ; (800b068 <tcp_receive+0xb0c>)
|
|
800af02: 681b ldr r3, [r3, #0]
|
|
800af04: 441a add r2, r3
|
|
800af06: 687b ldr r3, [r7, #4]
|
|
800af08: 625a str r2, [r3, #36] ; 0x24
|
|
|
|
/* Update the receiver's (our) window. */
|
|
LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen);
|
|
800af0a: 687b ldr r3, [r7, #4]
|
|
800af0c: 8d1a ldrh r2, [r3, #40] ; 0x28
|
|
800af0e: 4b55 ldr r3, [pc, #340] ; (800b064 <tcp_receive+0xb08>)
|
|
800af10: 881b ldrh r3, [r3, #0]
|
|
800af12: 429a cmp r2, r3
|
|
800af14: d206 bcs.n 800af24 <tcp_receive+0x9c8>
|
|
800af16: 4b56 ldr r3, [pc, #344] ; (800b070 <tcp_receive+0xb14>)
|
|
800af18: f240 6207 movw r2, #1543 ; 0x607
|
|
800af1c: 4957 ldr r1, [pc, #348] ; (800b07c <tcp_receive+0xb20>)
|
|
800af1e: 4856 ldr r0, [pc, #344] ; (800b078 <tcp_receive+0xb1c>)
|
|
800af20: f005 fe52 bl 8010bc8 <iprintf>
|
|
pcb->rcv_wnd -= tcplen;
|
|
800af24: 687b ldr r3, [r7, #4]
|
|
800af26: 8d1a ldrh r2, [r3, #40] ; 0x28
|
|
800af28: 4b4e ldr r3, [pc, #312] ; (800b064 <tcp_receive+0xb08>)
|
|
800af2a: 881b ldrh r3, [r3, #0]
|
|
800af2c: 1ad3 subs r3, r2, r3
|
|
800af2e: b29a uxth r2, r3
|
|
800af30: 687b ldr r3, [r7, #4]
|
|
800af32: 851a strh r2, [r3, #40] ; 0x28
|
|
|
|
tcp_update_rcv_ann_wnd(pcb);
|
|
800af34: 6878 ldr r0, [r7, #4]
|
|
800af36: f7fc fde1 bl 8007afc <tcp_update_rcv_ann_wnd>
|
|
chains its data on this pbuf as well.
|
|
|
|
If the segment was a FIN, we set the TF_GOT_FIN flag that will
|
|
be used to indicate to the application that the remote side has
|
|
closed its end of the connection. */
|
|
if (inseg.p->tot_len > 0) {
|
|
800af3a: 4b4c ldr r3, [pc, #304] ; (800b06c <tcp_receive+0xb10>)
|
|
800af3c: 685b ldr r3, [r3, #4]
|
|
800af3e: 891b ldrh r3, [r3, #8]
|
|
800af40: 2b00 cmp r3, #0
|
|
800af42: d006 beq.n 800af52 <tcp_receive+0x9f6>
|
|
recv_data = inseg.p;
|
|
800af44: 4b49 ldr r3, [pc, #292] ; (800b06c <tcp_receive+0xb10>)
|
|
800af46: 685b ldr r3, [r3, #4]
|
|
800af48: 4a4d ldr r2, [pc, #308] ; (800b080 <tcp_receive+0xb24>)
|
|
800af4a: 6013 str r3, [r2, #0]
|
|
/* Since this pbuf now is the responsibility of the
|
|
application, we delete our reference to it so that we won't
|
|
(mistakingly) deallocate it. */
|
|
inseg.p = NULL;
|
|
800af4c: 4b47 ldr r3, [pc, #284] ; (800b06c <tcp_receive+0xb10>)
|
|
800af4e: 2200 movs r2, #0
|
|
800af50: 605a str r2, [r3, #4]
|
|
}
|
|
if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
|
|
800af52: 4b46 ldr r3, [pc, #280] ; (800b06c <tcp_receive+0xb10>)
|
|
800af54: 691b ldr r3, [r3, #16]
|
|
800af56: 899b ldrh r3, [r3, #12]
|
|
800af58: b29b uxth r3, r3
|
|
800af5a: 4618 mov r0, r3
|
|
800af5c: f7fa faf6 bl 800554c <lwip_htons>
|
|
800af60: 4603 mov r3, r0
|
|
800af62: b2db uxtb r3, r3
|
|
800af64: f003 0301 and.w r3, r3, #1
|
|
800af68: 2b00 cmp r3, #0
|
|
800af6a: f000 80b8 beq.w 800b0de <tcp_receive+0xb82>
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n"));
|
|
recv_flags |= TF_GOT_FIN;
|
|
800af6e: 4b45 ldr r3, [pc, #276] ; (800b084 <tcp_receive+0xb28>)
|
|
800af70: 781b ldrb r3, [r3, #0]
|
|
800af72: f043 0320 orr.w r3, r3, #32
|
|
800af76: b2da uxtb r2, r3
|
|
800af78: 4b42 ldr r3, [pc, #264] ; (800b084 <tcp_receive+0xb28>)
|
|
800af7a: 701a strb r2, [r3, #0]
|
|
}
|
|
|
|
#if TCP_QUEUE_OOSEQ
|
|
/* We now check if we have segments on the ->ooseq queue that
|
|
are now in sequence. */
|
|
while (pcb->ooseq != NULL &&
|
|
800af7c: e0af b.n 800b0de <tcp_receive+0xb82>
|
|
pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {
|
|
|
|
struct tcp_seg *cseg = pcb->ooseq;
|
|
800af7e: 687b ldr r3, [r7, #4]
|
|
800af80: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800af82: 60bb str r3, [r7, #8]
|
|
seqno = pcb->ooseq->tcphdr->seqno;
|
|
800af84: 687b ldr r3, [r7, #4]
|
|
800af86: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800af88: 691b ldr r3, [r3, #16]
|
|
800af8a: 685b ldr r3, [r3, #4]
|
|
800af8c: 4a36 ldr r2, [pc, #216] ; (800b068 <tcp_receive+0xb0c>)
|
|
800af8e: 6013 str r3, [r2, #0]
|
|
|
|
pcb->rcv_nxt += TCP_TCPLEN(cseg);
|
|
800af90: 68bb ldr r3, [r7, #8]
|
|
800af92: 891b ldrh r3, [r3, #8]
|
|
800af94: 461c mov r4, r3
|
|
800af96: 68bb ldr r3, [r7, #8]
|
|
800af98: 691b ldr r3, [r3, #16]
|
|
800af9a: 899b ldrh r3, [r3, #12]
|
|
800af9c: b29b uxth r3, r3
|
|
800af9e: 4618 mov r0, r3
|
|
800afa0: f7fa fad4 bl 800554c <lwip_htons>
|
|
800afa4: 4603 mov r3, r0
|
|
800afa6: b2db uxtb r3, r3
|
|
800afa8: f003 0303 and.w r3, r3, #3
|
|
800afac: 2b00 cmp r3, #0
|
|
800afae: d001 beq.n 800afb4 <tcp_receive+0xa58>
|
|
800afb0: 2301 movs r3, #1
|
|
800afb2: e000 b.n 800afb6 <tcp_receive+0xa5a>
|
|
800afb4: 2300 movs r3, #0
|
|
800afb6: 191a adds r2, r3, r4
|
|
800afb8: 687b ldr r3, [r7, #4]
|
|
800afba: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800afbc: 441a add r2, r3
|
|
800afbe: 687b ldr r3, [r7, #4]
|
|
800afc0: 625a str r2, [r3, #36] ; 0x24
|
|
LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd\n",
|
|
800afc2: 687b ldr r3, [r7, #4]
|
|
800afc4: 8d1b ldrh r3, [r3, #40] ; 0x28
|
|
800afc6: 461c mov r4, r3
|
|
800afc8: 68bb ldr r3, [r7, #8]
|
|
800afca: 891b ldrh r3, [r3, #8]
|
|
800afcc: 461d mov r5, r3
|
|
800afce: 68bb ldr r3, [r7, #8]
|
|
800afd0: 691b ldr r3, [r3, #16]
|
|
800afd2: 899b ldrh r3, [r3, #12]
|
|
800afd4: b29b uxth r3, r3
|
|
800afd6: 4618 mov r0, r3
|
|
800afd8: f7fa fab8 bl 800554c <lwip_htons>
|
|
800afdc: 4603 mov r3, r0
|
|
800afde: b2db uxtb r3, r3
|
|
800afe0: f003 0303 and.w r3, r3, #3
|
|
800afe4: 2b00 cmp r3, #0
|
|
800afe6: d001 beq.n 800afec <tcp_receive+0xa90>
|
|
800afe8: 2301 movs r3, #1
|
|
800afea: e000 b.n 800afee <tcp_receive+0xa92>
|
|
800afec: 2300 movs r3, #0
|
|
800afee: 442b add r3, r5
|
|
800aff0: 429c cmp r4, r3
|
|
800aff2: d206 bcs.n 800b002 <tcp_receive+0xaa6>
|
|
800aff4: 4b1e ldr r3, [pc, #120] ; (800b070 <tcp_receive+0xb14>)
|
|
800aff6: f240 622b movw r2, #1579 ; 0x62b
|
|
800affa: 4923 ldr r1, [pc, #140] ; (800b088 <tcp_receive+0xb2c>)
|
|
800affc: 481e ldr r0, [pc, #120] ; (800b078 <tcp_receive+0xb1c>)
|
|
800affe: f005 fde3 bl 8010bc8 <iprintf>
|
|
pcb->rcv_wnd >= TCP_TCPLEN(cseg));
|
|
pcb->rcv_wnd -= TCP_TCPLEN(cseg);
|
|
800b002: 68bb ldr r3, [r7, #8]
|
|
800b004: 891b ldrh r3, [r3, #8]
|
|
800b006: 461c mov r4, r3
|
|
800b008: 68bb ldr r3, [r7, #8]
|
|
800b00a: 691b ldr r3, [r3, #16]
|
|
800b00c: 899b ldrh r3, [r3, #12]
|
|
800b00e: b29b uxth r3, r3
|
|
800b010: 4618 mov r0, r3
|
|
800b012: f7fa fa9b bl 800554c <lwip_htons>
|
|
800b016: 4603 mov r3, r0
|
|
800b018: b2db uxtb r3, r3
|
|
800b01a: f003 0303 and.w r3, r3, #3
|
|
800b01e: 2b00 cmp r3, #0
|
|
800b020: d001 beq.n 800b026 <tcp_receive+0xaca>
|
|
800b022: 2301 movs r3, #1
|
|
800b024: e000 b.n 800b028 <tcp_receive+0xacc>
|
|
800b026: 2300 movs r3, #0
|
|
800b028: 1919 adds r1, r3, r4
|
|
800b02a: 687b ldr r3, [r7, #4]
|
|
800b02c: 8d1a ldrh r2, [r3, #40] ; 0x28
|
|
800b02e: b28b uxth r3, r1
|
|
800b030: 1ad3 subs r3, r2, r3
|
|
800b032: b29a uxth r2, r3
|
|
800b034: 687b ldr r3, [r7, #4]
|
|
800b036: 851a strh r2, [r3, #40] ; 0x28
|
|
|
|
tcp_update_rcv_ann_wnd(pcb);
|
|
800b038: 6878 ldr r0, [r7, #4]
|
|
800b03a: f7fc fd5f bl 8007afc <tcp_update_rcv_ann_wnd>
|
|
|
|
if (cseg->p->tot_len > 0) {
|
|
800b03e: 68bb ldr r3, [r7, #8]
|
|
800b040: 685b ldr r3, [r3, #4]
|
|
800b042: 891b ldrh r3, [r3, #8]
|
|
800b044: 2b00 cmp r3, #0
|
|
800b046: d028 beq.n 800b09a <tcp_receive+0xb3e>
|
|
/* Chain this pbuf onto the pbuf that we will pass to
|
|
the application. */
|
|
/* With window scaling, this can overflow recv_data->tot_len, but
|
|
that's not a problem since we explicitly fix that before passing
|
|
recv_data to the application. */
|
|
if (recv_data) {
|
|
800b048: 4b0d ldr r3, [pc, #52] ; (800b080 <tcp_receive+0xb24>)
|
|
800b04a: 681b ldr r3, [r3, #0]
|
|
800b04c: 2b00 cmp r3, #0
|
|
800b04e: d01d beq.n 800b08c <tcp_receive+0xb30>
|
|
pbuf_cat(recv_data, cseg->p);
|
|
800b050: 4b0b ldr r3, [pc, #44] ; (800b080 <tcp_receive+0xb24>)
|
|
800b052: 681a ldr r2, [r3, #0]
|
|
800b054: 68bb ldr r3, [r7, #8]
|
|
800b056: 685b ldr r3, [r3, #4]
|
|
800b058: 4619 mov r1, r3
|
|
800b05a: 4610 mov r0, r2
|
|
800b05c: f7fc f87c bl 8007158 <pbuf_cat>
|
|
800b060: e018 b.n 800b094 <tcp_receive+0xb38>
|
|
800b062: bf00 nop
|
|
800b064: 24007bb2 .word 0x24007bb2
|
|
800b068: 24007ba8 .word 0x24007ba8
|
|
800b06c: 24007b84 .word 0x24007b84
|
|
800b070: 08013198 .word 0x08013198
|
|
800b074: 08013578 .word 0x08013578
|
|
800b078: 080131e4 .word 0x080131e4
|
|
800b07c: 080135b4 .word 0x080135b4
|
|
800b080: 24007bb8 .word 0x24007bb8
|
|
800b084: 24007bb5 .word 0x24007bb5
|
|
800b088: 080135d4 .word 0x080135d4
|
|
} else {
|
|
recv_data = cseg->p;
|
|
800b08c: 68bb ldr r3, [r7, #8]
|
|
800b08e: 685b ldr r3, [r3, #4]
|
|
800b090: 4a70 ldr r2, [pc, #448] ; (800b254 <tcp_receive+0xcf8>)
|
|
800b092: 6013 str r3, [r2, #0]
|
|
}
|
|
cseg->p = NULL;
|
|
800b094: 68bb ldr r3, [r7, #8]
|
|
800b096: 2200 movs r2, #0
|
|
800b098: 605a str r2, [r3, #4]
|
|
}
|
|
if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
|
|
800b09a: 68bb ldr r3, [r7, #8]
|
|
800b09c: 691b ldr r3, [r3, #16]
|
|
800b09e: 899b ldrh r3, [r3, #12]
|
|
800b0a0: b29b uxth r3, r3
|
|
800b0a2: 4618 mov r0, r3
|
|
800b0a4: f7fa fa52 bl 800554c <lwip_htons>
|
|
800b0a8: 4603 mov r3, r0
|
|
800b0aa: b2db uxtb r3, r3
|
|
800b0ac: f003 0301 and.w r3, r3, #1
|
|
800b0b0: 2b00 cmp r3, #0
|
|
800b0b2: d00d beq.n 800b0d0 <tcp_receive+0xb74>
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: dequeued FIN.\n"));
|
|
recv_flags |= TF_GOT_FIN;
|
|
800b0b4: 4b68 ldr r3, [pc, #416] ; (800b258 <tcp_receive+0xcfc>)
|
|
800b0b6: 781b ldrb r3, [r3, #0]
|
|
800b0b8: f043 0320 orr.w r3, r3, #32
|
|
800b0bc: b2da uxtb r2, r3
|
|
800b0be: 4b66 ldr r3, [pc, #408] ; (800b258 <tcp_receive+0xcfc>)
|
|
800b0c0: 701a strb r2, [r3, #0]
|
|
if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */
|
|
800b0c2: 687b ldr r3, [r7, #4]
|
|
800b0c4: 7d1b ldrb r3, [r3, #20]
|
|
800b0c6: 2b04 cmp r3, #4
|
|
800b0c8: d102 bne.n 800b0d0 <tcp_receive+0xb74>
|
|
pcb->state = CLOSE_WAIT;
|
|
800b0ca: 687b ldr r3, [r7, #4]
|
|
800b0cc: 2207 movs r2, #7
|
|
800b0ce: 751a strb r2, [r3, #20]
|
|
}
|
|
}
|
|
|
|
pcb->ooseq = cseg->next;
|
|
800b0d0: 68bb ldr r3, [r7, #8]
|
|
800b0d2: 681a ldr r2, [r3, #0]
|
|
800b0d4: 687b ldr r3, [r7, #4]
|
|
800b0d6: 675a str r2, [r3, #116] ; 0x74
|
|
tcp_seg_free(cseg);
|
|
800b0d8: 68b8 ldr r0, [r7, #8]
|
|
800b0da: f7fd fb4c bl 8008776 <tcp_seg_free>
|
|
while (pcb->ooseq != NULL &&
|
|
800b0de: 687b ldr r3, [r7, #4]
|
|
800b0e0: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800b0e2: 2b00 cmp r3, #0
|
|
800b0e4: d008 beq.n 800b0f8 <tcp_receive+0xb9c>
|
|
pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {
|
|
800b0e6: 687b ldr r3, [r7, #4]
|
|
800b0e8: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800b0ea: 691b ldr r3, [r3, #16]
|
|
800b0ec: 685a ldr r2, [r3, #4]
|
|
800b0ee: 687b ldr r3, [r7, #4]
|
|
800b0f0: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
while (pcb->ooseq != NULL &&
|
|
800b0f2: 429a cmp r2, r3
|
|
800b0f4: f43f af43 beq.w 800af7e <tcp_receive+0xa22>
|
|
#endif /* LWIP_TCP_SACK_OUT */
|
|
#endif /* TCP_QUEUE_OOSEQ */
|
|
|
|
|
|
/* Acknowledge the segment(s). */
|
|
tcp_ack(pcb);
|
|
800b0f8: 687b ldr r3, [r7, #4]
|
|
800b0fa: 8b5b ldrh r3, [r3, #26]
|
|
800b0fc: f003 0301 and.w r3, r3, #1
|
|
800b100: 2b00 cmp r3, #0
|
|
800b102: d00e beq.n 800b122 <tcp_receive+0xbc6>
|
|
800b104: 687b ldr r3, [r7, #4]
|
|
800b106: 8b5b ldrh r3, [r3, #26]
|
|
800b108: f023 0301 bic.w r3, r3, #1
|
|
800b10c: b29a uxth r2, r3
|
|
800b10e: 687b ldr r3, [r7, #4]
|
|
800b110: 835a strh r2, [r3, #26]
|
|
800b112: 687b ldr r3, [r7, #4]
|
|
800b114: 8b5b ldrh r3, [r3, #26]
|
|
800b116: f043 0302 orr.w r3, r3, #2
|
|
800b11a: b29a uxth r2, r3
|
|
800b11c: 687b ldr r3, [r7, #4]
|
|
800b11e: 835a strh r2, [r3, #26]
|
|
if (pcb->rcv_nxt == seqno) {
|
|
800b120: e188 b.n 800b434 <tcp_receive+0xed8>
|
|
tcp_ack(pcb);
|
|
800b122: 687b ldr r3, [r7, #4]
|
|
800b124: 8b5b ldrh r3, [r3, #26]
|
|
800b126: f043 0301 orr.w r3, r3, #1
|
|
800b12a: b29a uxth r2, r3
|
|
800b12c: 687b ldr r3, [r7, #4]
|
|
800b12e: 835a strh r2, [r3, #26]
|
|
if (pcb->rcv_nxt == seqno) {
|
|
800b130: e180 b.n 800b434 <tcp_receive+0xed8>
|
|
} else {
|
|
/* We get here if the incoming segment is out-of-sequence. */
|
|
|
|
#if TCP_QUEUE_OOSEQ
|
|
/* We queue the segment on the ->ooseq queue. */
|
|
if (pcb->ooseq == NULL) {
|
|
800b132: 687b ldr r3, [r7, #4]
|
|
800b134: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800b136: 2b00 cmp r3, #0
|
|
800b138: d106 bne.n 800b148 <tcp_receive+0xbec>
|
|
pcb->ooseq = tcp_seg_copy(&inseg);
|
|
800b13a: 4848 ldr r0, [pc, #288] ; (800b25c <tcp_receive+0xd00>)
|
|
800b13c: f7fd fb34 bl 80087a8 <tcp_seg_copy>
|
|
800b140: 4602 mov r2, r0
|
|
800b142: 687b ldr r3, [r7, #4]
|
|
800b144: 675a str r2, [r3, #116] ; 0x74
|
|
800b146: e16d b.n 800b424 <tcp_receive+0xec8>
|
|
#if LWIP_TCP_SACK_OUT
|
|
/* This is the left edge of the lowest possible SACK range.
|
|
It may start before the newly received segment (possibly adjusted below). */
|
|
u32_t sackbeg = TCP_SEQ_LT(seqno, pcb->ooseq->tcphdr->seqno) ? seqno : pcb->ooseq->tcphdr->seqno;
|
|
#endif /* LWIP_TCP_SACK_OUT */
|
|
struct tcp_seg *next, *prev = NULL;
|
|
800b148: 2300 movs r3, #0
|
|
800b14a: 637b str r3, [r7, #52] ; 0x34
|
|
for (next = pcb->ooseq; next != NULL; next = next->next) {
|
|
800b14c: 687b ldr r3, [r7, #4]
|
|
800b14e: 6f5b ldr r3, [r3, #116] ; 0x74
|
|
800b150: 63bb str r3, [r7, #56] ; 0x38
|
|
800b152: e157 b.n 800b404 <tcp_receive+0xea8>
|
|
if (seqno == next->tcphdr->seqno) {
|
|
800b154: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b156: 691b ldr r3, [r3, #16]
|
|
800b158: 685a ldr r2, [r3, #4]
|
|
800b15a: 4b41 ldr r3, [pc, #260] ; (800b260 <tcp_receive+0xd04>)
|
|
800b15c: 681b ldr r3, [r3, #0]
|
|
800b15e: 429a cmp r2, r3
|
|
800b160: d11d bne.n 800b19e <tcp_receive+0xc42>
|
|
/* The sequence number of the incoming segment is the
|
|
same as the sequence number of the segment on
|
|
->ooseq. We check the lengths to see which one to
|
|
discard. */
|
|
if (inseg.len > next->len) {
|
|
800b162: 4b3e ldr r3, [pc, #248] ; (800b25c <tcp_receive+0xd00>)
|
|
800b164: 891a ldrh r2, [r3, #8]
|
|
800b166: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b168: 891b ldrh r3, [r3, #8]
|
|
800b16a: 429a cmp r2, r3
|
|
800b16c: f240 814f bls.w 800b40e <tcp_receive+0xeb2>
|
|
/* The incoming segment is larger than the old
|
|
segment. We replace some segments with the new
|
|
one. */
|
|
struct tcp_seg *cseg = tcp_seg_copy(&inseg);
|
|
800b170: 483a ldr r0, [pc, #232] ; (800b25c <tcp_receive+0xd00>)
|
|
800b172: f7fd fb19 bl 80087a8 <tcp_seg_copy>
|
|
800b176: 6178 str r0, [r7, #20]
|
|
if (cseg != NULL) {
|
|
800b178: 697b ldr r3, [r7, #20]
|
|
800b17a: 2b00 cmp r3, #0
|
|
800b17c: f000 8149 beq.w 800b412 <tcp_receive+0xeb6>
|
|
if (prev != NULL) {
|
|
800b180: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b182: 2b00 cmp r3, #0
|
|
800b184: d003 beq.n 800b18e <tcp_receive+0xc32>
|
|
prev->next = cseg;
|
|
800b186: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b188: 697a ldr r2, [r7, #20]
|
|
800b18a: 601a str r2, [r3, #0]
|
|
800b18c: e002 b.n 800b194 <tcp_receive+0xc38>
|
|
} else {
|
|
pcb->ooseq = cseg;
|
|
800b18e: 687b ldr r3, [r7, #4]
|
|
800b190: 697a ldr r2, [r7, #20]
|
|
800b192: 675a str r2, [r3, #116] ; 0x74
|
|
}
|
|
tcp_oos_insert_segment(cseg, next);
|
|
800b194: 6bb9 ldr r1, [r7, #56] ; 0x38
|
|
800b196: 6978 ldr r0, [r7, #20]
|
|
800b198: f7ff f8dc bl 800a354 <tcp_oos_insert_segment>
|
|
}
|
|
break;
|
|
800b19c: e139 b.n 800b412 <tcp_receive+0xeb6>
|
|
segment was smaller than the old one; in either
|
|
case, we ditch the incoming segment. */
|
|
break;
|
|
}
|
|
} else {
|
|
if (prev == NULL) {
|
|
800b19e: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b1a0: 2b00 cmp r3, #0
|
|
800b1a2: d117 bne.n 800b1d4 <tcp_receive+0xc78>
|
|
if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {
|
|
800b1a4: 4b2e ldr r3, [pc, #184] ; (800b260 <tcp_receive+0xd04>)
|
|
800b1a6: 681a ldr r2, [r3, #0]
|
|
800b1a8: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b1aa: 691b ldr r3, [r3, #16]
|
|
800b1ac: 685b ldr r3, [r3, #4]
|
|
800b1ae: 1ad3 subs r3, r2, r3
|
|
800b1b0: 2b00 cmp r3, #0
|
|
800b1b2: da57 bge.n 800b264 <tcp_receive+0xd08>
|
|
/* The sequence number of the incoming segment is lower
|
|
than the sequence number of the first segment on the
|
|
queue. We put the incoming segment first on the
|
|
queue. */
|
|
struct tcp_seg *cseg = tcp_seg_copy(&inseg);
|
|
800b1b4: 4829 ldr r0, [pc, #164] ; (800b25c <tcp_receive+0xd00>)
|
|
800b1b6: f7fd faf7 bl 80087a8 <tcp_seg_copy>
|
|
800b1ba: 61b8 str r0, [r7, #24]
|
|
if (cseg != NULL) {
|
|
800b1bc: 69bb ldr r3, [r7, #24]
|
|
800b1be: 2b00 cmp r3, #0
|
|
800b1c0: f000 8129 beq.w 800b416 <tcp_receive+0xeba>
|
|
pcb->ooseq = cseg;
|
|
800b1c4: 687b ldr r3, [r7, #4]
|
|
800b1c6: 69ba ldr r2, [r7, #24]
|
|
800b1c8: 675a str r2, [r3, #116] ; 0x74
|
|
tcp_oos_insert_segment(cseg, next);
|
|
800b1ca: 6bb9 ldr r1, [r7, #56] ; 0x38
|
|
800b1cc: 69b8 ldr r0, [r7, #24]
|
|
800b1ce: f7ff f8c1 bl 800a354 <tcp_oos_insert_segment>
|
|
}
|
|
break;
|
|
800b1d2: e120 b.n 800b416 <tcp_receive+0xeba>
|
|
}
|
|
} else {
|
|
/*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) &&
|
|
TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/
|
|
if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno + 1, next->tcphdr->seqno - 1)) {
|
|
800b1d4: 4b22 ldr r3, [pc, #136] ; (800b260 <tcp_receive+0xd04>)
|
|
800b1d6: 681a ldr r2, [r3, #0]
|
|
800b1d8: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b1da: 691b ldr r3, [r3, #16]
|
|
800b1dc: 685b ldr r3, [r3, #4]
|
|
800b1de: 1ad3 subs r3, r2, r3
|
|
800b1e0: 3b01 subs r3, #1
|
|
800b1e2: 2b00 cmp r3, #0
|
|
800b1e4: db3e blt.n 800b264 <tcp_receive+0xd08>
|
|
800b1e6: 4b1e ldr r3, [pc, #120] ; (800b260 <tcp_receive+0xd04>)
|
|
800b1e8: 681a ldr r2, [r3, #0]
|
|
800b1ea: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b1ec: 691b ldr r3, [r3, #16]
|
|
800b1ee: 685b ldr r3, [r3, #4]
|
|
800b1f0: 1ad3 subs r3, r2, r3
|
|
800b1f2: 3301 adds r3, #1
|
|
800b1f4: 2b00 cmp r3, #0
|
|
800b1f6: dc35 bgt.n 800b264 <tcp_receive+0xd08>
|
|
/* The sequence number of the incoming segment is in
|
|
between the sequence numbers of the previous and
|
|
the next segment on ->ooseq. We trim trim the previous
|
|
segment, delete next segments that included in received segment
|
|
and trim received, if needed. */
|
|
struct tcp_seg *cseg = tcp_seg_copy(&inseg);
|
|
800b1f8: 4818 ldr r0, [pc, #96] ; (800b25c <tcp_receive+0xd00>)
|
|
800b1fa: f7fd fad5 bl 80087a8 <tcp_seg_copy>
|
|
800b1fe: 61f8 str r0, [r7, #28]
|
|
if (cseg != NULL) {
|
|
800b200: 69fb ldr r3, [r7, #28]
|
|
800b202: 2b00 cmp r3, #0
|
|
800b204: f000 8109 beq.w 800b41a <tcp_receive+0xebe>
|
|
if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) {
|
|
800b208: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b20a: 691b ldr r3, [r3, #16]
|
|
800b20c: 685b ldr r3, [r3, #4]
|
|
800b20e: 6b7a ldr r2, [r7, #52] ; 0x34
|
|
800b210: 8912 ldrh r2, [r2, #8]
|
|
800b212: 441a add r2, r3
|
|
800b214: 4b12 ldr r3, [pc, #72] ; (800b260 <tcp_receive+0xd04>)
|
|
800b216: 681b ldr r3, [r3, #0]
|
|
800b218: 1ad3 subs r3, r2, r3
|
|
800b21a: 2b00 cmp r3, #0
|
|
800b21c: dd12 ble.n 800b244 <tcp_receive+0xce8>
|
|
/* We need to trim the prev segment. */
|
|
prev->len = (u16_t)(seqno - prev->tcphdr->seqno);
|
|
800b21e: 4b10 ldr r3, [pc, #64] ; (800b260 <tcp_receive+0xd04>)
|
|
800b220: 681b ldr r3, [r3, #0]
|
|
800b222: b29a uxth r2, r3
|
|
800b224: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b226: 691b ldr r3, [r3, #16]
|
|
800b228: 685b ldr r3, [r3, #4]
|
|
800b22a: b29b uxth r3, r3
|
|
800b22c: 1ad3 subs r3, r2, r3
|
|
800b22e: b29a uxth r2, r3
|
|
800b230: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b232: 811a strh r2, [r3, #8]
|
|
pbuf_realloc(prev->p, prev->len);
|
|
800b234: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b236: 685a ldr r2, [r3, #4]
|
|
800b238: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b23a: 891b ldrh r3, [r3, #8]
|
|
800b23c: 4619 mov r1, r3
|
|
800b23e: 4610 mov r0, r2
|
|
800b240: f7fb fd42 bl 8006cc8 <pbuf_realloc>
|
|
}
|
|
prev->next = cseg;
|
|
800b244: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800b246: 69fa ldr r2, [r7, #28]
|
|
800b248: 601a str r2, [r3, #0]
|
|
tcp_oos_insert_segment(cseg, next);
|
|
800b24a: 6bb9 ldr r1, [r7, #56] ; 0x38
|
|
800b24c: 69f8 ldr r0, [r7, #28]
|
|
800b24e: f7ff f881 bl 800a354 <tcp_oos_insert_segment>
|
|
}
|
|
break;
|
|
800b252: e0e2 b.n 800b41a <tcp_receive+0xebe>
|
|
800b254: 24007bb8 .word 0x24007bb8
|
|
800b258: 24007bb5 .word 0x24007bb5
|
|
800b25c: 24007b84 .word 0x24007b84
|
|
800b260: 24007ba8 .word 0x24007ba8
|
|
#endif /* LWIP_TCP_SACK_OUT */
|
|
|
|
/* We don't use 'prev' below, so let's set it to current 'next'.
|
|
This way even if we break the loop below, 'prev' will be pointing
|
|
at the segment right in front of the newly added one. */
|
|
prev = next;
|
|
800b264: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b266: 637b str r3, [r7, #52] ; 0x34
|
|
|
|
/* If the "next" segment is the last segment on the
|
|
ooseq queue, we add the incoming segment to the end
|
|
of the list. */
|
|
if (next->next == NULL &&
|
|
800b268: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b26a: 681b ldr r3, [r3, #0]
|
|
800b26c: 2b00 cmp r3, #0
|
|
800b26e: f040 80c6 bne.w 800b3fe <tcp_receive+0xea2>
|
|
TCP_SEQ_GT(seqno, next->tcphdr->seqno)) {
|
|
800b272: 4b80 ldr r3, [pc, #512] ; (800b474 <tcp_receive+0xf18>)
|
|
800b274: 681a ldr r2, [r3, #0]
|
|
800b276: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b278: 691b ldr r3, [r3, #16]
|
|
800b27a: 685b ldr r3, [r3, #4]
|
|
800b27c: 1ad3 subs r3, r2, r3
|
|
if (next->next == NULL &&
|
|
800b27e: 2b00 cmp r3, #0
|
|
800b280: f340 80bd ble.w 800b3fe <tcp_receive+0xea2>
|
|
if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {
|
|
800b284: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b286: 691b ldr r3, [r3, #16]
|
|
800b288: 899b ldrh r3, [r3, #12]
|
|
800b28a: b29b uxth r3, r3
|
|
800b28c: 4618 mov r0, r3
|
|
800b28e: f7fa f95d bl 800554c <lwip_htons>
|
|
800b292: 4603 mov r3, r0
|
|
800b294: b2db uxtb r3, r3
|
|
800b296: f003 0301 and.w r3, r3, #1
|
|
800b29a: 2b00 cmp r3, #0
|
|
800b29c: f040 80bf bne.w 800b41e <tcp_receive+0xec2>
|
|
/* segment "next" already contains all data */
|
|
break;
|
|
}
|
|
next->next = tcp_seg_copy(&inseg);
|
|
800b2a0: 4875 ldr r0, [pc, #468] ; (800b478 <tcp_receive+0xf1c>)
|
|
800b2a2: f7fd fa81 bl 80087a8 <tcp_seg_copy>
|
|
800b2a6: 4602 mov r2, r0
|
|
800b2a8: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b2aa: 601a str r2, [r3, #0]
|
|
if (next->next != NULL) {
|
|
800b2ac: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b2ae: 681b ldr r3, [r3, #0]
|
|
800b2b0: 2b00 cmp r3, #0
|
|
800b2b2: f000 80b6 beq.w 800b422 <tcp_receive+0xec6>
|
|
if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) {
|
|
800b2b6: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b2b8: 691b ldr r3, [r3, #16]
|
|
800b2ba: 685b ldr r3, [r3, #4]
|
|
800b2bc: 6bba ldr r2, [r7, #56] ; 0x38
|
|
800b2be: 8912 ldrh r2, [r2, #8]
|
|
800b2c0: 441a add r2, r3
|
|
800b2c2: 4b6c ldr r3, [pc, #432] ; (800b474 <tcp_receive+0xf18>)
|
|
800b2c4: 681b ldr r3, [r3, #0]
|
|
800b2c6: 1ad3 subs r3, r2, r3
|
|
800b2c8: 2b00 cmp r3, #0
|
|
800b2ca: dd12 ble.n 800b2f2 <tcp_receive+0xd96>
|
|
/* We need to trim the last segment. */
|
|
next->len = (u16_t)(seqno - next->tcphdr->seqno);
|
|
800b2cc: 4b69 ldr r3, [pc, #420] ; (800b474 <tcp_receive+0xf18>)
|
|
800b2ce: 681b ldr r3, [r3, #0]
|
|
800b2d0: b29a uxth r2, r3
|
|
800b2d2: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b2d4: 691b ldr r3, [r3, #16]
|
|
800b2d6: 685b ldr r3, [r3, #4]
|
|
800b2d8: b29b uxth r3, r3
|
|
800b2da: 1ad3 subs r3, r2, r3
|
|
800b2dc: b29a uxth r2, r3
|
|
800b2de: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b2e0: 811a strh r2, [r3, #8]
|
|
pbuf_realloc(next->p, next->len);
|
|
800b2e2: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b2e4: 685a ldr r2, [r3, #4]
|
|
800b2e6: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b2e8: 891b ldrh r3, [r3, #8]
|
|
800b2ea: 4619 mov r1, r3
|
|
800b2ec: 4610 mov r0, r2
|
|
800b2ee: f7fb fceb bl 8006cc8 <pbuf_realloc>
|
|
}
|
|
/* check if the remote side overruns our receive window */
|
|
if (TCP_SEQ_GT((u32_t)tcplen + seqno, pcb->rcv_nxt + (u32_t)pcb->rcv_wnd)) {
|
|
800b2f2: 4b62 ldr r3, [pc, #392] ; (800b47c <tcp_receive+0xf20>)
|
|
800b2f4: 881b ldrh r3, [r3, #0]
|
|
800b2f6: 461a mov r2, r3
|
|
800b2f8: 4b5e ldr r3, [pc, #376] ; (800b474 <tcp_receive+0xf18>)
|
|
800b2fa: 681b ldr r3, [r3, #0]
|
|
800b2fc: 441a add r2, r3
|
|
800b2fe: 687b ldr r3, [r7, #4]
|
|
800b300: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800b302: 6879 ldr r1, [r7, #4]
|
|
800b304: 8d09 ldrh r1, [r1, #40] ; 0x28
|
|
800b306: 440b add r3, r1
|
|
800b308: 1ad3 subs r3, r2, r3
|
|
800b30a: 2b00 cmp r3, #0
|
|
800b30c: f340 8089 ble.w 800b422 <tcp_receive+0xec6>
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG,
|
|
("tcp_receive: other end overran receive window"
|
|
"seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n",
|
|
seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
|
|
if (TCPH_FLAGS(next->next->tcphdr) & TCP_FIN) {
|
|
800b310: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b312: 681b ldr r3, [r3, #0]
|
|
800b314: 691b ldr r3, [r3, #16]
|
|
800b316: 899b ldrh r3, [r3, #12]
|
|
800b318: b29b uxth r3, r3
|
|
800b31a: 4618 mov r0, r3
|
|
800b31c: f7fa f916 bl 800554c <lwip_htons>
|
|
800b320: 4603 mov r3, r0
|
|
800b322: b2db uxtb r3, r3
|
|
800b324: f003 0301 and.w r3, r3, #1
|
|
800b328: 2b00 cmp r3, #0
|
|
800b32a: d022 beq.n 800b372 <tcp_receive+0xe16>
|
|
/* Must remove the FIN from the header as we're trimming
|
|
* that byte of sequence-space from the packet */
|
|
TCPH_FLAGS_SET(next->next->tcphdr, TCPH_FLAGS(next->next->tcphdr) & ~TCP_FIN);
|
|
800b32c: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b32e: 681b ldr r3, [r3, #0]
|
|
800b330: 691b ldr r3, [r3, #16]
|
|
800b332: 899b ldrh r3, [r3, #12]
|
|
800b334: b29b uxth r3, r3
|
|
800b336: b21b sxth r3, r3
|
|
800b338: f423 537c bic.w r3, r3, #16128 ; 0x3f00
|
|
800b33c: b21c sxth r4, r3
|
|
800b33e: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b340: 681b ldr r3, [r3, #0]
|
|
800b342: 691b ldr r3, [r3, #16]
|
|
800b344: 899b ldrh r3, [r3, #12]
|
|
800b346: b29b uxth r3, r3
|
|
800b348: 4618 mov r0, r3
|
|
800b34a: f7fa f8ff bl 800554c <lwip_htons>
|
|
800b34e: 4603 mov r3, r0
|
|
800b350: b2db uxtb r3, r3
|
|
800b352: b29b uxth r3, r3
|
|
800b354: f003 033e and.w r3, r3, #62 ; 0x3e
|
|
800b358: b29b uxth r3, r3
|
|
800b35a: 4618 mov r0, r3
|
|
800b35c: f7fa f8f6 bl 800554c <lwip_htons>
|
|
800b360: 4603 mov r3, r0
|
|
800b362: b21b sxth r3, r3
|
|
800b364: 4323 orrs r3, r4
|
|
800b366: b21a sxth r2, r3
|
|
800b368: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b36a: 681b ldr r3, [r3, #0]
|
|
800b36c: 691b ldr r3, [r3, #16]
|
|
800b36e: b292 uxth r2, r2
|
|
800b370: 819a strh r2, [r3, #12]
|
|
}
|
|
/* Adjust length of segment to fit in the window. */
|
|
next->next->len = (u16_t)(pcb->rcv_nxt + pcb->rcv_wnd - seqno);
|
|
800b372: 687b ldr r3, [r7, #4]
|
|
800b374: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800b376: b29a uxth r2, r3
|
|
800b378: 687b ldr r3, [r7, #4]
|
|
800b37a: 8d1b ldrh r3, [r3, #40] ; 0x28
|
|
800b37c: 4413 add r3, r2
|
|
800b37e: b299 uxth r1, r3
|
|
800b380: 4b3c ldr r3, [pc, #240] ; (800b474 <tcp_receive+0xf18>)
|
|
800b382: 681b ldr r3, [r3, #0]
|
|
800b384: b29a uxth r2, r3
|
|
800b386: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b388: 681b ldr r3, [r3, #0]
|
|
800b38a: 1a8a subs r2, r1, r2
|
|
800b38c: b292 uxth r2, r2
|
|
800b38e: 811a strh r2, [r3, #8]
|
|
pbuf_realloc(next->next->p, next->next->len);
|
|
800b390: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b392: 681b ldr r3, [r3, #0]
|
|
800b394: 685a ldr r2, [r3, #4]
|
|
800b396: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b398: 681b ldr r3, [r3, #0]
|
|
800b39a: 891b ldrh r3, [r3, #8]
|
|
800b39c: 4619 mov r1, r3
|
|
800b39e: 4610 mov r0, r2
|
|
800b3a0: f7fb fc92 bl 8006cc8 <pbuf_realloc>
|
|
tcplen = TCP_TCPLEN(next->next);
|
|
800b3a4: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b3a6: 681b ldr r3, [r3, #0]
|
|
800b3a8: 891c ldrh r4, [r3, #8]
|
|
800b3aa: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b3ac: 681b ldr r3, [r3, #0]
|
|
800b3ae: 691b ldr r3, [r3, #16]
|
|
800b3b0: 899b ldrh r3, [r3, #12]
|
|
800b3b2: b29b uxth r3, r3
|
|
800b3b4: 4618 mov r0, r3
|
|
800b3b6: f7fa f8c9 bl 800554c <lwip_htons>
|
|
800b3ba: 4603 mov r3, r0
|
|
800b3bc: b2db uxtb r3, r3
|
|
800b3be: f003 0303 and.w r3, r3, #3
|
|
800b3c2: 2b00 cmp r3, #0
|
|
800b3c4: d001 beq.n 800b3ca <tcp_receive+0xe6e>
|
|
800b3c6: 2301 movs r3, #1
|
|
800b3c8: e000 b.n 800b3cc <tcp_receive+0xe70>
|
|
800b3ca: 2300 movs r3, #0
|
|
800b3cc: 4423 add r3, r4
|
|
800b3ce: b29a uxth r2, r3
|
|
800b3d0: 4b2a ldr r3, [pc, #168] ; (800b47c <tcp_receive+0xf20>)
|
|
800b3d2: 801a strh r2, [r3, #0]
|
|
LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n",
|
|
800b3d4: 4b29 ldr r3, [pc, #164] ; (800b47c <tcp_receive+0xf20>)
|
|
800b3d6: 881b ldrh r3, [r3, #0]
|
|
800b3d8: 461a mov r2, r3
|
|
800b3da: 4b26 ldr r3, [pc, #152] ; (800b474 <tcp_receive+0xf18>)
|
|
800b3dc: 681b ldr r3, [r3, #0]
|
|
800b3de: 441a add r2, r3
|
|
800b3e0: 687b ldr r3, [r7, #4]
|
|
800b3e2: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800b3e4: 6879 ldr r1, [r7, #4]
|
|
800b3e6: 8d09 ldrh r1, [r1, #40] ; 0x28
|
|
800b3e8: 440b add r3, r1
|
|
800b3ea: 429a cmp r2, r3
|
|
800b3ec: d019 beq.n 800b422 <tcp_receive+0xec6>
|
|
800b3ee: 4b24 ldr r3, [pc, #144] ; (800b480 <tcp_receive+0xf24>)
|
|
800b3f0: f44f 62df mov.w r2, #1784 ; 0x6f8
|
|
800b3f4: 4923 ldr r1, [pc, #140] ; (800b484 <tcp_receive+0xf28>)
|
|
800b3f6: 4824 ldr r0, [pc, #144] ; (800b488 <tcp_receive+0xf2c>)
|
|
800b3f8: f005 fbe6 bl 8010bc8 <iprintf>
|
|
(seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));
|
|
}
|
|
}
|
|
break;
|
|
800b3fc: e011 b.n 800b422 <tcp_receive+0xec6>
|
|
for (next = pcb->ooseq; next != NULL; next = next->next) {
|
|
800b3fe: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b400: 681b ldr r3, [r3, #0]
|
|
800b402: 63bb str r3, [r7, #56] ; 0x38
|
|
800b404: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800b406: 2b00 cmp r3, #0
|
|
800b408: f47f aea4 bne.w 800b154 <tcp_receive+0xbf8>
|
|
800b40c: e00a b.n 800b424 <tcp_receive+0xec8>
|
|
break;
|
|
800b40e: bf00 nop
|
|
800b410: e008 b.n 800b424 <tcp_receive+0xec8>
|
|
break;
|
|
800b412: bf00 nop
|
|
800b414: e006 b.n 800b424 <tcp_receive+0xec8>
|
|
break;
|
|
800b416: bf00 nop
|
|
800b418: e004 b.n 800b424 <tcp_receive+0xec8>
|
|
break;
|
|
800b41a: bf00 nop
|
|
800b41c: e002 b.n 800b424 <tcp_receive+0xec8>
|
|
break;
|
|
800b41e: bf00 nop
|
|
800b420: e000 b.n 800b424 <tcp_receive+0xec8>
|
|
break;
|
|
800b422: bf00 nop
|
|
#endif /* TCP_OOSEQ_BYTES_LIMIT || TCP_OOSEQ_PBUFS_LIMIT */
|
|
#endif /* TCP_QUEUE_OOSEQ */
|
|
|
|
/* We send the ACK packet after we've (potentially) dealt with SACKs,
|
|
so they can be included in the acknowledgment. */
|
|
tcp_send_empty_ack(pcb);
|
|
800b424: 6878 ldr r0, [r7, #4]
|
|
800b426: f001 fef7 bl 800d218 <tcp_send_empty_ack>
|
|
if (pcb->rcv_nxt == seqno) {
|
|
800b42a: e003 b.n 800b434 <tcp_receive+0xed8>
|
|
}
|
|
} else {
|
|
/* The incoming segment is not within the window. */
|
|
tcp_send_empty_ack(pcb);
|
|
800b42c: 6878 ldr r0, [r7, #4]
|
|
800b42e: f001 fef3 bl 800d218 <tcp_send_empty_ack>
|
|
if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
|
|
800b432: e01a b.n 800b46a <tcp_receive+0xf0e>
|
|
800b434: e019 b.n 800b46a <tcp_receive+0xf0e>
|
|
}
|
|
} else {
|
|
/* Segments with length 0 is taken care of here. Segments that
|
|
fall out of the window are ACKed. */
|
|
if (!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd - 1)) {
|
|
800b436: 4b0f ldr r3, [pc, #60] ; (800b474 <tcp_receive+0xf18>)
|
|
800b438: 681a ldr r2, [r3, #0]
|
|
800b43a: 687b ldr r3, [r7, #4]
|
|
800b43c: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800b43e: 1ad3 subs r3, r2, r3
|
|
800b440: 2b00 cmp r3, #0
|
|
800b442: db0a blt.n 800b45a <tcp_receive+0xefe>
|
|
800b444: 4b0b ldr r3, [pc, #44] ; (800b474 <tcp_receive+0xf18>)
|
|
800b446: 681a ldr r2, [r3, #0]
|
|
800b448: 687b ldr r3, [r7, #4]
|
|
800b44a: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800b44c: 6879 ldr r1, [r7, #4]
|
|
800b44e: 8d09 ldrh r1, [r1, #40] ; 0x28
|
|
800b450: 440b add r3, r1
|
|
800b452: 1ad3 subs r3, r2, r3
|
|
800b454: 3301 adds r3, #1
|
|
800b456: 2b00 cmp r3, #0
|
|
800b458: dd07 ble.n 800b46a <tcp_receive+0xf0e>
|
|
tcp_ack_now(pcb);
|
|
800b45a: 687b ldr r3, [r7, #4]
|
|
800b45c: 8b5b ldrh r3, [r3, #26]
|
|
800b45e: f043 0302 orr.w r3, r3, #2
|
|
800b462: b29a uxth r2, r3
|
|
800b464: 687b ldr r3, [r7, #4]
|
|
800b466: 835a strh r2, [r3, #26]
|
|
}
|
|
}
|
|
}
|
|
800b468: e7ff b.n 800b46a <tcp_receive+0xf0e>
|
|
800b46a: bf00 nop
|
|
800b46c: 3750 adds r7, #80 ; 0x50
|
|
800b46e: 46bd mov sp, r7
|
|
800b470: bdb0 pop {r4, r5, r7, pc}
|
|
800b472: bf00 nop
|
|
800b474: 24007ba8 .word 0x24007ba8
|
|
800b478: 24007b84 .word 0x24007b84
|
|
800b47c: 24007bb2 .word 0x24007bb2
|
|
800b480: 08013198 .word 0x08013198
|
|
800b484: 08013540 .word 0x08013540
|
|
800b488: 080131e4 .word 0x080131e4
|
|
|
|
0800b48c <tcp_get_next_optbyte>:
|
|
|
|
static u8_t
|
|
tcp_get_next_optbyte(void)
|
|
{
|
|
800b48c: b480 push {r7}
|
|
800b48e: b083 sub sp, #12
|
|
800b490: af00 add r7, sp, #0
|
|
u16_t optidx = tcp_optidx++;
|
|
800b492: 4b15 ldr r3, [pc, #84] ; (800b4e8 <tcp_get_next_optbyte+0x5c>)
|
|
800b494: 881b ldrh r3, [r3, #0]
|
|
800b496: 1c5a adds r2, r3, #1
|
|
800b498: b291 uxth r1, r2
|
|
800b49a: 4a13 ldr r2, [pc, #76] ; (800b4e8 <tcp_get_next_optbyte+0x5c>)
|
|
800b49c: 8011 strh r1, [r2, #0]
|
|
800b49e: 80fb strh r3, [r7, #6]
|
|
if ((tcphdr_opt2 == NULL) || (optidx < tcphdr_opt1len)) {
|
|
800b4a0: 4b12 ldr r3, [pc, #72] ; (800b4ec <tcp_get_next_optbyte+0x60>)
|
|
800b4a2: 681b ldr r3, [r3, #0]
|
|
800b4a4: 2b00 cmp r3, #0
|
|
800b4a6: d004 beq.n 800b4b2 <tcp_get_next_optbyte+0x26>
|
|
800b4a8: 4b11 ldr r3, [pc, #68] ; (800b4f0 <tcp_get_next_optbyte+0x64>)
|
|
800b4aa: 881b ldrh r3, [r3, #0]
|
|
800b4ac: 88fa ldrh r2, [r7, #6]
|
|
800b4ae: 429a cmp r2, r3
|
|
800b4b0: d208 bcs.n 800b4c4 <tcp_get_next_optbyte+0x38>
|
|
u8_t *opts = (u8_t *)tcphdr + TCP_HLEN;
|
|
800b4b2: 4b10 ldr r3, [pc, #64] ; (800b4f4 <tcp_get_next_optbyte+0x68>)
|
|
800b4b4: 681b ldr r3, [r3, #0]
|
|
800b4b6: 3314 adds r3, #20
|
|
800b4b8: 603b str r3, [r7, #0]
|
|
return opts[optidx];
|
|
800b4ba: 88fb ldrh r3, [r7, #6]
|
|
800b4bc: 683a ldr r2, [r7, #0]
|
|
800b4be: 4413 add r3, r2
|
|
800b4c0: 781b ldrb r3, [r3, #0]
|
|
800b4c2: e00b b.n 800b4dc <tcp_get_next_optbyte+0x50>
|
|
} else {
|
|
u8_t idx = (u8_t)(optidx - tcphdr_opt1len);
|
|
800b4c4: 88fb ldrh r3, [r7, #6]
|
|
800b4c6: b2da uxtb r2, r3
|
|
800b4c8: 4b09 ldr r3, [pc, #36] ; (800b4f0 <tcp_get_next_optbyte+0x64>)
|
|
800b4ca: 881b ldrh r3, [r3, #0]
|
|
800b4cc: b2db uxtb r3, r3
|
|
800b4ce: 1ad3 subs r3, r2, r3
|
|
800b4d0: 717b strb r3, [r7, #5]
|
|
return tcphdr_opt2[idx];
|
|
800b4d2: 4b06 ldr r3, [pc, #24] ; (800b4ec <tcp_get_next_optbyte+0x60>)
|
|
800b4d4: 681a ldr r2, [r3, #0]
|
|
800b4d6: 797b ldrb r3, [r7, #5]
|
|
800b4d8: 4413 add r3, r2
|
|
800b4da: 781b ldrb r3, [r3, #0]
|
|
}
|
|
}
|
|
800b4dc: 4618 mov r0, r3
|
|
800b4de: 370c adds r7, #12
|
|
800b4e0: 46bd mov sp, r7
|
|
800b4e2: f85d 7b04 ldr.w r7, [sp], #4
|
|
800b4e6: 4770 bx lr
|
|
800b4e8: 24007ba4 .word 0x24007ba4
|
|
800b4ec: 24007ba0 .word 0x24007ba0
|
|
800b4f0: 24007b9e .word 0x24007b9e
|
|
800b4f4: 24007b98 .word 0x24007b98
|
|
|
|
0800b4f8 <tcp_parseopt>:
|
|
*
|
|
* @param pcb the tcp_pcb for which a segment arrived
|
|
*/
|
|
static void
|
|
tcp_parseopt(struct tcp_pcb *pcb)
|
|
{
|
|
800b4f8: b580 push {r7, lr}
|
|
800b4fa: b084 sub sp, #16
|
|
800b4fc: af00 add r7, sp, #0
|
|
800b4fe: 6078 str r0, [r7, #4]
|
|
u16_t mss;
|
|
#if LWIP_TCP_TIMESTAMPS
|
|
u32_t tsval;
|
|
#endif
|
|
|
|
LWIP_ASSERT("tcp_parseopt: invalid pcb", pcb != NULL);
|
|
800b500: 687b ldr r3, [r7, #4]
|
|
800b502: 2b00 cmp r3, #0
|
|
800b504: d106 bne.n 800b514 <tcp_parseopt+0x1c>
|
|
800b506: 4b32 ldr r3, [pc, #200] ; (800b5d0 <tcp_parseopt+0xd8>)
|
|
800b508: f240 727d movw r2, #1917 ; 0x77d
|
|
800b50c: 4931 ldr r1, [pc, #196] ; (800b5d4 <tcp_parseopt+0xdc>)
|
|
800b50e: 4832 ldr r0, [pc, #200] ; (800b5d8 <tcp_parseopt+0xe0>)
|
|
800b510: f005 fb5a bl 8010bc8 <iprintf>
|
|
|
|
/* Parse the TCP MSS option, if present. */
|
|
if (tcphdr_optlen != 0) {
|
|
800b514: 4b31 ldr r3, [pc, #196] ; (800b5dc <tcp_parseopt+0xe4>)
|
|
800b516: 881b ldrh r3, [r3, #0]
|
|
800b518: 2b00 cmp r3, #0
|
|
800b51a: d055 beq.n 800b5c8 <tcp_parseopt+0xd0>
|
|
for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) {
|
|
800b51c: 4b30 ldr r3, [pc, #192] ; (800b5e0 <tcp_parseopt+0xe8>)
|
|
800b51e: 2200 movs r2, #0
|
|
800b520: 801a strh r2, [r3, #0]
|
|
800b522: e045 b.n 800b5b0 <tcp_parseopt+0xb8>
|
|
u8_t opt = tcp_get_next_optbyte();
|
|
800b524: f7ff ffb2 bl 800b48c <tcp_get_next_optbyte>
|
|
800b528: 4603 mov r3, r0
|
|
800b52a: 73fb strb r3, [r7, #15]
|
|
switch (opt) {
|
|
800b52c: 7bfb ldrb r3, [r7, #15]
|
|
800b52e: 2b02 cmp r3, #2
|
|
800b530: d006 beq.n 800b540 <tcp_parseopt+0x48>
|
|
800b532: 2b02 cmp r3, #2
|
|
800b534: dc2b bgt.n 800b58e <tcp_parseopt+0x96>
|
|
800b536: 2b00 cmp r3, #0
|
|
800b538: d041 beq.n 800b5be <tcp_parseopt+0xc6>
|
|
800b53a: 2b01 cmp r3, #1
|
|
800b53c: d127 bne.n 800b58e <tcp_parseopt+0x96>
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n"));
|
|
return;
|
|
case LWIP_TCP_OPT_NOP:
|
|
/* NOP option. */
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n"));
|
|
break;
|
|
800b53e: e037 b.n 800b5b0 <tcp_parseopt+0xb8>
|
|
case LWIP_TCP_OPT_MSS:
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n"));
|
|
if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_MSS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_MSS) > tcphdr_optlen) {
|
|
800b540: f7ff ffa4 bl 800b48c <tcp_get_next_optbyte>
|
|
800b544: 4603 mov r3, r0
|
|
800b546: 2b04 cmp r3, #4
|
|
800b548: d13b bne.n 800b5c2 <tcp_parseopt+0xca>
|
|
800b54a: 4b25 ldr r3, [pc, #148] ; (800b5e0 <tcp_parseopt+0xe8>)
|
|
800b54c: 881b ldrh r3, [r3, #0]
|
|
800b54e: 3301 adds r3, #1
|
|
800b550: 4a22 ldr r2, [pc, #136] ; (800b5dc <tcp_parseopt+0xe4>)
|
|
800b552: 8812 ldrh r2, [r2, #0]
|
|
800b554: 4293 cmp r3, r2
|
|
800b556: da34 bge.n 800b5c2 <tcp_parseopt+0xca>
|
|
/* Bad length */
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
|
|
return;
|
|
}
|
|
/* An MSS option with the right option length. */
|
|
mss = (u16_t)(tcp_get_next_optbyte() << 8);
|
|
800b558: f7ff ff98 bl 800b48c <tcp_get_next_optbyte>
|
|
800b55c: 4603 mov r3, r0
|
|
800b55e: b29b uxth r3, r3
|
|
800b560: 021b lsls r3, r3, #8
|
|
800b562: 81bb strh r3, [r7, #12]
|
|
mss |= tcp_get_next_optbyte();
|
|
800b564: f7ff ff92 bl 800b48c <tcp_get_next_optbyte>
|
|
800b568: 4603 mov r3, r0
|
|
800b56a: b29a uxth r2, r3
|
|
800b56c: 89bb ldrh r3, [r7, #12]
|
|
800b56e: 4313 orrs r3, r2
|
|
800b570: 81bb strh r3, [r7, #12]
|
|
/* Limit the mss to the configured TCP_MSS and prevent division by zero */
|
|
pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
|
|
800b572: 89bb ldrh r3, [r7, #12]
|
|
800b574: f5b3 7f06 cmp.w r3, #536 ; 0x218
|
|
800b578: d804 bhi.n 800b584 <tcp_parseopt+0x8c>
|
|
800b57a: 89bb ldrh r3, [r7, #12]
|
|
800b57c: 2b00 cmp r3, #0
|
|
800b57e: d001 beq.n 800b584 <tcp_parseopt+0x8c>
|
|
800b580: 89ba ldrh r2, [r7, #12]
|
|
800b582: e001 b.n 800b588 <tcp_parseopt+0x90>
|
|
800b584: f44f 7206 mov.w r2, #536 ; 0x218
|
|
800b588: 687b ldr r3, [r7, #4]
|
|
800b58a: 865a strh r2, [r3, #50] ; 0x32
|
|
break;
|
|
800b58c: e010 b.n 800b5b0 <tcp_parseopt+0xb8>
|
|
}
|
|
break;
|
|
#endif /* LWIP_TCP_SACK_OUT */
|
|
default:
|
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n"));
|
|
data = tcp_get_next_optbyte();
|
|
800b58e: f7ff ff7d bl 800b48c <tcp_get_next_optbyte>
|
|
800b592: 4603 mov r3, r0
|
|
800b594: 72fb strb r3, [r7, #11]
|
|
if (data < 2) {
|
|
800b596: 7afb ldrb r3, [r7, #11]
|
|
800b598: 2b01 cmp r3, #1
|
|
800b59a: d914 bls.n 800b5c6 <tcp_parseopt+0xce>
|
|
and we don't process them further. */
|
|
return;
|
|
}
|
|
/* All other options have a length field, so that we easily
|
|
can skip past them. */
|
|
tcp_optidx += data - 2;
|
|
800b59c: 7afb ldrb r3, [r7, #11]
|
|
800b59e: b29a uxth r2, r3
|
|
800b5a0: 4b0f ldr r3, [pc, #60] ; (800b5e0 <tcp_parseopt+0xe8>)
|
|
800b5a2: 881b ldrh r3, [r3, #0]
|
|
800b5a4: 4413 add r3, r2
|
|
800b5a6: b29b uxth r3, r3
|
|
800b5a8: 3b02 subs r3, #2
|
|
800b5aa: b29a uxth r2, r3
|
|
800b5ac: 4b0c ldr r3, [pc, #48] ; (800b5e0 <tcp_parseopt+0xe8>)
|
|
800b5ae: 801a strh r2, [r3, #0]
|
|
for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) {
|
|
800b5b0: 4b0b ldr r3, [pc, #44] ; (800b5e0 <tcp_parseopt+0xe8>)
|
|
800b5b2: 881a ldrh r2, [r3, #0]
|
|
800b5b4: 4b09 ldr r3, [pc, #36] ; (800b5dc <tcp_parseopt+0xe4>)
|
|
800b5b6: 881b ldrh r3, [r3, #0]
|
|
800b5b8: 429a cmp r2, r3
|
|
800b5ba: d3b3 bcc.n 800b524 <tcp_parseopt+0x2c>
|
|
800b5bc: e004 b.n 800b5c8 <tcp_parseopt+0xd0>
|
|
return;
|
|
800b5be: bf00 nop
|
|
800b5c0: e002 b.n 800b5c8 <tcp_parseopt+0xd0>
|
|
return;
|
|
800b5c2: bf00 nop
|
|
800b5c4: e000 b.n 800b5c8 <tcp_parseopt+0xd0>
|
|
return;
|
|
800b5c6: bf00 nop
|
|
}
|
|
}
|
|
}
|
|
}
|
|
800b5c8: 3710 adds r7, #16
|
|
800b5ca: 46bd mov sp, r7
|
|
800b5cc: bd80 pop {r7, pc}
|
|
800b5ce: bf00 nop
|
|
800b5d0: 08013198 .word 0x08013198
|
|
800b5d4: 080135fc .word 0x080135fc
|
|
800b5d8: 080131e4 .word 0x080131e4
|
|
800b5dc: 24007b9c .word 0x24007b9c
|
|
800b5e0: 24007ba4 .word 0x24007ba4
|
|
|
|
0800b5e4 <tcp_trigger_input_pcb_close>:
|
|
|
|
void
|
|
tcp_trigger_input_pcb_close(void)
|
|
{
|
|
800b5e4: b480 push {r7}
|
|
800b5e6: af00 add r7, sp, #0
|
|
recv_flags |= TF_CLOSED;
|
|
800b5e8: 4b05 ldr r3, [pc, #20] ; (800b600 <tcp_trigger_input_pcb_close+0x1c>)
|
|
800b5ea: 781b ldrb r3, [r3, #0]
|
|
800b5ec: f043 0310 orr.w r3, r3, #16
|
|
800b5f0: b2da uxtb r2, r3
|
|
800b5f2: 4b03 ldr r3, [pc, #12] ; (800b600 <tcp_trigger_input_pcb_close+0x1c>)
|
|
800b5f4: 701a strb r2, [r3, #0]
|
|
}
|
|
800b5f6: bf00 nop
|
|
800b5f8: 46bd mov sp, r7
|
|
800b5fa: f85d 7b04 ldr.w r7, [sp], #4
|
|
800b5fe: 4770 bx lr
|
|
800b600: 24007bb5 .word 0x24007bb5
|
|
|
|
0800b604 <tcp_route>:
|
|
static err_t tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif);
|
|
|
|
/* tcp_route: common code that returns a fixed bound netif or calls ip_route */
|
|
static struct netif *
|
|
tcp_route(const struct tcp_pcb *pcb, const ip_addr_t *src, const ip_addr_t *dst)
|
|
{
|
|
800b604: b580 push {r7, lr}
|
|
800b606: b084 sub sp, #16
|
|
800b608: af00 add r7, sp, #0
|
|
800b60a: 60f8 str r0, [r7, #12]
|
|
800b60c: 60b9 str r1, [r7, #8]
|
|
800b60e: 607a str r2, [r7, #4]
|
|
LWIP_UNUSED_ARG(src); /* in case IPv4-only and source-based routing is disabled */
|
|
|
|
if ((pcb != NULL) && (pcb->netif_idx != NETIF_NO_INDEX)) {
|
|
800b610: 68fb ldr r3, [r7, #12]
|
|
800b612: 2b00 cmp r3, #0
|
|
800b614: d00a beq.n 800b62c <tcp_route+0x28>
|
|
800b616: 68fb ldr r3, [r7, #12]
|
|
800b618: 7a1b ldrb r3, [r3, #8]
|
|
800b61a: 2b00 cmp r3, #0
|
|
800b61c: d006 beq.n 800b62c <tcp_route+0x28>
|
|
return netif_get_by_index(pcb->netif_idx);
|
|
800b61e: 68fb ldr r3, [r7, #12]
|
|
800b620: 7a1b ldrb r3, [r3, #8]
|
|
800b622: 4618 mov r0, r3
|
|
800b624: f7fb f976 bl 8006914 <netif_get_by_index>
|
|
800b628: 4603 mov r3, r0
|
|
800b62a: e003 b.n 800b634 <tcp_route+0x30>
|
|
} else {
|
|
return ip_route(src, dst);
|
|
800b62c: 6878 ldr r0, [r7, #4]
|
|
800b62e: f003 fc2b bl 800ee88 <ip4_route>
|
|
800b632: 4603 mov r3, r0
|
|
}
|
|
}
|
|
800b634: 4618 mov r0, r3
|
|
800b636: 3710 adds r7, #16
|
|
800b638: 46bd mov sp, r7
|
|
800b63a: bd80 pop {r7, pc}
|
|
|
|
0800b63c <tcp_create_segment>:
|
|
* The TCP header is filled in except ackno and wnd.
|
|
* p is freed on failure.
|
|
*/
|
|
static struct tcp_seg *
|
|
tcp_create_segment(const struct tcp_pcb *pcb, struct pbuf *p, u8_t hdrflags, u32_t seqno, u8_t optflags)
|
|
{
|
|
800b63c: b590 push {r4, r7, lr}
|
|
800b63e: b087 sub sp, #28
|
|
800b640: af00 add r7, sp, #0
|
|
800b642: 60f8 str r0, [r7, #12]
|
|
800b644: 60b9 str r1, [r7, #8]
|
|
800b646: 603b str r3, [r7, #0]
|
|
800b648: 4613 mov r3, r2
|
|
800b64a: 71fb strb r3, [r7, #7]
|
|
struct tcp_seg *seg;
|
|
u8_t optlen;
|
|
|
|
LWIP_ASSERT("tcp_create_segment: invalid pcb", pcb != NULL);
|
|
800b64c: 68fb ldr r3, [r7, #12]
|
|
800b64e: 2b00 cmp r3, #0
|
|
800b650: d105 bne.n 800b65e <tcp_create_segment+0x22>
|
|
800b652: 4b45 ldr r3, [pc, #276] ; (800b768 <tcp_create_segment+0x12c>)
|
|
800b654: 22a3 movs r2, #163 ; 0xa3
|
|
800b656: 4945 ldr r1, [pc, #276] ; (800b76c <tcp_create_segment+0x130>)
|
|
800b658: 4845 ldr r0, [pc, #276] ; (800b770 <tcp_create_segment+0x134>)
|
|
800b65a: f005 fab5 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_create_segment: invalid pbuf", p != NULL);
|
|
800b65e: 68bb ldr r3, [r7, #8]
|
|
800b660: 2b00 cmp r3, #0
|
|
800b662: d105 bne.n 800b670 <tcp_create_segment+0x34>
|
|
800b664: 4b40 ldr r3, [pc, #256] ; (800b768 <tcp_create_segment+0x12c>)
|
|
800b666: 22a4 movs r2, #164 ; 0xa4
|
|
800b668: 4942 ldr r1, [pc, #264] ; (800b774 <tcp_create_segment+0x138>)
|
|
800b66a: 4841 ldr r0, [pc, #260] ; (800b770 <tcp_create_segment+0x134>)
|
|
800b66c: f005 faac bl 8010bc8 <iprintf>
|
|
|
|
optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb);
|
|
800b670: f897 3028 ldrb.w r3, [r7, #40] ; 0x28
|
|
800b674: 009b lsls r3, r3, #2
|
|
800b676: b2db uxtb r3, r3
|
|
800b678: f003 0304 and.w r3, r3, #4
|
|
800b67c: 75fb strb r3, [r7, #23]
|
|
|
|
if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {
|
|
800b67e: 2003 movs r0, #3
|
|
800b680: f7fa fccc bl 800601c <memp_malloc>
|
|
800b684: 6138 str r0, [r7, #16]
|
|
800b686: 693b ldr r3, [r7, #16]
|
|
800b688: 2b00 cmp r3, #0
|
|
800b68a: d104 bne.n 800b696 <tcp_create_segment+0x5a>
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_create_segment: no memory.\n"));
|
|
pbuf_free(p);
|
|
800b68c: 68b8 ldr r0, [r7, #8]
|
|
800b68e: f7fb fca1 bl 8006fd4 <pbuf_free>
|
|
return NULL;
|
|
800b692: 2300 movs r3, #0
|
|
800b694: e064 b.n 800b760 <tcp_create_segment+0x124>
|
|
}
|
|
seg->flags = optflags;
|
|
800b696: 693b ldr r3, [r7, #16]
|
|
800b698: f897 2028 ldrb.w r2, [r7, #40] ; 0x28
|
|
800b69c: 731a strb r2, [r3, #12]
|
|
seg->next = NULL;
|
|
800b69e: 693b ldr r3, [r7, #16]
|
|
800b6a0: 2200 movs r2, #0
|
|
800b6a2: 601a str r2, [r3, #0]
|
|
seg->p = p;
|
|
800b6a4: 693b ldr r3, [r7, #16]
|
|
800b6a6: 68ba ldr r2, [r7, #8]
|
|
800b6a8: 605a str r2, [r3, #4]
|
|
LWIP_ASSERT("p->tot_len >= optlen", p->tot_len >= optlen);
|
|
800b6aa: 68bb ldr r3, [r7, #8]
|
|
800b6ac: 891a ldrh r2, [r3, #8]
|
|
800b6ae: 7dfb ldrb r3, [r7, #23]
|
|
800b6b0: b29b uxth r3, r3
|
|
800b6b2: 429a cmp r2, r3
|
|
800b6b4: d205 bcs.n 800b6c2 <tcp_create_segment+0x86>
|
|
800b6b6: 4b2c ldr r3, [pc, #176] ; (800b768 <tcp_create_segment+0x12c>)
|
|
800b6b8: 22b0 movs r2, #176 ; 0xb0
|
|
800b6ba: 492f ldr r1, [pc, #188] ; (800b778 <tcp_create_segment+0x13c>)
|
|
800b6bc: 482c ldr r0, [pc, #176] ; (800b770 <tcp_create_segment+0x134>)
|
|
800b6be: f005 fa83 bl 8010bc8 <iprintf>
|
|
seg->len = p->tot_len - optlen;
|
|
800b6c2: 68bb ldr r3, [r7, #8]
|
|
800b6c4: 891a ldrh r2, [r3, #8]
|
|
800b6c6: 7dfb ldrb r3, [r7, #23]
|
|
800b6c8: b29b uxth r3, r3
|
|
800b6ca: 1ad3 subs r3, r2, r3
|
|
800b6cc: b29a uxth r2, r3
|
|
800b6ce: 693b ldr r3, [r7, #16]
|
|
800b6d0: 811a strh r2, [r3, #8]
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
seg->oversize_left = 0;
|
|
800b6d2: 693b ldr r3, [r7, #16]
|
|
800b6d4: 2200 movs r2, #0
|
|
800b6d6: 815a strh r2, [r3, #10]
|
|
LWIP_ASSERT("invalid optflags passed: TF_SEG_DATA_CHECKSUMMED",
|
|
(optflags & TF_SEG_DATA_CHECKSUMMED) == 0);
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
|
|
/* build TCP header */
|
|
if (pbuf_add_header(p, TCP_HLEN)) {
|
|
800b6d8: 2114 movs r1, #20
|
|
800b6da: 68b8 ldr r0, [r7, #8]
|
|
800b6dc: f7fb fbe4 bl 8006ea8 <pbuf_add_header>
|
|
800b6e0: 4603 mov r3, r0
|
|
800b6e2: 2b00 cmp r3, #0
|
|
800b6e4: d004 beq.n 800b6f0 <tcp_create_segment+0xb4>
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_create_segment: no room for TCP header in pbuf.\n"));
|
|
TCP_STATS_INC(tcp.err);
|
|
tcp_seg_free(seg);
|
|
800b6e6: 6938 ldr r0, [r7, #16]
|
|
800b6e8: f7fd f845 bl 8008776 <tcp_seg_free>
|
|
return NULL;
|
|
800b6ec: 2300 movs r3, #0
|
|
800b6ee: e037 b.n 800b760 <tcp_create_segment+0x124>
|
|
}
|
|
seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
|
|
800b6f0: 693b ldr r3, [r7, #16]
|
|
800b6f2: 685b ldr r3, [r3, #4]
|
|
800b6f4: 685a ldr r2, [r3, #4]
|
|
800b6f6: 693b ldr r3, [r7, #16]
|
|
800b6f8: 611a str r2, [r3, #16]
|
|
seg->tcphdr->src = lwip_htons(pcb->local_port);
|
|
800b6fa: 68fb ldr r3, [r7, #12]
|
|
800b6fc: 8ada ldrh r2, [r3, #22]
|
|
800b6fe: 693b ldr r3, [r7, #16]
|
|
800b700: 691c ldr r4, [r3, #16]
|
|
800b702: 4610 mov r0, r2
|
|
800b704: f7f9 ff22 bl 800554c <lwip_htons>
|
|
800b708: 4603 mov r3, r0
|
|
800b70a: 8023 strh r3, [r4, #0]
|
|
seg->tcphdr->dest = lwip_htons(pcb->remote_port);
|
|
800b70c: 68fb ldr r3, [r7, #12]
|
|
800b70e: 8b1a ldrh r2, [r3, #24]
|
|
800b710: 693b ldr r3, [r7, #16]
|
|
800b712: 691c ldr r4, [r3, #16]
|
|
800b714: 4610 mov r0, r2
|
|
800b716: f7f9 ff19 bl 800554c <lwip_htons>
|
|
800b71a: 4603 mov r3, r0
|
|
800b71c: 8063 strh r3, [r4, #2]
|
|
seg->tcphdr->seqno = lwip_htonl(seqno);
|
|
800b71e: 693b ldr r3, [r7, #16]
|
|
800b720: 691c ldr r4, [r3, #16]
|
|
800b722: 6838 ldr r0, [r7, #0]
|
|
800b724: f7f9 ff27 bl 8005576 <lwip_htonl>
|
|
800b728: 4603 mov r3, r0
|
|
800b72a: 6063 str r3, [r4, #4]
|
|
/* ackno is set in tcp_output */
|
|
TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), hdrflags);
|
|
800b72c: 7dfb ldrb r3, [r7, #23]
|
|
800b72e: 089b lsrs r3, r3, #2
|
|
800b730: b2db uxtb r3, r3
|
|
800b732: b29b uxth r3, r3
|
|
800b734: 3305 adds r3, #5
|
|
800b736: b29b uxth r3, r3
|
|
800b738: 031b lsls r3, r3, #12
|
|
800b73a: b29a uxth r2, r3
|
|
800b73c: 79fb ldrb r3, [r7, #7]
|
|
800b73e: b29b uxth r3, r3
|
|
800b740: 4313 orrs r3, r2
|
|
800b742: b29a uxth r2, r3
|
|
800b744: 693b ldr r3, [r7, #16]
|
|
800b746: 691c ldr r4, [r3, #16]
|
|
800b748: 4610 mov r0, r2
|
|
800b74a: f7f9 feff bl 800554c <lwip_htons>
|
|
800b74e: 4603 mov r3, r0
|
|
800b750: 81a3 strh r3, [r4, #12]
|
|
/* wnd and chksum are set in tcp_output */
|
|
seg->tcphdr->urgp = 0;
|
|
800b752: 693b ldr r3, [r7, #16]
|
|
800b754: 691b ldr r3, [r3, #16]
|
|
800b756: 2200 movs r2, #0
|
|
800b758: 749a strb r2, [r3, #18]
|
|
800b75a: 2200 movs r2, #0
|
|
800b75c: 74da strb r2, [r3, #19]
|
|
return seg;
|
|
800b75e: 693b ldr r3, [r7, #16]
|
|
}
|
|
800b760: 4618 mov r0, r3
|
|
800b762: 371c adds r7, #28
|
|
800b764: 46bd mov sp, r7
|
|
800b766: bd90 pop {r4, r7, pc}
|
|
800b768: 08013618 .word 0x08013618
|
|
800b76c: 0801364c .word 0x0801364c
|
|
800b770: 0801366c .word 0x0801366c
|
|
800b774: 08013694 .word 0x08013694
|
|
800b778: 080136b8 .word 0x080136b8
|
|
|
|
0800b77c <tcp_pbuf_prealloc>:
|
|
#if TCP_OVERSIZE
|
|
static struct pbuf *
|
|
tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
|
|
u16_t *oversize, const struct tcp_pcb *pcb, u8_t apiflags,
|
|
u8_t first_seg)
|
|
{
|
|
800b77c: b580 push {r7, lr}
|
|
800b77e: b086 sub sp, #24
|
|
800b780: af00 add r7, sp, #0
|
|
800b782: 607b str r3, [r7, #4]
|
|
800b784: 4603 mov r3, r0
|
|
800b786: 73fb strb r3, [r7, #15]
|
|
800b788: 460b mov r3, r1
|
|
800b78a: 81bb strh r3, [r7, #12]
|
|
800b78c: 4613 mov r3, r2
|
|
800b78e: 817b strh r3, [r7, #10]
|
|
struct pbuf *p;
|
|
u16_t alloc = length;
|
|
800b790: 89bb ldrh r3, [r7, #12]
|
|
800b792: 82fb strh r3, [r7, #22]
|
|
|
|
LWIP_ASSERT("tcp_pbuf_prealloc: invalid oversize", oversize != NULL);
|
|
800b794: 687b ldr r3, [r7, #4]
|
|
800b796: 2b00 cmp r3, #0
|
|
800b798: d105 bne.n 800b7a6 <tcp_pbuf_prealloc+0x2a>
|
|
800b79a: 4b30 ldr r3, [pc, #192] ; (800b85c <tcp_pbuf_prealloc+0xe0>)
|
|
800b79c: 22e8 movs r2, #232 ; 0xe8
|
|
800b79e: 4930 ldr r1, [pc, #192] ; (800b860 <tcp_pbuf_prealloc+0xe4>)
|
|
800b7a0: 4830 ldr r0, [pc, #192] ; (800b864 <tcp_pbuf_prealloc+0xe8>)
|
|
800b7a2: f005 fa11 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_pbuf_prealloc: invalid pcb", pcb != NULL);
|
|
800b7a6: 6a3b ldr r3, [r7, #32]
|
|
800b7a8: 2b00 cmp r3, #0
|
|
800b7aa: d105 bne.n 800b7b8 <tcp_pbuf_prealloc+0x3c>
|
|
800b7ac: 4b2b ldr r3, [pc, #172] ; (800b85c <tcp_pbuf_prealloc+0xe0>)
|
|
800b7ae: 22e9 movs r2, #233 ; 0xe9
|
|
800b7b0: 492d ldr r1, [pc, #180] ; (800b868 <tcp_pbuf_prealloc+0xec>)
|
|
800b7b2: 482c ldr r0, [pc, #176] ; (800b864 <tcp_pbuf_prealloc+0xe8>)
|
|
800b7b4: f005 fa08 bl 8010bc8 <iprintf>
|
|
LWIP_UNUSED_ARG(pcb);
|
|
LWIP_UNUSED_ARG(apiflags);
|
|
LWIP_UNUSED_ARG(first_seg);
|
|
alloc = max_length;
|
|
#else /* LWIP_NETIF_TX_SINGLE_PBUF */
|
|
if (length < max_length) {
|
|
800b7b8: 89ba ldrh r2, [r7, #12]
|
|
800b7ba: 897b ldrh r3, [r7, #10]
|
|
800b7bc: 429a cmp r2, r3
|
|
800b7be: d221 bcs.n 800b804 <tcp_pbuf_prealloc+0x88>
|
|
*
|
|
* Did the user set TCP_WRITE_FLAG_MORE?
|
|
*
|
|
* Will the Nagle algorithm defer transmission of this segment?
|
|
*/
|
|
if ((apiflags & TCP_WRITE_FLAG_MORE) ||
|
|
800b7c0: f897 3024 ldrb.w r3, [r7, #36] ; 0x24
|
|
800b7c4: f003 0302 and.w r3, r3, #2
|
|
800b7c8: 2b00 cmp r3, #0
|
|
800b7ca: d111 bne.n 800b7f0 <tcp_pbuf_prealloc+0x74>
|
|
(!(pcb->flags & TF_NODELAY) &&
|
|
800b7cc: 6a3b ldr r3, [r7, #32]
|
|
800b7ce: 8b5b ldrh r3, [r3, #26]
|
|
800b7d0: f003 0340 and.w r3, r3, #64 ; 0x40
|
|
if ((apiflags & TCP_WRITE_FLAG_MORE) ||
|
|
800b7d4: 2b00 cmp r3, #0
|
|
800b7d6: d115 bne.n 800b804 <tcp_pbuf_prealloc+0x88>
|
|
(!(pcb->flags & TF_NODELAY) &&
|
|
800b7d8: f897 3028 ldrb.w r3, [r7, #40] ; 0x28
|
|
800b7dc: 2b00 cmp r3, #0
|
|
800b7de: d007 beq.n 800b7f0 <tcp_pbuf_prealloc+0x74>
|
|
(!first_seg ||
|
|
pcb->unsent != NULL ||
|
|
800b7e0: 6a3b ldr r3, [r7, #32]
|
|
800b7e2: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
(!first_seg ||
|
|
800b7e4: 2b00 cmp r3, #0
|
|
800b7e6: d103 bne.n 800b7f0 <tcp_pbuf_prealloc+0x74>
|
|
pcb->unacked != NULL))) {
|
|
800b7e8: 6a3b ldr r3, [r7, #32]
|
|
800b7ea: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
pcb->unsent != NULL ||
|
|
800b7ec: 2b00 cmp r3, #0
|
|
800b7ee: d009 beq.n 800b804 <tcp_pbuf_prealloc+0x88>
|
|
alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(TCP_OVERSIZE_CALC_LENGTH(length)));
|
|
800b7f0: 89bb ldrh r3, [r7, #12]
|
|
800b7f2: f203 231b addw r3, r3, #539 ; 0x21b
|
|
800b7f6: f023 0203 bic.w r2, r3, #3
|
|
800b7fa: 897b ldrh r3, [r7, #10]
|
|
800b7fc: 4293 cmp r3, r2
|
|
800b7fe: bf28 it cs
|
|
800b800: 4613 movcs r3, r2
|
|
800b802: 82fb strh r3, [r7, #22]
|
|
}
|
|
}
|
|
#endif /* LWIP_NETIF_TX_SINGLE_PBUF */
|
|
p = pbuf_alloc(layer, alloc, PBUF_RAM);
|
|
800b804: 8af9 ldrh r1, [r7, #22]
|
|
800b806: 7bfb ldrb r3, [r7, #15]
|
|
800b808: f44f 7220 mov.w r2, #640 ; 0x280
|
|
800b80c: 4618 mov r0, r3
|
|
800b80e: f7fb f8fd bl 8006a0c <pbuf_alloc>
|
|
800b812: 6138 str r0, [r7, #16]
|
|
if (p == NULL) {
|
|
800b814: 693b ldr r3, [r7, #16]
|
|
800b816: 2b00 cmp r3, #0
|
|
800b818: d101 bne.n 800b81e <tcp_pbuf_prealloc+0xa2>
|
|
return NULL;
|
|
800b81a: 2300 movs r3, #0
|
|
800b81c: e019 b.n 800b852 <tcp_pbuf_prealloc+0xd6>
|
|
}
|
|
LWIP_ASSERT("need unchained pbuf", p->next == NULL);
|
|
800b81e: 693b ldr r3, [r7, #16]
|
|
800b820: 681b ldr r3, [r3, #0]
|
|
800b822: 2b00 cmp r3, #0
|
|
800b824: d006 beq.n 800b834 <tcp_pbuf_prealloc+0xb8>
|
|
800b826: 4b0d ldr r3, [pc, #52] ; (800b85c <tcp_pbuf_prealloc+0xe0>)
|
|
800b828: f240 120b movw r2, #267 ; 0x10b
|
|
800b82c: 490f ldr r1, [pc, #60] ; (800b86c <tcp_pbuf_prealloc+0xf0>)
|
|
800b82e: 480d ldr r0, [pc, #52] ; (800b864 <tcp_pbuf_prealloc+0xe8>)
|
|
800b830: f005 f9ca bl 8010bc8 <iprintf>
|
|
*oversize = p->len - length;
|
|
800b834: 693b ldr r3, [r7, #16]
|
|
800b836: 895a ldrh r2, [r3, #10]
|
|
800b838: 89bb ldrh r3, [r7, #12]
|
|
800b83a: 1ad3 subs r3, r2, r3
|
|
800b83c: b29a uxth r2, r3
|
|
800b83e: 687b ldr r3, [r7, #4]
|
|
800b840: 801a strh r2, [r3, #0]
|
|
/* trim p->len to the currently used size */
|
|
p->len = p->tot_len = length;
|
|
800b842: 693b ldr r3, [r7, #16]
|
|
800b844: 89ba ldrh r2, [r7, #12]
|
|
800b846: 811a strh r2, [r3, #8]
|
|
800b848: 693b ldr r3, [r7, #16]
|
|
800b84a: 891a ldrh r2, [r3, #8]
|
|
800b84c: 693b ldr r3, [r7, #16]
|
|
800b84e: 815a strh r2, [r3, #10]
|
|
return p;
|
|
800b850: 693b ldr r3, [r7, #16]
|
|
}
|
|
800b852: 4618 mov r0, r3
|
|
800b854: 3718 adds r7, #24
|
|
800b856: 46bd mov sp, r7
|
|
800b858: bd80 pop {r7, pc}
|
|
800b85a: bf00 nop
|
|
800b85c: 08013618 .word 0x08013618
|
|
800b860: 080136d0 .word 0x080136d0
|
|
800b864: 0801366c .word 0x0801366c
|
|
800b868: 080136f4 .word 0x080136f4
|
|
800b86c: 08013714 .word 0x08013714
|
|
|
|
0800b870 <tcp_write_checks>:
|
|
* @param len length of data to send (checked agains snd_buf)
|
|
* @return ERR_OK if tcp_write is allowed to proceed, another err_t otherwise
|
|
*/
|
|
static err_t
|
|
tcp_write_checks(struct tcp_pcb *pcb, u16_t len)
|
|
{
|
|
800b870: b580 push {r7, lr}
|
|
800b872: b082 sub sp, #8
|
|
800b874: af00 add r7, sp, #0
|
|
800b876: 6078 str r0, [r7, #4]
|
|
800b878: 460b mov r3, r1
|
|
800b87a: 807b strh r3, [r7, #2]
|
|
LWIP_ASSERT("tcp_write_checks: invalid pcb", pcb != NULL);
|
|
800b87c: 687b ldr r3, [r7, #4]
|
|
800b87e: 2b00 cmp r3, #0
|
|
800b880: d106 bne.n 800b890 <tcp_write_checks+0x20>
|
|
800b882: 4b33 ldr r3, [pc, #204] ; (800b950 <tcp_write_checks+0xe0>)
|
|
800b884: f240 1233 movw r2, #307 ; 0x133
|
|
800b888: 4932 ldr r1, [pc, #200] ; (800b954 <tcp_write_checks+0xe4>)
|
|
800b88a: 4833 ldr r0, [pc, #204] ; (800b958 <tcp_write_checks+0xe8>)
|
|
800b88c: f005 f99c bl 8010bc8 <iprintf>
|
|
|
|
/* connection is in invalid state for data transmission? */
|
|
if ((pcb->state != ESTABLISHED) &&
|
|
800b890: 687b ldr r3, [r7, #4]
|
|
800b892: 7d1b ldrb r3, [r3, #20]
|
|
800b894: 2b04 cmp r3, #4
|
|
800b896: d00e beq.n 800b8b6 <tcp_write_checks+0x46>
|
|
(pcb->state != CLOSE_WAIT) &&
|
|
800b898: 687b ldr r3, [r7, #4]
|
|
800b89a: 7d1b ldrb r3, [r3, #20]
|
|
if ((pcb->state != ESTABLISHED) &&
|
|
800b89c: 2b07 cmp r3, #7
|
|
800b89e: d00a beq.n 800b8b6 <tcp_write_checks+0x46>
|
|
(pcb->state != SYN_SENT) &&
|
|
800b8a0: 687b ldr r3, [r7, #4]
|
|
800b8a2: 7d1b ldrb r3, [r3, #20]
|
|
(pcb->state != CLOSE_WAIT) &&
|
|
800b8a4: 2b02 cmp r3, #2
|
|
800b8a6: d006 beq.n 800b8b6 <tcp_write_checks+0x46>
|
|
(pcb->state != SYN_RCVD)) {
|
|
800b8a8: 687b ldr r3, [r7, #4]
|
|
800b8aa: 7d1b ldrb r3, [r3, #20]
|
|
(pcb->state != SYN_SENT) &&
|
|
800b8ac: 2b03 cmp r3, #3
|
|
800b8ae: d002 beq.n 800b8b6 <tcp_write_checks+0x46>
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n"));
|
|
return ERR_CONN;
|
|
800b8b0: f06f 030a mvn.w r3, #10
|
|
800b8b4: e048 b.n 800b948 <tcp_write_checks+0xd8>
|
|
} else if (len == 0) {
|
|
800b8b6: 887b ldrh r3, [r7, #2]
|
|
800b8b8: 2b00 cmp r3, #0
|
|
800b8ba: d101 bne.n 800b8c0 <tcp_write_checks+0x50>
|
|
return ERR_OK;
|
|
800b8bc: 2300 movs r3, #0
|
|
800b8be: e043 b.n 800b948 <tcp_write_checks+0xd8>
|
|
}
|
|
|
|
/* fail on too much data */
|
|
if (len > pcb->snd_buf) {
|
|
800b8c0: 687b ldr r3, [r7, #4]
|
|
800b8c2: f8b3 3064 ldrh.w r3, [r3, #100] ; 0x64
|
|
800b8c6: 887a ldrh r2, [r7, #2]
|
|
800b8c8: 429a cmp r2, r3
|
|
800b8ca: d909 bls.n 800b8e0 <tcp_write_checks+0x70>
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too much data (len=%"U16_F" > snd_buf=%"TCPWNDSIZE_F")\n",
|
|
len, pcb->snd_buf));
|
|
tcp_set_flags(pcb, TF_NAGLEMEMERR);
|
|
800b8cc: 687b ldr r3, [r7, #4]
|
|
800b8ce: 8b5b ldrh r3, [r3, #26]
|
|
800b8d0: f043 0380 orr.w r3, r3, #128 ; 0x80
|
|
800b8d4: b29a uxth r2, r3
|
|
800b8d6: 687b ldr r3, [r7, #4]
|
|
800b8d8: 835a strh r2, [r3, #26]
|
|
return ERR_MEM;
|
|
800b8da: f04f 33ff mov.w r3, #4294967295
|
|
800b8de: e033 b.n 800b948 <tcp_write_checks+0xd8>
|
|
LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: queuelen: %"TCPWNDSIZE_F"\n", (tcpwnd_size_t)pcb->snd_queuelen));
|
|
|
|
/* If total number of pbufs on the unsent/unacked queues exceeds the
|
|
* configured maximum, return an error */
|
|
/* check for configured max queuelen and possible overflow */
|
|
if (pcb->snd_queuelen >= LWIP_MIN(TCP_SND_QUEUELEN, (TCP_SNDQUEUELEN_OVERFLOW + 1))) {
|
|
800b8e0: 687b ldr r3, [r7, #4]
|
|
800b8e2: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800b8e6: 2b08 cmp r3, #8
|
|
800b8e8: d909 bls.n 800b8fe <tcp_write_checks+0x8e>
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n",
|
|
pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN));
|
|
TCP_STATS_INC(tcp.memerr);
|
|
tcp_set_flags(pcb, TF_NAGLEMEMERR);
|
|
800b8ea: 687b ldr r3, [r7, #4]
|
|
800b8ec: 8b5b ldrh r3, [r3, #26]
|
|
800b8ee: f043 0380 orr.w r3, r3, #128 ; 0x80
|
|
800b8f2: b29a uxth r2, r3
|
|
800b8f4: 687b ldr r3, [r7, #4]
|
|
800b8f6: 835a strh r2, [r3, #26]
|
|
return ERR_MEM;
|
|
800b8f8: f04f 33ff mov.w r3, #4294967295
|
|
800b8fc: e024 b.n 800b948 <tcp_write_checks+0xd8>
|
|
}
|
|
if (pcb->snd_queuelen != 0) {
|
|
800b8fe: 687b ldr r3, [r7, #4]
|
|
800b900: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800b904: 2b00 cmp r3, #0
|
|
800b906: d00f beq.n 800b928 <tcp_write_checks+0xb8>
|
|
LWIP_ASSERT("tcp_write: pbufs on queue => at least one queue non-empty",
|
|
800b908: 687b ldr r3, [r7, #4]
|
|
800b90a: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800b90c: 2b00 cmp r3, #0
|
|
800b90e: d11a bne.n 800b946 <tcp_write_checks+0xd6>
|
|
800b910: 687b ldr r3, [r7, #4]
|
|
800b912: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800b914: 2b00 cmp r3, #0
|
|
800b916: d116 bne.n 800b946 <tcp_write_checks+0xd6>
|
|
800b918: 4b0d ldr r3, [pc, #52] ; (800b950 <tcp_write_checks+0xe0>)
|
|
800b91a: f240 1255 movw r2, #341 ; 0x155
|
|
800b91e: 490f ldr r1, [pc, #60] ; (800b95c <tcp_write_checks+0xec>)
|
|
800b920: 480d ldr r0, [pc, #52] ; (800b958 <tcp_write_checks+0xe8>)
|
|
800b922: f005 f951 bl 8010bc8 <iprintf>
|
|
800b926: e00e b.n 800b946 <tcp_write_checks+0xd6>
|
|
pcb->unacked != NULL || pcb->unsent != NULL);
|
|
} else {
|
|
LWIP_ASSERT("tcp_write: no pbufs on queue => both queues empty",
|
|
800b928: 687b ldr r3, [r7, #4]
|
|
800b92a: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800b92c: 2b00 cmp r3, #0
|
|
800b92e: d103 bne.n 800b938 <tcp_write_checks+0xc8>
|
|
800b930: 687b ldr r3, [r7, #4]
|
|
800b932: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800b934: 2b00 cmp r3, #0
|
|
800b936: d006 beq.n 800b946 <tcp_write_checks+0xd6>
|
|
800b938: 4b05 ldr r3, [pc, #20] ; (800b950 <tcp_write_checks+0xe0>)
|
|
800b93a: f44f 72ac mov.w r2, #344 ; 0x158
|
|
800b93e: 4908 ldr r1, [pc, #32] ; (800b960 <tcp_write_checks+0xf0>)
|
|
800b940: 4805 ldr r0, [pc, #20] ; (800b958 <tcp_write_checks+0xe8>)
|
|
800b942: f005 f941 bl 8010bc8 <iprintf>
|
|
pcb->unacked == NULL && pcb->unsent == NULL);
|
|
}
|
|
return ERR_OK;
|
|
800b946: 2300 movs r3, #0
|
|
}
|
|
800b948: 4618 mov r0, r3
|
|
800b94a: 3708 adds r7, #8
|
|
800b94c: 46bd mov sp, r7
|
|
800b94e: bd80 pop {r7, pc}
|
|
800b950: 08013618 .word 0x08013618
|
|
800b954: 08013728 .word 0x08013728
|
|
800b958: 0801366c .word 0x0801366c
|
|
800b95c: 08013748 .word 0x08013748
|
|
800b960: 08013784 .word 0x08013784
|
|
|
|
0800b964 <tcp_write>:
|
|
* - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will not be set on last segment sent,
|
|
* @return ERR_OK if enqueued, another err_t on error
|
|
*/
|
|
err_t
|
|
tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
|
|
{
|
|
800b964: b590 push {r4, r7, lr}
|
|
800b966: b09d sub sp, #116 ; 0x74
|
|
800b968: af04 add r7, sp, #16
|
|
800b96a: 60f8 str r0, [r7, #12]
|
|
800b96c: 60b9 str r1, [r7, #8]
|
|
800b96e: 4611 mov r1, r2
|
|
800b970: 461a mov r2, r3
|
|
800b972: 460b mov r3, r1
|
|
800b974: 80fb strh r3, [r7, #6]
|
|
800b976: 4613 mov r3, r2
|
|
800b978: 717b strb r3, [r7, #5]
|
|
struct pbuf *concat_p = NULL;
|
|
800b97a: 2300 movs r3, #0
|
|
800b97c: 63fb str r3, [r7, #60] ; 0x3c
|
|
struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
|
|
800b97e: 2300 movs r3, #0
|
|
800b980: 643b str r3, [r7, #64] ; 0x40
|
|
800b982: 2300 movs r3, #0
|
|
800b984: 657b str r3, [r7, #84] ; 0x54
|
|
800b986: 2300 movs r3, #0
|
|
800b988: 653b str r3, [r7, #80] ; 0x50
|
|
800b98a: 2300 movs r3, #0
|
|
800b98c: 64fb str r3, [r7, #76] ; 0x4c
|
|
u16_t pos = 0; /* position in 'arg' data */
|
|
800b98e: 2300 movs r3, #0
|
|
800b990: f8a7 304a strh.w r3, [r7, #74] ; 0x4a
|
|
u16_t queuelen;
|
|
u8_t optlen;
|
|
u8_t optflags = 0;
|
|
800b994: 2300 movs r3, #0
|
|
800b996: f887 302b strb.w r3, [r7, #43] ; 0x2b
|
|
#if TCP_OVERSIZE
|
|
u16_t oversize = 0;
|
|
800b99a: 2300 movs r3, #0
|
|
800b99c: 82fb strh r3, [r7, #22]
|
|
u16_t oversize_used = 0;
|
|
800b99e: 2300 movs r3, #0
|
|
800b9a0: f8a7 3046 strh.w r3, [r7, #70] ; 0x46
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
u16_t oversize_add = 0;
|
|
800b9a4: 2300 movs r3, #0
|
|
800b9a6: f8a7 305a strh.w r3, [r7, #90] ; 0x5a
|
|
#endif /* TCP_OVERSIZE_DBGCHECK*/
|
|
#endif /* TCP_OVERSIZE */
|
|
u16_t extendlen = 0;
|
|
800b9aa: 2300 movs r3, #0
|
|
800b9ac: f8a7 305e strh.w r3, [r7, #94] ; 0x5e
|
|
u16_t concat_chksummed = 0;
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
err_t err;
|
|
u16_t mss_local;
|
|
|
|
LWIP_ERROR("tcp_write: invalid pcb", pcb != NULL, return ERR_ARG);
|
|
800b9b0: 68fb ldr r3, [r7, #12]
|
|
800b9b2: 2b00 cmp r3, #0
|
|
800b9b4: d109 bne.n 800b9ca <tcp_write+0x66>
|
|
800b9b6: 4b9c ldr r3, [pc, #624] ; (800bc28 <tcp_write+0x2c4>)
|
|
800b9b8: f44f 72cf mov.w r2, #414 ; 0x19e
|
|
800b9bc: 499b ldr r1, [pc, #620] ; (800bc2c <tcp_write+0x2c8>)
|
|
800b9be: 489c ldr r0, [pc, #624] ; (800bc30 <tcp_write+0x2cc>)
|
|
800b9c0: f005 f902 bl 8010bc8 <iprintf>
|
|
800b9c4: f06f 030f mvn.w r3, #15
|
|
800b9c8: e379 b.n 800c0be <tcp_write+0x75a>
|
|
|
|
/* don't allocate segments bigger than half the maximum window we ever received */
|
|
mss_local = LWIP_MIN(pcb->mss, TCPWND_MIN16(pcb->snd_wnd_max / 2));
|
|
800b9ca: 68fb ldr r3, [r7, #12]
|
|
800b9cc: f8b3 3062 ldrh.w r3, [r3, #98] ; 0x62
|
|
800b9d0: 085b lsrs r3, r3, #1
|
|
800b9d2: b29a uxth r2, r3
|
|
800b9d4: 68fb ldr r3, [r7, #12]
|
|
800b9d6: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800b9d8: 4293 cmp r3, r2
|
|
800b9da: bf28 it cs
|
|
800b9dc: 4613 movcs r3, r2
|
|
800b9de: 853b strh r3, [r7, #40] ; 0x28
|
|
mss_local = mss_local ? mss_local : pcb->mss;
|
|
800b9e0: 8d3b ldrh r3, [r7, #40] ; 0x28
|
|
800b9e2: 2b00 cmp r3, #0
|
|
800b9e4: d102 bne.n 800b9ec <tcp_write+0x88>
|
|
800b9e6: 68fb ldr r3, [r7, #12]
|
|
800b9e8: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800b9ea: e000 b.n 800b9ee <tcp_write+0x8a>
|
|
800b9ec: 8d3b ldrh r3, [r7, #40] ; 0x28
|
|
800b9ee: 853b strh r3, [r7, #40] ; 0x28
|
|
apiflags |= TCP_WRITE_FLAG_COPY;
|
|
#endif /* LWIP_NETIF_TX_SINGLE_PBUF */
|
|
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n",
|
|
(void *)pcb, arg, len, (u16_t)apiflags));
|
|
LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
|
|
800b9f0: 68bb ldr r3, [r7, #8]
|
|
800b9f2: 2b00 cmp r3, #0
|
|
800b9f4: d109 bne.n 800ba0a <tcp_write+0xa6>
|
|
800b9f6: 4b8c ldr r3, [pc, #560] ; (800bc28 <tcp_write+0x2c4>)
|
|
800b9f8: f240 12ad movw r2, #429 ; 0x1ad
|
|
800b9fc: 498d ldr r1, [pc, #564] ; (800bc34 <tcp_write+0x2d0>)
|
|
800b9fe: 488c ldr r0, [pc, #560] ; (800bc30 <tcp_write+0x2cc>)
|
|
800ba00: f005 f8e2 bl 8010bc8 <iprintf>
|
|
800ba04: f06f 030f mvn.w r3, #15
|
|
800ba08: e359 b.n 800c0be <tcp_write+0x75a>
|
|
arg != NULL, return ERR_ARG;);
|
|
|
|
err = tcp_write_checks(pcb, len);
|
|
800ba0a: 88fb ldrh r3, [r7, #6]
|
|
800ba0c: 4619 mov r1, r3
|
|
800ba0e: 68f8 ldr r0, [r7, #12]
|
|
800ba10: f7ff ff2e bl 800b870 <tcp_write_checks>
|
|
800ba14: 4603 mov r3, r0
|
|
800ba16: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
if (err != ERR_OK) {
|
|
800ba1a: f997 3027 ldrsb.w r3, [r7, #39] ; 0x27
|
|
800ba1e: 2b00 cmp r3, #0
|
|
800ba20: d002 beq.n 800ba28 <tcp_write+0xc4>
|
|
return err;
|
|
800ba22: f997 3027 ldrsb.w r3, [r7, #39] ; 0x27
|
|
800ba26: e34a b.n 800c0be <tcp_write+0x75a>
|
|
}
|
|
queuelen = pcb->snd_queuelen;
|
|
800ba28: 68fb ldr r3, [r7, #12]
|
|
800ba2a: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800ba2e: f8a7 3048 strh.w r3, [r7, #72] ; 0x48
|
|
/* ensure that segments can hold at least one data byte... */
|
|
mss_local = LWIP_MAX(mss_local, LWIP_TCP_OPT_LEN_TS + 1);
|
|
} else
|
|
#endif /* LWIP_TCP_TIMESTAMPS */
|
|
{
|
|
optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
|
|
800ba32: 2300 movs r3, #0
|
|
800ba34: f887 3026 strb.w r3, [r7, #38] ; 0x26
|
|
*
|
|
* pos records progress as data is segmented.
|
|
*/
|
|
|
|
/* Find the tail of the unsent queue. */
|
|
if (pcb->unsent != NULL) {
|
|
800ba38: 68fb ldr r3, [r7, #12]
|
|
800ba3a: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800ba3c: 2b00 cmp r3, #0
|
|
800ba3e: f000 8127 beq.w 800bc90 <tcp_write+0x32c>
|
|
u16_t space;
|
|
u16_t unsent_optlen;
|
|
|
|
/* @todo: this could be sped up by keeping last_unsent in the pcb */
|
|
for (last_unsent = pcb->unsent; last_unsent->next != NULL;
|
|
800ba42: 68fb ldr r3, [r7, #12]
|
|
800ba44: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800ba46: 643b str r3, [r7, #64] ; 0x40
|
|
800ba48: e002 b.n 800ba50 <tcp_write+0xec>
|
|
last_unsent = last_unsent->next);
|
|
800ba4a: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800ba4c: 681b ldr r3, [r3, #0]
|
|
800ba4e: 643b str r3, [r7, #64] ; 0x40
|
|
for (last_unsent = pcb->unsent; last_unsent->next != NULL;
|
|
800ba50: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800ba52: 681b ldr r3, [r3, #0]
|
|
800ba54: 2b00 cmp r3, #0
|
|
800ba56: d1f8 bne.n 800ba4a <tcp_write+0xe6>
|
|
|
|
/* Usable space at the end of the last unsent segment */
|
|
unsent_optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(last_unsent->flags, pcb);
|
|
800ba58: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800ba5a: 7b1b ldrb r3, [r3, #12]
|
|
800ba5c: 009b lsls r3, r3, #2
|
|
800ba5e: b29b uxth r3, r3
|
|
800ba60: f003 0304 and.w r3, r3, #4
|
|
800ba64: 84bb strh r3, [r7, #36] ; 0x24
|
|
LWIP_ASSERT("mss_local is too small", mss_local >= last_unsent->len + unsent_optlen);
|
|
800ba66: 8d3a ldrh r2, [r7, #40] ; 0x28
|
|
800ba68: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800ba6a: 891b ldrh r3, [r3, #8]
|
|
800ba6c: 4619 mov r1, r3
|
|
800ba6e: 8cbb ldrh r3, [r7, #36] ; 0x24
|
|
800ba70: 440b add r3, r1
|
|
800ba72: 429a cmp r2, r3
|
|
800ba74: da06 bge.n 800ba84 <tcp_write+0x120>
|
|
800ba76: 4b6c ldr r3, [pc, #432] ; (800bc28 <tcp_write+0x2c4>)
|
|
800ba78: f44f 72f3 mov.w r2, #486 ; 0x1e6
|
|
800ba7c: 496e ldr r1, [pc, #440] ; (800bc38 <tcp_write+0x2d4>)
|
|
800ba7e: 486c ldr r0, [pc, #432] ; (800bc30 <tcp_write+0x2cc>)
|
|
800ba80: f005 f8a2 bl 8010bc8 <iprintf>
|
|
space = mss_local - (last_unsent->len + unsent_optlen);
|
|
800ba84: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800ba86: 891a ldrh r2, [r3, #8]
|
|
800ba88: 8cbb ldrh r3, [r7, #36] ; 0x24
|
|
800ba8a: 4413 add r3, r2
|
|
800ba8c: b29b uxth r3, r3
|
|
800ba8e: 8d3a ldrh r2, [r7, #40] ; 0x28
|
|
800ba90: 1ad3 subs r3, r2, r3
|
|
800ba92: f8a7 305c strh.w r3, [r7, #92] ; 0x5c
|
|
* function.
|
|
*/
|
|
#if TCP_OVERSIZE
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
/* check that pcb->unsent_oversize matches last_unsent->oversize_left */
|
|
LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
|
|
800ba96: 68fb ldr r3, [r7, #12]
|
|
800ba98: f8b3 2068 ldrh.w r2, [r3, #104] ; 0x68
|
|
800ba9c: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800ba9e: 895b ldrh r3, [r3, #10]
|
|
800baa0: 429a cmp r2, r3
|
|
800baa2: d006 beq.n 800bab2 <tcp_write+0x14e>
|
|
800baa4: 4b60 ldr r3, [pc, #384] ; (800bc28 <tcp_write+0x2c4>)
|
|
800baa6: f240 12f3 movw r2, #499 ; 0x1f3
|
|
800baaa: 4964 ldr r1, [pc, #400] ; (800bc3c <tcp_write+0x2d8>)
|
|
800baac: 4860 ldr r0, [pc, #384] ; (800bc30 <tcp_write+0x2cc>)
|
|
800baae: f005 f88b bl 8010bc8 <iprintf>
|
|
pcb->unsent_oversize == last_unsent->oversize_left);
|
|
#endif /* TCP_OVERSIZE_DBGCHECK */
|
|
oversize = pcb->unsent_oversize;
|
|
800bab2: 68fb ldr r3, [r7, #12]
|
|
800bab4: f8b3 3068 ldrh.w r3, [r3, #104] ; 0x68
|
|
800bab8: 82fb strh r3, [r7, #22]
|
|
if (oversize > 0) {
|
|
800baba: 8afb ldrh r3, [r7, #22]
|
|
800babc: 2b00 cmp r3, #0
|
|
800babe: d02e beq.n 800bb1e <tcp_write+0x1ba>
|
|
LWIP_ASSERT("inconsistent oversize vs. space", oversize <= space);
|
|
800bac0: 8afb ldrh r3, [r7, #22]
|
|
800bac2: f8b7 205c ldrh.w r2, [r7, #92] ; 0x5c
|
|
800bac6: 429a cmp r2, r3
|
|
800bac8: d206 bcs.n 800bad8 <tcp_write+0x174>
|
|
800baca: 4b57 ldr r3, [pc, #348] ; (800bc28 <tcp_write+0x2c4>)
|
|
800bacc: f44f 72fc mov.w r2, #504 ; 0x1f8
|
|
800bad0: 495b ldr r1, [pc, #364] ; (800bc40 <tcp_write+0x2dc>)
|
|
800bad2: 4857 ldr r0, [pc, #348] ; (800bc30 <tcp_write+0x2cc>)
|
|
800bad4: f005 f878 bl 8010bc8 <iprintf>
|
|
seg = last_unsent;
|
|
800bad8: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bada: 657b str r3, [r7, #84] ; 0x54
|
|
oversize_used = LWIP_MIN(space, LWIP_MIN(oversize, len));
|
|
800badc: 8afb ldrh r3, [r7, #22]
|
|
800bade: 88fa ldrh r2, [r7, #6]
|
|
800bae0: 4293 cmp r3, r2
|
|
800bae2: bf28 it cs
|
|
800bae4: 4613 movcs r3, r2
|
|
800bae6: b29b uxth r3, r3
|
|
800bae8: f8b7 205c ldrh.w r2, [r7, #92] ; 0x5c
|
|
800baec: 4293 cmp r3, r2
|
|
800baee: bf28 it cs
|
|
800baf0: 4613 movcs r3, r2
|
|
800baf2: f8a7 3046 strh.w r3, [r7, #70] ; 0x46
|
|
pos += oversize_used;
|
|
800baf6: f8b7 204a ldrh.w r2, [r7, #74] ; 0x4a
|
|
800bafa: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800bafe: 4413 add r3, r2
|
|
800bb00: f8a7 304a strh.w r3, [r7, #74] ; 0x4a
|
|
oversize -= oversize_used;
|
|
800bb04: 8afa ldrh r2, [r7, #22]
|
|
800bb06: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800bb0a: 1ad3 subs r3, r2, r3
|
|
800bb0c: b29b uxth r3, r3
|
|
800bb0e: 82fb strh r3, [r7, #22]
|
|
space -= oversize_used;
|
|
800bb10: f8b7 205c ldrh.w r2, [r7, #92] ; 0x5c
|
|
800bb14: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800bb18: 1ad3 subs r3, r2, r3
|
|
800bb1a: f8a7 305c strh.w r3, [r7, #92] ; 0x5c
|
|
}
|
|
/* now we are either finished or oversize is zero */
|
|
LWIP_ASSERT("inconsistent oversize vs. len", (oversize == 0) || (pos == len));
|
|
800bb1e: 8afb ldrh r3, [r7, #22]
|
|
800bb20: 2b00 cmp r3, #0
|
|
800bb22: d00b beq.n 800bb3c <tcp_write+0x1d8>
|
|
800bb24: f8b7 204a ldrh.w r2, [r7, #74] ; 0x4a
|
|
800bb28: 88fb ldrh r3, [r7, #6]
|
|
800bb2a: 429a cmp r2, r3
|
|
800bb2c: d006 beq.n 800bb3c <tcp_write+0x1d8>
|
|
800bb2e: 4b3e ldr r3, [pc, #248] ; (800bc28 <tcp_write+0x2c4>)
|
|
800bb30: f44f 7200 mov.w r2, #512 ; 0x200
|
|
800bb34: 4943 ldr r1, [pc, #268] ; (800bc44 <tcp_write+0x2e0>)
|
|
800bb36: 483e ldr r0, [pc, #248] ; (800bc30 <tcp_write+0x2cc>)
|
|
800bb38: f005 f846 bl 8010bc8 <iprintf>
|
|
*
|
|
* This phase is skipped for LWIP_NETIF_TX_SINGLE_PBUF as we could only execute
|
|
* it after rexmit puts a segment from unacked to unsent and at this point,
|
|
* oversize info is lost.
|
|
*/
|
|
if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
|
|
800bb3c: f8b7 204a ldrh.w r2, [r7, #74] ; 0x4a
|
|
800bb40: 88fb ldrh r3, [r7, #6]
|
|
800bb42: 429a cmp r2, r3
|
|
800bb44: f080 8172 bcs.w 800be2c <tcp_write+0x4c8>
|
|
800bb48: f8b7 305c ldrh.w r3, [r7, #92] ; 0x5c
|
|
800bb4c: 2b00 cmp r3, #0
|
|
800bb4e: f000 816d beq.w 800be2c <tcp_write+0x4c8>
|
|
800bb52: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bb54: 891b ldrh r3, [r3, #8]
|
|
800bb56: 2b00 cmp r3, #0
|
|
800bb58: f000 8168 beq.w 800be2c <tcp_write+0x4c8>
|
|
u16_t seglen = LWIP_MIN(space, len - pos);
|
|
800bb5c: 88fa ldrh r2, [r7, #6]
|
|
800bb5e: f8b7 304a ldrh.w r3, [r7, #74] ; 0x4a
|
|
800bb62: 1ad2 subs r2, r2, r3
|
|
800bb64: f8b7 305c ldrh.w r3, [r7, #92] ; 0x5c
|
|
800bb68: 4293 cmp r3, r2
|
|
800bb6a: bfa8 it ge
|
|
800bb6c: 4613 movge r3, r2
|
|
800bb6e: 847b strh r3, [r7, #34] ; 0x22
|
|
seg = last_unsent;
|
|
800bb70: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bb72: 657b str r3, [r7, #84] ; 0x54
|
|
|
|
/* Create a pbuf with a copy or reference to seglen bytes. We
|
|
* can use PBUF_RAW here since the data appears in the middle of
|
|
* a segment. A header will never be prepended. */
|
|
if (apiflags & TCP_WRITE_FLAG_COPY) {
|
|
800bb74: 797b ldrb r3, [r7, #5]
|
|
800bb76: f003 0301 and.w r3, r3, #1
|
|
800bb7a: 2b00 cmp r3, #0
|
|
800bb7c: d02b beq.n 800bbd6 <tcp_write+0x272>
|
|
/* Data is copied */
|
|
if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) {
|
|
800bb7e: f107 0016 add.w r0, r7, #22
|
|
800bb82: f8b7 205c ldrh.w r2, [r7, #92] ; 0x5c
|
|
800bb86: 8c79 ldrh r1, [r7, #34] ; 0x22
|
|
800bb88: 2301 movs r3, #1
|
|
800bb8a: 9302 str r3, [sp, #8]
|
|
800bb8c: 797b ldrb r3, [r7, #5]
|
|
800bb8e: 9301 str r3, [sp, #4]
|
|
800bb90: 68fb ldr r3, [r7, #12]
|
|
800bb92: 9300 str r3, [sp, #0]
|
|
800bb94: 4603 mov r3, r0
|
|
800bb96: 2000 movs r0, #0
|
|
800bb98: f7ff fdf0 bl 800b77c <tcp_pbuf_prealloc>
|
|
800bb9c: 63f8 str r0, [r7, #60] ; 0x3c
|
|
800bb9e: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800bba0: 2b00 cmp r3, #0
|
|
800bba2: f000 825a beq.w 800c05a <tcp_write+0x6f6>
|
|
("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n",
|
|
seglen));
|
|
goto memerr;
|
|
}
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
oversize_add = oversize;
|
|
800bba6: 8afb ldrh r3, [r7, #22]
|
|
800bba8: f8a7 305a strh.w r3, [r7, #90] ; 0x5a
|
|
#endif /* TCP_OVERSIZE_DBGCHECK */
|
|
TCP_DATA_COPY2(concat_p->payload, (const u8_t *)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped);
|
|
800bbac: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800bbae: 6858 ldr r0, [r3, #4]
|
|
800bbb0: f8b7 304a ldrh.w r3, [r7, #74] ; 0x4a
|
|
800bbb4: 68ba ldr r2, [r7, #8]
|
|
800bbb6: 4413 add r3, r2
|
|
800bbb8: 8c7a ldrh r2, [r7, #34] ; 0x22
|
|
800bbba: 4619 mov r1, r3
|
|
800bbbc: f005 f9e5 bl 8010f8a <memcpy>
|
|
#if TCP_CHECKSUM_ON_COPY
|
|
concat_chksummed += seglen;
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
queuelen += pbuf_clen(concat_p);
|
|
800bbc0: 6bf8 ldr r0, [r7, #60] ; 0x3c
|
|
800bbc2: f7fb fa8f bl 80070e4 <pbuf_clen>
|
|
800bbc6: 4603 mov r3, r0
|
|
800bbc8: 461a mov r2, r3
|
|
800bbca: f8b7 3048 ldrh.w r3, [r7, #72] ; 0x48
|
|
800bbce: 4413 add r3, r2
|
|
800bbd0: f8a7 3048 strh.w r3, [r7, #72] ; 0x48
|
|
800bbd4: e055 b.n 800bc82 <tcp_write+0x31e>
|
|
} else {
|
|
/* Data is not copied */
|
|
/* If the last unsent pbuf is of type PBUF_ROM, try to extend it. */
|
|
struct pbuf *p;
|
|
for (p = last_unsent->p; p->next != NULL; p = p->next);
|
|
800bbd6: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bbd8: 685b ldr r3, [r3, #4]
|
|
800bbda: 63bb str r3, [r7, #56] ; 0x38
|
|
800bbdc: e002 b.n 800bbe4 <tcp_write+0x280>
|
|
800bbde: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800bbe0: 681b ldr r3, [r3, #0]
|
|
800bbe2: 63bb str r3, [r7, #56] ; 0x38
|
|
800bbe4: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800bbe6: 681b ldr r3, [r3, #0]
|
|
800bbe8: 2b00 cmp r3, #0
|
|
800bbea: d1f8 bne.n 800bbde <tcp_write+0x27a>
|
|
if (((p->type_internal & (PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_DATA_VOLATILE)) == 0) &&
|
|
800bbec: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800bbee: 7b1b ldrb r3, [r3, #12]
|
|
800bbf0: f003 03c0 and.w r3, r3, #192 ; 0xc0
|
|
800bbf4: 2b00 cmp r3, #0
|
|
800bbf6: d129 bne.n 800bc4c <tcp_write+0x2e8>
|
|
(const u8_t *)p->payload + p->len == (const u8_t *)arg) {
|
|
800bbf8: 6bbb ldr r3, [r7, #56] ; 0x38
|
|
800bbfa: 685b ldr r3, [r3, #4]
|
|
800bbfc: 6bba ldr r2, [r7, #56] ; 0x38
|
|
800bbfe: 8952 ldrh r2, [r2, #10]
|
|
800bc00: 4413 add r3, r2
|
|
if (((p->type_internal & (PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_DATA_VOLATILE)) == 0) &&
|
|
800bc02: 68ba ldr r2, [r7, #8]
|
|
800bc04: 429a cmp r2, r3
|
|
800bc06: d121 bne.n 800bc4c <tcp_write+0x2e8>
|
|
LWIP_ASSERT("tcp_write: ROM pbufs cannot be oversized", pos == 0);
|
|
800bc08: f8b7 304a ldrh.w r3, [r7, #74] ; 0x4a
|
|
800bc0c: 2b00 cmp r3, #0
|
|
800bc0e: d006 beq.n 800bc1e <tcp_write+0x2ba>
|
|
800bc10: 4b05 ldr r3, [pc, #20] ; (800bc28 <tcp_write+0x2c4>)
|
|
800bc12: f240 2231 movw r2, #561 ; 0x231
|
|
800bc16: 490c ldr r1, [pc, #48] ; (800bc48 <tcp_write+0x2e4>)
|
|
800bc18: 4805 ldr r0, [pc, #20] ; (800bc30 <tcp_write+0x2cc>)
|
|
800bc1a: f004 ffd5 bl 8010bc8 <iprintf>
|
|
extendlen = seglen;
|
|
800bc1e: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800bc20: f8a7 305e strh.w r3, [r7, #94] ; 0x5e
|
|
800bc24: e02d b.n 800bc82 <tcp_write+0x31e>
|
|
800bc26: bf00 nop
|
|
800bc28: 08013618 .word 0x08013618
|
|
800bc2c: 080137b8 .word 0x080137b8
|
|
800bc30: 0801366c .word 0x0801366c
|
|
800bc34: 080137d0 .word 0x080137d0
|
|
800bc38: 08013804 .word 0x08013804
|
|
800bc3c: 0801381c .word 0x0801381c
|
|
800bc40: 0801384c .word 0x0801384c
|
|
800bc44: 0801386c .word 0x0801386c
|
|
800bc48: 0801388c .word 0x0801388c
|
|
} else {
|
|
if ((concat_p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) {
|
|
800bc4c: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800bc4e: 2201 movs r2, #1
|
|
800bc50: 4619 mov r1, r3
|
|
800bc52: 2000 movs r0, #0
|
|
800bc54: f7fa feda bl 8006a0c <pbuf_alloc>
|
|
800bc58: 63f8 str r0, [r7, #60] ; 0x3c
|
|
800bc5a: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800bc5c: 2b00 cmp r3, #0
|
|
800bc5e: f000 81fe beq.w 800c05e <tcp_write+0x6fa>
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
|
|
("tcp_write: could not allocate memory for zero-copy pbuf\n"));
|
|
goto memerr;
|
|
}
|
|
/* reference the non-volatile payload data */
|
|
((struct pbuf_rom *)concat_p)->payload = (const u8_t *)arg + pos;
|
|
800bc62: f8b7 304a ldrh.w r3, [r7, #74] ; 0x4a
|
|
800bc66: 68ba ldr r2, [r7, #8]
|
|
800bc68: 441a add r2, r3
|
|
800bc6a: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800bc6c: 605a str r2, [r3, #4]
|
|
queuelen += pbuf_clen(concat_p);
|
|
800bc6e: 6bf8 ldr r0, [r7, #60] ; 0x3c
|
|
800bc70: f7fb fa38 bl 80070e4 <pbuf_clen>
|
|
800bc74: 4603 mov r3, r0
|
|
800bc76: 461a mov r2, r3
|
|
800bc78: f8b7 3048 ldrh.w r3, [r7, #72] ; 0x48
|
|
800bc7c: 4413 add r3, r2
|
|
800bc7e: f8a7 3048 strh.w r3, [r7, #72] ; 0x48
|
|
&concat_chksum, &concat_chksum_swapped);
|
|
concat_chksummed += seglen;
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
}
|
|
|
|
pos += seglen;
|
|
800bc82: f8b7 204a ldrh.w r2, [r7, #74] ; 0x4a
|
|
800bc86: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800bc88: 4413 add r3, r2
|
|
800bc8a: f8a7 304a strh.w r3, [r7, #74] ; 0x4a
|
|
800bc8e: e0cd b.n 800be2c <tcp_write+0x4c8>
|
|
}
|
|
#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */
|
|
} else {
|
|
#if TCP_OVERSIZE
|
|
LWIP_ASSERT("unsent_oversize mismatch (pcb->unsent is NULL)",
|
|
800bc90: 68fb ldr r3, [r7, #12]
|
|
800bc92: f8b3 3068 ldrh.w r3, [r3, #104] ; 0x68
|
|
800bc96: 2b00 cmp r3, #0
|
|
800bc98: f000 80c8 beq.w 800be2c <tcp_write+0x4c8>
|
|
800bc9c: 4b72 ldr r3, [pc, #456] ; (800be68 <tcp_write+0x504>)
|
|
800bc9e: f240 224a movw r2, #586 ; 0x24a
|
|
800bca2: 4972 ldr r1, [pc, #456] ; (800be6c <tcp_write+0x508>)
|
|
800bca4: 4872 ldr r0, [pc, #456] ; (800be70 <tcp_write+0x50c>)
|
|
800bca6: f004 ff8f bl 8010bc8 <iprintf>
|
|
* Phase 3: Create new segments.
|
|
*
|
|
* The new segments are chained together in the local 'queue'
|
|
* variable, ready to be appended to pcb->unsent.
|
|
*/
|
|
while (pos < len) {
|
|
800bcaa: e0bf b.n 800be2c <tcp_write+0x4c8>
|
|
struct pbuf *p;
|
|
u16_t left = len - pos;
|
|
800bcac: 88fa ldrh r2, [r7, #6]
|
|
800bcae: f8b7 304a ldrh.w r3, [r7, #74] ; 0x4a
|
|
800bcb2: 1ad3 subs r3, r2, r3
|
|
800bcb4: 843b strh r3, [r7, #32]
|
|
u16_t max_len = mss_local - optlen;
|
|
800bcb6: f897 3026 ldrb.w r3, [r7, #38] ; 0x26
|
|
800bcba: b29b uxth r3, r3
|
|
800bcbc: 8d3a ldrh r2, [r7, #40] ; 0x28
|
|
800bcbe: 1ad3 subs r3, r2, r3
|
|
800bcc0: 83fb strh r3, [r7, #30]
|
|
u16_t seglen = LWIP_MIN(left, max_len);
|
|
800bcc2: 8bfa ldrh r2, [r7, #30]
|
|
800bcc4: 8c3b ldrh r3, [r7, #32]
|
|
800bcc6: 4293 cmp r3, r2
|
|
800bcc8: bf28 it cs
|
|
800bcca: 4613 movcs r3, r2
|
|
800bccc: 83bb strh r3, [r7, #28]
|
|
#if TCP_CHECKSUM_ON_COPY
|
|
u16_t chksum = 0;
|
|
u8_t chksum_swapped = 0;
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
|
|
if (apiflags & TCP_WRITE_FLAG_COPY) {
|
|
800bcce: 797b ldrb r3, [r7, #5]
|
|
800bcd0: f003 0301 and.w r3, r3, #1
|
|
800bcd4: 2b00 cmp r3, #0
|
|
800bcd6: d036 beq.n 800bd46 <tcp_write+0x3e2>
|
|
/* If copy is set, memory should be allocated and data copied
|
|
* into pbuf */
|
|
if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) {
|
|
800bcd8: f897 3026 ldrb.w r3, [r7, #38] ; 0x26
|
|
800bcdc: b29a uxth r2, r3
|
|
800bcde: 8bbb ldrh r3, [r7, #28]
|
|
800bce0: 4413 add r3, r2
|
|
800bce2: b299 uxth r1, r3
|
|
800bce4: 6cfb ldr r3, [r7, #76] ; 0x4c
|
|
800bce6: 2b00 cmp r3, #0
|
|
800bce8: bf0c ite eq
|
|
800bcea: 2301 moveq r3, #1
|
|
800bcec: 2300 movne r3, #0
|
|
800bcee: b2db uxtb r3, r3
|
|
800bcf0: f107 0016 add.w r0, r7, #22
|
|
800bcf4: 8d3a ldrh r2, [r7, #40] ; 0x28
|
|
800bcf6: 9302 str r3, [sp, #8]
|
|
800bcf8: 797b ldrb r3, [r7, #5]
|
|
800bcfa: 9301 str r3, [sp, #4]
|
|
800bcfc: 68fb ldr r3, [r7, #12]
|
|
800bcfe: 9300 str r3, [sp, #0]
|
|
800bd00: 4603 mov r3, r0
|
|
800bd02: 2036 movs r0, #54 ; 0x36
|
|
800bd04: f7ff fd3a bl 800b77c <tcp_pbuf_prealloc>
|
|
800bd08: 6378 str r0, [r7, #52] ; 0x34
|
|
800bd0a: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800bd0c: 2b00 cmp r3, #0
|
|
800bd0e: f000 81a8 beq.w 800c062 <tcp_write+0x6fe>
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", seglen));
|
|
goto memerr;
|
|
}
|
|
LWIP_ASSERT("tcp_write: check that first pbuf can hold the complete seglen",
|
|
800bd12: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800bd14: 895b ldrh r3, [r3, #10]
|
|
800bd16: 8bba ldrh r2, [r7, #28]
|
|
800bd18: 429a cmp r2, r3
|
|
800bd1a: d906 bls.n 800bd2a <tcp_write+0x3c6>
|
|
800bd1c: 4b52 ldr r3, [pc, #328] ; (800be68 <tcp_write+0x504>)
|
|
800bd1e: f240 2266 movw r2, #614 ; 0x266
|
|
800bd22: 4954 ldr r1, [pc, #336] ; (800be74 <tcp_write+0x510>)
|
|
800bd24: 4852 ldr r0, [pc, #328] ; (800be70 <tcp_write+0x50c>)
|
|
800bd26: f004 ff4f bl 8010bc8 <iprintf>
|
|
(p->len >= seglen));
|
|
TCP_DATA_COPY2((char *)p->payload + optlen, (const u8_t *)arg + pos, seglen, &chksum, &chksum_swapped);
|
|
800bd2a: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800bd2c: 685a ldr r2, [r3, #4]
|
|
800bd2e: f897 3026 ldrb.w r3, [r7, #38] ; 0x26
|
|
800bd32: 18d0 adds r0, r2, r3
|
|
800bd34: f8b7 304a ldrh.w r3, [r7, #74] ; 0x4a
|
|
800bd38: 68ba ldr r2, [r7, #8]
|
|
800bd3a: 4413 add r3, r2
|
|
800bd3c: 8bba ldrh r2, [r7, #28]
|
|
800bd3e: 4619 mov r1, r3
|
|
800bd40: f005 f923 bl 8010f8a <memcpy>
|
|
800bd44: e02f b.n 800bda6 <tcp_write+0x442>
|
|
* sent out on the link (as it has to be ACKed by the remote
|
|
* party) we can safely use PBUF_ROM instead of PBUF_REF here.
|
|
*/
|
|
struct pbuf *p2;
|
|
#if TCP_OVERSIZE
|
|
LWIP_ASSERT("oversize == 0", oversize == 0);
|
|
800bd46: 8afb ldrh r3, [r7, #22]
|
|
800bd48: 2b00 cmp r3, #0
|
|
800bd4a: d006 beq.n 800bd5a <tcp_write+0x3f6>
|
|
800bd4c: 4b46 ldr r3, [pc, #280] ; (800be68 <tcp_write+0x504>)
|
|
800bd4e: f240 2271 movw r2, #625 ; 0x271
|
|
800bd52: 4949 ldr r1, [pc, #292] ; (800be78 <tcp_write+0x514>)
|
|
800bd54: 4846 ldr r0, [pc, #280] ; (800be70 <tcp_write+0x50c>)
|
|
800bd56: f004 ff37 bl 8010bc8 <iprintf>
|
|
#endif /* TCP_OVERSIZE */
|
|
if ((p2 = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) {
|
|
800bd5a: 8bbb ldrh r3, [r7, #28]
|
|
800bd5c: 2201 movs r2, #1
|
|
800bd5e: 4619 mov r1, r3
|
|
800bd60: 2036 movs r0, #54 ; 0x36
|
|
800bd62: f7fa fe53 bl 8006a0c <pbuf_alloc>
|
|
800bd66: 61b8 str r0, [r7, #24]
|
|
800bd68: 69bb ldr r3, [r7, #24]
|
|
800bd6a: 2b00 cmp r3, #0
|
|
800bd6c: f000 817b beq.w 800c066 <tcp_write+0x702>
|
|
chksum_swapped = 1;
|
|
chksum = SWAP_BYTES_IN_WORD(chksum);
|
|
}
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
/* reference the non-volatile payload data */
|
|
((struct pbuf_rom *)p2)->payload = (const u8_t *)arg + pos;
|
|
800bd70: f8b7 304a ldrh.w r3, [r7, #74] ; 0x4a
|
|
800bd74: 68ba ldr r2, [r7, #8]
|
|
800bd76: 441a add r2, r3
|
|
800bd78: 69bb ldr r3, [r7, #24]
|
|
800bd7a: 605a str r2, [r3, #4]
|
|
|
|
/* Second, allocate a pbuf for the headers. */
|
|
if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
|
|
800bd7c: f897 3026 ldrb.w r3, [r7, #38] ; 0x26
|
|
800bd80: b29b uxth r3, r3
|
|
800bd82: f44f 7220 mov.w r2, #640 ; 0x280
|
|
800bd86: 4619 mov r1, r3
|
|
800bd88: 2036 movs r0, #54 ; 0x36
|
|
800bd8a: f7fa fe3f bl 8006a0c <pbuf_alloc>
|
|
800bd8e: 6378 str r0, [r7, #52] ; 0x34
|
|
800bd90: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800bd92: 2b00 cmp r3, #0
|
|
800bd94: d103 bne.n 800bd9e <tcp_write+0x43a>
|
|
/* If allocation fails, we have to deallocate the data pbuf as
|
|
* well. */
|
|
pbuf_free(p2);
|
|
800bd96: 69b8 ldr r0, [r7, #24]
|
|
800bd98: f7fb f91c bl 8006fd4 <pbuf_free>
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write: could not allocate memory for header pbuf\n"));
|
|
goto memerr;
|
|
800bd9c: e166 b.n 800c06c <tcp_write+0x708>
|
|
}
|
|
/* Concatenate the headers and data pbufs together. */
|
|
pbuf_cat(p/*header*/, p2/*data*/);
|
|
800bd9e: 69b9 ldr r1, [r7, #24]
|
|
800bda0: 6b78 ldr r0, [r7, #52] ; 0x34
|
|
800bda2: f7fb f9d9 bl 8007158 <pbuf_cat>
|
|
}
|
|
|
|
queuelen += pbuf_clen(p);
|
|
800bda6: 6b78 ldr r0, [r7, #52] ; 0x34
|
|
800bda8: f7fb f99c bl 80070e4 <pbuf_clen>
|
|
800bdac: 4603 mov r3, r0
|
|
800bdae: 461a mov r2, r3
|
|
800bdb0: f8b7 3048 ldrh.w r3, [r7, #72] ; 0x48
|
|
800bdb4: 4413 add r3, r2
|
|
800bdb6: f8a7 3048 strh.w r3, [r7, #72] ; 0x48
|
|
|
|
/* Now that there are more segments queued, we check again if the
|
|
* length of the queue exceeds the configured maximum or
|
|
* overflows. */
|
|
if (queuelen > LWIP_MIN(TCP_SND_QUEUELEN, TCP_SNDQUEUELEN_OVERFLOW)) {
|
|
800bdba: f8b7 3048 ldrh.w r3, [r7, #72] ; 0x48
|
|
800bdbe: 2b09 cmp r3, #9
|
|
800bdc0: d903 bls.n 800bdca <tcp_write+0x466>
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write: queue too long %"U16_F" (%d)\n",
|
|
queuelen, (int)TCP_SND_QUEUELEN));
|
|
pbuf_free(p);
|
|
800bdc2: 6b78 ldr r0, [r7, #52] ; 0x34
|
|
800bdc4: f7fb f906 bl 8006fd4 <pbuf_free>
|
|
goto memerr;
|
|
800bdc8: e150 b.n 800c06c <tcp_write+0x708>
|
|
}
|
|
|
|
if ((seg = tcp_create_segment(pcb, p, 0, pcb->snd_lbb + pos, optflags)) == NULL) {
|
|
800bdca: 68fb ldr r3, [r7, #12]
|
|
800bdcc: 6dda ldr r2, [r3, #92] ; 0x5c
|
|
800bdce: f8b7 304a ldrh.w r3, [r7, #74] ; 0x4a
|
|
800bdd2: 441a add r2, r3
|
|
800bdd4: f897 302b ldrb.w r3, [r7, #43] ; 0x2b
|
|
800bdd8: 9300 str r3, [sp, #0]
|
|
800bdda: 4613 mov r3, r2
|
|
800bddc: 2200 movs r2, #0
|
|
800bdde: 6b79 ldr r1, [r7, #52] ; 0x34
|
|
800bde0: 68f8 ldr r0, [r7, #12]
|
|
800bde2: f7ff fc2b bl 800b63c <tcp_create_segment>
|
|
800bde6: 6578 str r0, [r7, #84] ; 0x54
|
|
800bde8: 6d7b ldr r3, [r7, #84] ; 0x54
|
|
800bdea: 2b00 cmp r3, #0
|
|
800bdec: f000 813d beq.w 800c06a <tcp_write+0x706>
|
|
goto memerr;
|
|
}
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
seg->oversize_left = oversize;
|
|
800bdf0: 8afa ldrh r2, [r7, #22]
|
|
800bdf2: 6d7b ldr r3, [r7, #84] ; 0x54
|
|
800bdf4: 815a strh r2, [r3, #10]
|
|
seg->chksum_swapped = chksum_swapped;
|
|
seg->flags |= TF_SEG_DATA_CHECKSUMMED;
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
|
|
/* first segment of to-be-queued data? */
|
|
if (queue == NULL) {
|
|
800bdf6: 6cfb ldr r3, [r7, #76] ; 0x4c
|
|
800bdf8: 2b00 cmp r3, #0
|
|
800bdfa: d102 bne.n 800be02 <tcp_write+0x49e>
|
|
queue = seg;
|
|
800bdfc: 6d7b ldr r3, [r7, #84] ; 0x54
|
|
800bdfe: 64fb str r3, [r7, #76] ; 0x4c
|
|
800be00: e00c b.n 800be1c <tcp_write+0x4b8>
|
|
} else {
|
|
/* Attach the segment to the end of the queued segments */
|
|
LWIP_ASSERT("prev_seg != NULL", prev_seg != NULL);
|
|
800be02: 6d3b ldr r3, [r7, #80] ; 0x50
|
|
800be04: 2b00 cmp r3, #0
|
|
800be06: d106 bne.n 800be16 <tcp_write+0x4b2>
|
|
800be08: 4b17 ldr r3, [pc, #92] ; (800be68 <tcp_write+0x504>)
|
|
800be0a: f240 22ab movw r2, #683 ; 0x2ab
|
|
800be0e: 491b ldr r1, [pc, #108] ; (800be7c <tcp_write+0x518>)
|
|
800be10: 4817 ldr r0, [pc, #92] ; (800be70 <tcp_write+0x50c>)
|
|
800be12: f004 fed9 bl 8010bc8 <iprintf>
|
|
prev_seg->next = seg;
|
|
800be16: 6d3b ldr r3, [r7, #80] ; 0x50
|
|
800be18: 6d7a ldr r2, [r7, #84] ; 0x54
|
|
800be1a: 601a str r2, [r3, #0]
|
|
}
|
|
/* remember last segment of to-be-queued data for next iteration */
|
|
prev_seg = seg;
|
|
800be1c: 6d7b ldr r3, [r7, #84] ; 0x54
|
|
800be1e: 653b str r3, [r7, #80] ; 0x50
|
|
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n",
|
|
lwip_ntohl(seg->tcphdr->seqno),
|
|
lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg)));
|
|
|
|
pos += seglen;
|
|
800be20: f8b7 204a ldrh.w r2, [r7, #74] ; 0x4a
|
|
800be24: 8bbb ldrh r3, [r7, #28]
|
|
800be26: 4413 add r3, r2
|
|
800be28: f8a7 304a strh.w r3, [r7, #74] ; 0x4a
|
|
while (pos < len) {
|
|
800be2c: f8b7 204a ldrh.w r2, [r7, #74] ; 0x4a
|
|
800be30: 88fb ldrh r3, [r7, #6]
|
|
800be32: 429a cmp r2, r3
|
|
800be34: f4ff af3a bcc.w 800bcac <tcp_write+0x348>
|
|
/*
|
|
* All three segmentation phases were successful. We can commit the
|
|
* transaction.
|
|
*/
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
if ((last_unsent != NULL) && (oversize_add != 0)) {
|
|
800be38: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800be3a: 2b00 cmp r3, #0
|
|
800be3c: d00b beq.n 800be56 <tcp_write+0x4f2>
|
|
800be3e: f8b7 305a ldrh.w r3, [r7, #90] ; 0x5a
|
|
800be42: 2b00 cmp r3, #0
|
|
800be44: d007 beq.n 800be56 <tcp_write+0x4f2>
|
|
last_unsent->oversize_left += oversize_add;
|
|
800be46: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800be48: 895a ldrh r2, [r3, #10]
|
|
800be4a: f8b7 305a ldrh.w r3, [r7, #90] ; 0x5a
|
|
800be4e: 4413 add r3, r2
|
|
800be50: b29a uxth r2, r3
|
|
800be52: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800be54: 815a strh r2, [r3, #10]
|
|
/*
|
|
* Phase 1: If data has been added to the preallocated tail of
|
|
* last_unsent, we update the length fields of the pbuf chain.
|
|
*/
|
|
#if TCP_OVERSIZE
|
|
if (oversize_used > 0) {
|
|
800be56: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800be5a: 2b00 cmp r3, #0
|
|
800be5c: d052 beq.n 800bf04 <tcp_write+0x5a0>
|
|
struct pbuf *p;
|
|
/* Bump tot_len of whole chain, len of tail */
|
|
for (p = last_unsent->p; p; p = p->next) {
|
|
800be5e: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800be60: 685b ldr r3, [r3, #4]
|
|
800be62: 633b str r3, [r7, #48] ; 0x30
|
|
800be64: e02e b.n 800bec4 <tcp_write+0x560>
|
|
800be66: bf00 nop
|
|
800be68: 08013618 .word 0x08013618
|
|
800be6c: 080138b8 .word 0x080138b8
|
|
800be70: 0801366c .word 0x0801366c
|
|
800be74: 080138e8 .word 0x080138e8
|
|
800be78: 08013928 .word 0x08013928
|
|
800be7c: 08013938 .word 0x08013938
|
|
p->tot_len += oversize_used;
|
|
800be80: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800be82: 891a ldrh r2, [r3, #8]
|
|
800be84: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800be88: 4413 add r3, r2
|
|
800be8a: b29a uxth r2, r3
|
|
800be8c: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800be8e: 811a strh r2, [r3, #8]
|
|
if (p->next == NULL) {
|
|
800be90: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800be92: 681b ldr r3, [r3, #0]
|
|
800be94: 2b00 cmp r3, #0
|
|
800be96: d112 bne.n 800bebe <tcp_write+0x55a>
|
|
TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);
|
|
800be98: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800be9a: 685b ldr r3, [r3, #4]
|
|
800be9c: 6b3a ldr r2, [r7, #48] ; 0x30
|
|
800be9e: 8952 ldrh r2, [r2, #10]
|
|
800bea0: 4413 add r3, r2
|
|
800bea2: f8b7 2046 ldrh.w r2, [r7, #70] ; 0x46
|
|
800bea6: 68b9 ldr r1, [r7, #8]
|
|
800bea8: 4618 mov r0, r3
|
|
800beaa: f005 f86e bl 8010f8a <memcpy>
|
|
p->len += oversize_used;
|
|
800beae: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800beb0: 895a ldrh r2, [r3, #10]
|
|
800beb2: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800beb6: 4413 add r3, r2
|
|
800beb8: b29a uxth r2, r3
|
|
800beba: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800bebc: 815a strh r2, [r3, #10]
|
|
for (p = last_unsent->p; p; p = p->next) {
|
|
800bebe: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800bec0: 681b ldr r3, [r3, #0]
|
|
800bec2: 633b str r3, [r7, #48] ; 0x30
|
|
800bec4: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800bec6: 2b00 cmp r3, #0
|
|
800bec8: d1da bne.n 800be80 <tcp_write+0x51c>
|
|
}
|
|
}
|
|
last_unsent->len += oversize_used;
|
|
800beca: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800becc: 891a ldrh r2, [r3, #8]
|
|
800bece: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800bed2: 4413 add r3, r2
|
|
800bed4: b29a uxth r2, r3
|
|
800bed6: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bed8: 811a strh r2, [r3, #8]
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
LWIP_ASSERT("last_unsent->oversize_left >= oversize_used",
|
|
800beda: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bedc: 895b ldrh r3, [r3, #10]
|
|
800bede: f8b7 2046 ldrh.w r2, [r7, #70] ; 0x46
|
|
800bee2: 429a cmp r2, r3
|
|
800bee4: d906 bls.n 800bef4 <tcp_write+0x590>
|
|
800bee6: 4b78 ldr r3, [pc, #480] ; (800c0c8 <tcp_write+0x764>)
|
|
800bee8: f240 22d3 movw r2, #723 ; 0x2d3
|
|
800beec: 4977 ldr r1, [pc, #476] ; (800c0cc <tcp_write+0x768>)
|
|
800beee: 4878 ldr r0, [pc, #480] ; (800c0d0 <tcp_write+0x76c>)
|
|
800bef0: f004 fe6a bl 8010bc8 <iprintf>
|
|
last_unsent->oversize_left >= oversize_used);
|
|
last_unsent->oversize_left -= oversize_used;
|
|
800bef4: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bef6: 895a ldrh r2, [r3, #10]
|
|
800bef8: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800befc: 1ad3 subs r3, r2, r3
|
|
800befe: b29a uxth r2, r3
|
|
800bf00: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bf02: 815a strh r2, [r3, #10]
|
|
#endif /* TCP_OVERSIZE_DBGCHECK */
|
|
}
|
|
pcb->unsent_oversize = oversize;
|
|
800bf04: 8afa ldrh r2, [r7, #22]
|
|
800bf06: 68fb ldr r3, [r7, #12]
|
|
800bf08: f8a3 2068 strh.w r2, [r3, #104] ; 0x68
|
|
|
|
/*
|
|
* Phase 2: concat_p can be concatenated onto last_unsent->p, unless we
|
|
* determined that the last ROM pbuf can be extended to include the new data.
|
|
*/
|
|
if (concat_p != NULL) {
|
|
800bf0c: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800bf0e: 2b00 cmp r3, #0
|
|
800bf10: d018 beq.n 800bf44 <tcp_write+0x5e0>
|
|
LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty",
|
|
800bf12: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bf14: 2b00 cmp r3, #0
|
|
800bf16: d106 bne.n 800bf26 <tcp_write+0x5c2>
|
|
800bf18: 4b6b ldr r3, [pc, #428] ; (800c0c8 <tcp_write+0x764>)
|
|
800bf1a: f44f 7238 mov.w r2, #736 ; 0x2e0
|
|
800bf1e: 496d ldr r1, [pc, #436] ; (800c0d4 <tcp_write+0x770>)
|
|
800bf20: 486b ldr r0, [pc, #428] ; (800c0d0 <tcp_write+0x76c>)
|
|
800bf22: f004 fe51 bl 8010bc8 <iprintf>
|
|
(last_unsent != NULL));
|
|
pbuf_cat(last_unsent->p, concat_p);
|
|
800bf26: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bf28: 685b ldr r3, [r3, #4]
|
|
800bf2a: 6bf9 ldr r1, [r7, #60] ; 0x3c
|
|
800bf2c: 4618 mov r0, r3
|
|
800bf2e: f7fb f913 bl 8007158 <pbuf_cat>
|
|
last_unsent->len += concat_p->tot_len;
|
|
800bf32: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bf34: 891a ldrh r2, [r3, #8]
|
|
800bf36: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800bf38: 891b ldrh r3, [r3, #8]
|
|
800bf3a: 4413 add r3, r2
|
|
800bf3c: b29a uxth r2, r3
|
|
800bf3e: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bf40: 811a strh r2, [r3, #8]
|
|
800bf42: e03c b.n 800bfbe <tcp_write+0x65a>
|
|
} else if (extendlen > 0) {
|
|
800bf44: f8b7 305e ldrh.w r3, [r7, #94] ; 0x5e
|
|
800bf48: 2b00 cmp r3, #0
|
|
800bf4a: d038 beq.n 800bfbe <tcp_write+0x65a>
|
|
struct pbuf *p;
|
|
LWIP_ASSERT("tcp_write: extension of reference requires reference",
|
|
800bf4c: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bf4e: 2b00 cmp r3, #0
|
|
800bf50: d003 beq.n 800bf5a <tcp_write+0x5f6>
|
|
800bf52: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bf54: 685b ldr r3, [r3, #4]
|
|
800bf56: 2b00 cmp r3, #0
|
|
800bf58: d106 bne.n 800bf68 <tcp_write+0x604>
|
|
800bf5a: 4b5b ldr r3, [pc, #364] ; (800c0c8 <tcp_write+0x764>)
|
|
800bf5c: f240 22e6 movw r2, #742 ; 0x2e6
|
|
800bf60: 495d ldr r1, [pc, #372] ; (800c0d8 <tcp_write+0x774>)
|
|
800bf62: 485b ldr r0, [pc, #364] ; (800c0d0 <tcp_write+0x76c>)
|
|
800bf64: f004 fe30 bl 8010bc8 <iprintf>
|
|
last_unsent != NULL && last_unsent->p != NULL);
|
|
for (p = last_unsent->p; p->next != NULL; p = p->next) {
|
|
800bf68: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bf6a: 685b ldr r3, [r3, #4]
|
|
800bf6c: 62fb str r3, [r7, #44] ; 0x2c
|
|
800bf6e: e00a b.n 800bf86 <tcp_write+0x622>
|
|
p->tot_len += extendlen;
|
|
800bf70: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800bf72: 891a ldrh r2, [r3, #8]
|
|
800bf74: f8b7 305e ldrh.w r3, [r7, #94] ; 0x5e
|
|
800bf78: 4413 add r3, r2
|
|
800bf7a: b29a uxth r2, r3
|
|
800bf7c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800bf7e: 811a strh r2, [r3, #8]
|
|
for (p = last_unsent->p; p->next != NULL; p = p->next) {
|
|
800bf80: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800bf82: 681b ldr r3, [r3, #0]
|
|
800bf84: 62fb str r3, [r7, #44] ; 0x2c
|
|
800bf86: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800bf88: 681b ldr r3, [r3, #0]
|
|
800bf8a: 2b00 cmp r3, #0
|
|
800bf8c: d1f0 bne.n 800bf70 <tcp_write+0x60c>
|
|
}
|
|
p->tot_len += extendlen;
|
|
800bf8e: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800bf90: 891a ldrh r2, [r3, #8]
|
|
800bf92: f8b7 305e ldrh.w r3, [r7, #94] ; 0x5e
|
|
800bf96: 4413 add r3, r2
|
|
800bf98: b29a uxth r2, r3
|
|
800bf9a: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800bf9c: 811a strh r2, [r3, #8]
|
|
p->len += extendlen;
|
|
800bf9e: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800bfa0: 895a ldrh r2, [r3, #10]
|
|
800bfa2: f8b7 305e ldrh.w r3, [r7, #94] ; 0x5e
|
|
800bfa6: 4413 add r3, r2
|
|
800bfa8: b29a uxth r2, r3
|
|
800bfaa: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800bfac: 815a strh r2, [r3, #10]
|
|
last_unsent->len += extendlen;
|
|
800bfae: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bfb0: 891a ldrh r2, [r3, #8]
|
|
800bfb2: f8b7 305e ldrh.w r3, [r7, #94] ; 0x5e
|
|
800bfb6: 4413 add r3, r2
|
|
800bfb8: b29a uxth r2, r3
|
|
800bfba: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bfbc: 811a strh r2, [r3, #8]
|
|
|
|
/*
|
|
* Phase 3: Append queue to pcb->unsent. Queue may be NULL, but that
|
|
* is harmless
|
|
*/
|
|
if (last_unsent == NULL) {
|
|
800bfbe: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bfc0: 2b00 cmp r3, #0
|
|
800bfc2: d103 bne.n 800bfcc <tcp_write+0x668>
|
|
pcb->unsent = queue;
|
|
800bfc4: 68fb ldr r3, [r7, #12]
|
|
800bfc6: 6cfa ldr r2, [r7, #76] ; 0x4c
|
|
800bfc8: 66da str r2, [r3, #108] ; 0x6c
|
|
800bfca: e002 b.n 800bfd2 <tcp_write+0x66e>
|
|
} else {
|
|
last_unsent->next = queue;
|
|
800bfcc: 6c3b ldr r3, [r7, #64] ; 0x40
|
|
800bfce: 6cfa ldr r2, [r7, #76] ; 0x4c
|
|
800bfd0: 601a str r2, [r3, #0]
|
|
}
|
|
|
|
/*
|
|
* Finally update the pcb state.
|
|
*/
|
|
pcb->snd_lbb += len;
|
|
800bfd2: 68fb ldr r3, [r7, #12]
|
|
800bfd4: 6dda ldr r2, [r3, #92] ; 0x5c
|
|
800bfd6: 88fb ldrh r3, [r7, #6]
|
|
800bfd8: 441a add r2, r3
|
|
800bfda: 68fb ldr r3, [r7, #12]
|
|
800bfdc: 65da str r2, [r3, #92] ; 0x5c
|
|
pcb->snd_buf -= len;
|
|
800bfde: 68fb ldr r3, [r7, #12]
|
|
800bfe0: f8b3 2064 ldrh.w r2, [r3, #100] ; 0x64
|
|
800bfe4: 88fb ldrh r3, [r7, #6]
|
|
800bfe6: 1ad3 subs r3, r2, r3
|
|
800bfe8: b29a uxth r2, r3
|
|
800bfea: 68fb ldr r3, [r7, #12]
|
|
800bfec: f8a3 2064 strh.w r2, [r3, #100] ; 0x64
|
|
pcb->snd_queuelen = queuelen;
|
|
800bff0: 68fb ldr r3, [r7, #12]
|
|
800bff2: f8b7 2048 ldrh.w r2, [r7, #72] ; 0x48
|
|
800bff6: f8a3 2066 strh.w r2, [r3, #102] ; 0x66
|
|
|
|
LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: %"S16_F" (after enqueued)\n",
|
|
pcb->snd_queuelen));
|
|
if (pcb->snd_queuelen != 0) {
|
|
800bffa: 68fb ldr r3, [r7, #12]
|
|
800bffc: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800c000: 2b00 cmp r3, #0
|
|
800c002: d00e beq.n 800c022 <tcp_write+0x6be>
|
|
LWIP_ASSERT("tcp_write: valid queue length",
|
|
800c004: 68fb ldr r3, [r7, #12]
|
|
800c006: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800c008: 2b00 cmp r3, #0
|
|
800c00a: d10a bne.n 800c022 <tcp_write+0x6be>
|
|
800c00c: 68fb ldr r3, [r7, #12]
|
|
800c00e: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c010: 2b00 cmp r3, #0
|
|
800c012: d106 bne.n 800c022 <tcp_write+0x6be>
|
|
800c014: 4b2c ldr r3, [pc, #176] ; (800c0c8 <tcp_write+0x764>)
|
|
800c016: f240 3212 movw r2, #786 ; 0x312
|
|
800c01a: 4930 ldr r1, [pc, #192] ; (800c0dc <tcp_write+0x778>)
|
|
800c01c: 482c ldr r0, [pc, #176] ; (800c0d0 <tcp_write+0x76c>)
|
|
800c01e: f004 fdd3 bl 8010bc8 <iprintf>
|
|
pcb->unacked != NULL || pcb->unsent != NULL);
|
|
}
|
|
|
|
/* Set the PSH flag in the last segment that we enqueued. */
|
|
if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE) == 0)) {
|
|
800c022: 6d7b ldr r3, [r7, #84] ; 0x54
|
|
800c024: 2b00 cmp r3, #0
|
|
800c026: d016 beq.n 800c056 <tcp_write+0x6f2>
|
|
800c028: 6d7b ldr r3, [r7, #84] ; 0x54
|
|
800c02a: 691b ldr r3, [r3, #16]
|
|
800c02c: 2b00 cmp r3, #0
|
|
800c02e: d012 beq.n 800c056 <tcp_write+0x6f2>
|
|
800c030: 797b ldrb r3, [r7, #5]
|
|
800c032: f003 0302 and.w r3, r3, #2
|
|
800c036: 2b00 cmp r3, #0
|
|
800c038: d10d bne.n 800c056 <tcp_write+0x6f2>
|
|
TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
|
|
800c03a: 6d7b ldr r3, [r7, #84] ; 0x54
|
|
800c03c: 691b ldr r3, [r3, #16]
|
|
800c03e: 899b ldrh r3, [r3, #12]
|
|
800c040: b29c uxth r4, r3
|
|
800c042: 2008 movs r0, #8
|
|
800c044: f7f9 fa82 bl 800554c <lwip_htons>
|
|
800c048: 4603 mov r3, r0
|
|
800c04a: 461a mov r2, r3
|
|
800c04c: 6d7b ldr r3, [r7, #84] ; 0x54
|
|
800c04e: 691b ldr r3, [r3, #16]
|
|
800c050: 4322 orrs r2, r4
|
|
800c052: b292 uxth r2, r2
|
|
800c054: 819a strh r2, [r3, #12]
|
|
}
|
|
|
|
return ERR_OK;
|
|
800c056: 2300 movs r3, #0
|
|
800c058: e031 b.n 800c0be <tcp_write+0x75a>
|
|
goto memerr;
|
|
800c05a: bf00 nop
|
|
800c05c: e006 b.n 800c06c <tcp_write+0x708>
|
|
goto memerr;
|
|
800c05e: bf00 nop
|
|
800c060: e004 b.n 800c06c <tcp_write+0x708>
|
|
goto memerr;
|
|
800c062: bf00 nop
|
|
800c064: e002 b.n 800c06c <tcp_write+0x708>
|
|
goto memerr;
|
|
800c066: bf00 nop
|
|
800c068: e000 b.n 800c06c <tcp_write+0x708>
|
|
goto memerr;
|
|
800c06a: bf00 nop
|
|
memerr:
|
|
tcp_set_flags(pcb, TF_NAGLEMEMERR);
|
|
800c06c: 68fb ldr r3, [r7, #12]
|
|
800c06e: 8b5b ldrh r3, [r3, #26]
|
|
800c070: f043 0380 orr.w r3, r3, #128 ; 0x80
|
|
800c074: b29a uxth r2, r3
|
|
800c076: 68fb ldr r3, [r7, #12]
|
|
800c078: 835a strh r2, [r3, #26]
|
|
TCP_STATS_INC(tcp.memerr);
|
|
|
|
if (concat_p != NULL) {
|
|
800c07a: 6bfb ldr r3, [r7, #60] ; 0x3c
|
|
800c07c: 2b00 cmp r3, #0
|
|
800c07e: d002 beq.n 800c086 <tcp_write+0x722>
|
|
pbuf_free(concat_p);
|
|
800c080: 6bf8 ldr r0, [r7, #60] ; 0x3c
|
|
800c082: f7fa ffa7 bl 8006fd4 <pbuf_free>
|
|
}
|
|
if (queue != NULL) {
|
|
800c086: 6cfb ldr r3, [r7, #76] ; 0x4c
|
|
800c088: 2b00 cmp r3, #0
|
|
800c08a: d002 beq.n 800c092 <tcp_write+0x72e>
|
|
tcp_segs_free(queue);
|
|
800c08c: 6cf8 ldr r0, [r7, #76] ; 0x4c
|
|
800c08e: f7fc fb5d bl 800874c <tcp_segs_free>
|
|
}
|
|
if (pcb->snd_queuelen != 0) {
|
|
800c092: 68fb ldr r3, [r7, #12]
|
|
800c094: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800c098: 2b00 cmp r3, #0
|
|
800c09a: d00e beq.n 800c0ba <tcp_write+0x756>
|
|
LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL ||
|
|
800c09c: 68fb ldr r3, [r7, #12]
|
|
800c09e: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800c0a0: 2b00 cmp r3, #0
|
|
800c0a2: d10a bne.n 800c0ba <tcp_write+0x756>
|
|
800c0a4: 68fb ldr r3, [r7, #12]
|
|
800c0a6: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c0a8: 2b00 cmp r3, #0
|
|
800c0aa: d106 bne.n 800c0ba <tcp_write+0x756>
|
|
800c0ac: 4b06 ldr r3, [pc, #24] ; (800c0c8 <tcp_write+0x764>)
|
|
800c0ae: f240 3227 movw r2, #807 ; 0x327
|
|
800c0b2: 490a ldr r1, [pc, #40] ; (800c0dc <tcp_write+0x778>)
|
|
800c0b4: 4806 ldr r0, [pc, #24] ; (800c0d0 <tcp_write+0x76c>)
|
|
800c0b6: f004 fd87 bl 8010bc8 <iprintf>
|
|
pcb->unsent != NULL);
|
|
}
|
|
LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_write: %"S16_F" (with mem err)\n", pcb->snd_queuelen));
|
|
return ERR_MEM;
|
|
800c0ba: f04f 33ff mov.w r3, #4294967295
|
|
}
|
|
800c0be: 4618 mov r0, r3
|
|
800c0c0: 3764 adds r7, #100 ; 0x64
|
|
800c0c2: 46bd mov sp, r7
|
|
800c0c4: bd90 pop {r4, r7, pc}
|
|
800c0c6: bf00 nop
|
|
800c0c8: 08013618 .word 0x08013618
|
|
800c0cc: 0801394c .word 0x0801394c
|
|
800c0d0: 0801366c .word 0x0801366c
|
|
800c0d4: 08013978 .word 0x08013978
|
|
800c0d8: 080139b0 .word 0x080139b0
|
|
800c0dc: 080139e8 .word 0x080139e8
|
|
|
|
0800c0e0 <tcp_split_unsent_seg>:
|
|
* @param pcb the tcp_pcb for which to split the unsent head
|
|
* @param split the amount of payload to remain in the head
|
|
*/
|
|
err_t
|
|
tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split)
|
|
{
|
|
800c0e0: b590 push {r4, r7, lr}
|
|
800c0e2: b08b sub sp, #44 ; 0x2c
|
|
800c0e4: af02 add r7, sp, #8
|
|
800c0e6: 6078 str r0, [r7, #4]
|
|
800c0e8: 460b mov r3, r1
|
|
800c0ea: 807b strh r3, [r7, #2]
|
|
struct tcp_seg *seg = NULL, *useg = NULL;
|
|
800c0ec: 2300 movs r3, #0
|
|
800c0ee: 61bb str r3, [r7, #24]
|
|
800c0f0: 2300 movs r3, #0
|
|
800c0f2: 617b str r3, [r7, #20]
|
|
struct pbuf *p = NULL;
|
|
800c0f4: 2300 movs r3, #0
|
|
800c0f6: 613b str r3, [r7, #16]
|
|
u16_t chksum = 0;
|
|
u8_t chksum_swapped = 0;
|
|
struct pbuf *q;
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
|
|
LWIP_ASSERT("tcp_split_unsent_seg: invalid pcb", pcb != NULL);
|
|
800c0f8: 687b ldr r3, [r7, #4]
|
|
800c0fa: 2b00 cmp r3, #0
|
|
800c0fc: d106 bne.n 800c10c <tcp_split_unsent_seg+0x2c>
|
|
800c0fe: 4b97 ldr r3, [pc, #604] ; (800c35c <tcp_split_unsent_seg+0x27c>)
|
|
800c100: f240 324b movw r2, #843 ; 0x34b
|
|
800c104: 4996 ldr r1, [pc, #600] ; (800c360 <tcp_split_unsent_seg+0x280>)
|
|
800c106: 4897 ldr r0, [pc, #604] ; (800c364 <tcp_split_unsent_seg+0x284>)
|
|
800c108: f004 fd5e bl 8010bc8 <iprintf>
|
|
|
|
useg = pcb->unsent;
|
|
800c10c: 687b ldr r3, [r7, #4]
|
|
800c10e: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c110: 617b str r3, [r7, #20]
|
|
if (useg == NULL) {
|
|
800c112: 697b ldr r3, [r7, #20]
|
|
800c114: 2b00 cmp r3, #0
|
|
800c116: d102 bne.n 800c11e <tcp_split_unsent_seg+0x3e>
|
|
return ERR_MEM;
|
|
800c118: f04f 33ff mov.w r3, #4294967295
|
|
800c11c: e119 b.n 800c352 <tcp_split_unsent_seg+0x272>
|
|
}
|
|
|
|
if (split == 0) {
|
|
800c11e: 887b ldrh r3, [r7, #2]
|
|
800c120: 2b00 cmp r3, #0
|
|
800c122: d109 bne.n 800c138 <tcp_split_unsent_seg+0x58>
|
|
LWIP_ASSERT("Can't split segment into length 0", 0);
|
|
800c124: 4b8d ldr r3, [pc, #564] ; (800c35c <tcp_split_unsent_seg+0x27c>)
|
|
800c126: f240 3253 movw r2, #851 ; 0x353
|
|
800c12a: 498f ldr r1, [pc, #572] ; (800c368 <tcp_split_unsent_seg+0x288>)
|
|
800c12c: 488d ldr r0, [pc, #564] ; (800c364 <tcp_split_unsent_seg+0x284>)
|
|
800c12e: f004 fd4b bl 8010bc8 <iprintf>
|
|
return ERR_VAL;
|
|
800c132: f06f 0305 mvn.w r3, #5
|
|
800c136: e10c b.n 800c352 <tcp_split_unsent_seg+0x272>
|
|
}
|
|
|
|
if (useg->len <= split) {
|
|
800c138: 697b ldr r3, [r7, #20]
|
|
800c13a: 891b ldrh r3, [r3, #8]
|
|
800c13c: 887a ldrh r2, [r7, #2]
|
|
800c13e: 429a cmp r2, r3
|
|
800c140: d301 bcc.n 800c146 <tcp_split_unsent_seg+0x66>
|
|
return ERR_OK;
|
|
800c142: 2300 movs r3, #0
|
|
800c144: e105 b.n 800c352 <tcp_split_unsent_seg+0x272>
|
|
}
|
|
|
|
LWIP_ASSERT("split <= mss", split <= pcb->mss);
|
|
800c146: 687b ldr r3, [r7, #4]
|
|
800c148: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800c14a: 887a ldrh r2, [r7, #2]
|
|
800c14c: 429a cmp r2, r3
|
|
800c14e: d906 bls.n 800c15e <tcp_split_unsent_seg+0x7e>
|
|
800c150: 4b82 ldr r3, [pc, #520] ; (800c35c <tcp_split_unsent_seg+0x27c>)
|
|
800c152: f240 325b movw r2, #859 ; 0x35b
|
|
800c156: 4985 ldr r1, [pc, #532] ; (800c36c <tcp_split_unsent_seg+0x28c>)
|
|
800c158: 4882 ldr r0, [pc, #520] ; (800c364 <tcp_split_unsent_seg+0x284>)
|
|
800c15a: f004 fd35 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("useg->len > 0", useg->len > 0);
|
|
800c15e: 697b ldr r3, [r7, #20]
|
|
800c160: 891b ldrh r3, [r3, #8]
|
|
800c162: 2b00 cmp r3, #0
|
|
800c164: d106 bne.n 800c174 <tcp_split_unsent_seg+0x94>
|
|
800c166: 4b7d ldr r3, [pc, #500] ; (800c35c <tcp_split_unsent_seg+0x27c>)
|
|
800c168: f44f 7257 mov.w r2, #860 ; 0x35c
|
|
800c16c: 4980 ldr r1, [pc, #512] ; (800c370 <tcp_split_unsent_seg+0x290>)
|
|
800c16e: 487d ldr r0, [pc, #500] ; (800c364 <tcp_split_unsent_seg+0x284>)
|
|
800c170: f004 fd2a bl 8010bc8 <iprintf>
|
|
* to split this packet so we may actually exceed the max value by
|
|
* one!
|
|
*/
|
|
LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: split_unsent_seg: %u\n", (unsigned int)pcb->snd_queuelen));
|
|
|
|
optflags = useg->flags;
|
|
800c174: 697b ldr r3, [r7, #20]
|
|
800c176: 7b1b ldrb r3, [r3, #12]
|
|
800c178: 73fb strb r3, [r7, #15]
|
|
#if TCP_CHECKSUM_ON_COPY
|
|
/* Remove since checksum is not stored until after tcp_create_segment() */
|
|
optflags &= ~TF_SEG_DATA_CHECKSUMMED;
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
optlen = LWIP_TCP_OPT_LENGTH(optflags);
|
|
800c17a: 7bfb ldrb r3, [r7, #15]
|
|
800c17c: 009b lsls r3, r3, #2
|
|
800c17e: b2db uxtb r3, r3
|
|
800c180: f003 0304 and.w r3, r3, #4
|
|
800c184: 73bb strb r3, [r7, #14]
|
|
remainder = useg->len - split;
|
|
800c186: 697b ldr r3, [r7, #20]
|
|
800c188: 891a ldrh r2, [r3, #8]
|
|
800c18a: 887b ldrh r3, [r7, #2]
|
|
800c18c: 1ad3 subs r3, r2, r3
|
|
800c18e: 81bb strh r3, [r7, #12]
|
|
|
|
/* Create new pbuf for the remainder of the split */
|
|
p = pbuf_alloc(PBUF_TRANSPORT, remainder + optlen, PBUF_RAM);
|
|
800c190: 7bbb ldrb r3, [r7, #14]
|
|
800c192: b29a uxth r2, r3
|
|
800c194: 89bb ldrh r3, [r7, #12]
|
|
800c196: 4413 add r3, r2
|
|
800c198: b29b uxth r3, r3
|
|
800c19a: f44f 7220 mov.w r2, #640 ; 0x280
|
|
800c19e: 4619 mov r1, r3
|
|
800c1a0: 2036 movs r0, #54 ; 0x36
|
|
800c1a2: f7fa fc33 bl 8006a0c <pbuf_alloc>
|
|
800c1a6: 6138 str r0, [r7, #16]
|
|
if (p == NULL) {
|
|
800c1a8: 693b ldr r3, [r7, #16]
|
|
800c1aa: 2b00 cmp r3, #0
|
|
800c1ac: f000 80ba beq.w 800c324 <tcp_split_unsent_seg+0x244>
|
|
("tcp_split_unsent_seg: could not allocate memory for pbuf remainder %u\n", remainder));
|
|
goto memerr;
|
|
}
|
|
|
|
/* Offset into the original pbuf is past TCP/IP headers, options, and split amount */
|
|
offset = useg->p->tot_len - useg->len + split;
|
|
800c1b0: 697b ldr r3, [r7, #20]
|
|
800c1b2: 685b ldr r3, [r3, #4]
|
|
800c1b4: 891a ldrh r2, [r3, #8]
|
|
800c1b6: 697b ldr r3, [r7, #20]
|
|
800c1b8: 891b ldrh r3, [r3, #8]
|
|
800c1ba: 1ad3 subs r3, r2, r3
|
|
800c1bc: b29a uxth r2, r3
|
|
800c1be: 887b ldrh r3, [r7, #2]
|
|
800c1c0: 4413 add r3, r2
|
|
800c1c2: 817b strh r3, [r7, #10]
|
|
/* Copy remainder into new pbuf, headers and options will not be filled out */
|
|
if (pbuf_copy_partial(useg->p, (u8_t *)p->payload + optlen, remainder, offset ) != remainder) {
|
|
800c1c4: 697b ldr r3, [r7, #20]
|
|
800c1c6: 6858 ldr r0, [r3, #4]
|
|
800c1c8: 693b ldr r3, [r7, #16]
|
|
800c1ca: 685a ldr r2, [r3, #4]
|
|
800c1cc: 7bbb ldrb r3, [r7, #14]
|
|
800c1ce: 18d1 adds r1, r2, r3
|
|
800c1d0: 897b ldrh r3, [r7, #10]
|
|
800c1d2: 89ba ldrh r2, [r7, #12]
|
|
800c1d4: f7fb f8e8 bl 80073a8 <pbuf_copy_partial>
|
|
800c1d8: 4603 mov r3, r0
|
|
800c1da: 461a mov r2, r3
|
|
800c1dc: 89bb ldrh r3, [r7, #12]
|
|
800c1de: 4293 cmp r3, r2
|
|
800c1e0: f040 80a2 bne.w 800c328 <tcp_split_unsent_seg+0x248>
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
|
|
/* Options are created when calling tcp_output() */
|
|
|
|
/* Migrate flags from original segment */
|
|
split_flags = TCPH_FLAGS(useg->tcphdr);
|
|
800c1e4: 697b ldr r3, [r7, #20]
|
|
800c1e6: 691b ldr r3, [r3, #16]
|
|
800c1e8: 899b ldrh r3, [r3, #12]
|
|
800c1ea: b29b uxth r3, r3
|
|
800c1ec: 4618 mov r0, r3
|
|
800c1ee: f7f9 f9ad bl 800554c <lwip_htons>
|
|
800c1f2: 4603 mov r3, r0
|
|
800c1f4: b2db uxtb r3, r3
|
|
800c1f6: f003 033f and.w r3, r3, #63 ; 0x3f
|
|
800c1fa: 77fb strb r3, [r7, #31]
|
|
remainder_flags = 0; /* ACK added in tcp_output() */
|
|
800c1fc: 2300 movs r3, #0
|
|
800c1fe: 77bb strb r3, [r7, #30]
|
|
|
|
if (split_flags & TCP_PSH) {
|
|
800c200: 7ffb ldrb r3, [r7, #31]
|
|
800c202: f003 0308 and.w r3, r3, #8
|
|
800c206: 2b00 cmp r3, #0
|
|
800c208: d007 beq.n 800c21a <tcp_split_unsent_seg+0x13a>
|
|
split_flags &= ~TCP_PSH;
|
|
800c20a: 7ffb ldrb r3, [r7, #31]
|
|
800c20c: f023 0308 bic.w r3, r3, #8
|
|
800c210: 77fb strb r3, [r7, #31]
|
|
remainder_flags |= TCP_PSH;
|
|
800c212: 7fbb ldrb r3, [r7, #30]
|
|
800c214: f043 0308 orr.w r3, r3, #8
|
|
800c218: 77bb strb r3, [r7, #30]
|
|
}
|
|
if (split_flags & TCP_FIN) {
|
|
800c21a: 7ffb ldrb r3, [r7, #31]
|
|
800c21c: f003 0301 and.w r3, r3, #1
|
|
800c220: 2b00 cmp r3, #0
|
|
800c222: d007 beq.n 800c234 <tcp_split_unsent_seg+0x154>
|
|
split_flags &= ~TCP_FIN;
|
|
800c224: 7ffb ldrb r3, [r7, #31]
|
|
800c226: f023 0301 bic.w r3, r3, #1
|
|
800c22a: 77fb strb r3, [r7, #31]
|
|
remainder_flags |= TCP_FIN;
|
|
800c22c: 7fbb ldrb r3, [r7, #30]
|
|
800c22e: f043 0301 orr.w r3, r3, #1
|
|
800c232: 77bb strb r3, [r7, #30]
|
|
}
|
|
/* SYN should be left on split, RST should not be present with data */
|
|
|
|
seg = tcp_create_segment(pcb, p, remainder_flags, lwip_ntohl(useg->tcphdr->seqno) + split, optflags);
|
|
800c234: 697b ldr r3, [r7, #20]
|
|
800c236: 691b ldr r3, [r3, #16]
|
|
800c238: 685b ldr r3, [r3, #4]
|
|
800c23a: 4618 mov r0, r3
|
|
800c23c: f7f9 f99b bl 8005576 <lwip_htonl>
|
|
800c240: 4602 mov r2, r0
|
|
800c242: 887b ldrh r3, [r7, #2]
|
|
800c244: 18d1 adds r1, r2, r3
|
|
800c246: 7fba ldrb r2, [r7, #30]
|
|
800c248: 7bfb ldrb r3, [r7, #15]
|
|
800c24a: 9300 str r3, [sp, #0]
|
|
800c24c: 460b mov r3, r1
|
|
800c24e: 6939 ldr r1, [r7, #16]
|
|
800c250: 6878 ldr r0, [r7, #4]
|
|
800c252: f7ff f9f3 bl 800b63c <tcp_create_segment>
|
|
800c256: 61b8 str r0, [r7, #24]
|
|
if (seg == NULL) {
|
|
800c258: 69bb ldr r3, [r7, #24]
|
|
800c25a: 2b00 cmp r3, #0
|
|
800c25c: d066 beq.n 800c32c <tcp_split_unsent_seg+0x24c>
|
|
seg->chksum_swapped = chksum_swapped;
|
|
seg->flags |= TF_SEG_DATA_CHECKSUMMED;
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
|
|
/* Remove this segment from the queue since trimming it may free pbufs */
|
|
pcb->snd_queuelen -= pbuf_clen(useg->p);
|
|
800c25e: 697b ldr r3, [r7, #20]
|
|
800c260: 685b ldr r3, [r3, #4]
|
|
800c262: 4618 mov r0, r3
|
|
800c264: f7fa ff3e bl 80070e4 <pbuf_clen>
|
|
800c268: 4603 mov r3, r0
|
|
800c26a: 461a mov r2, r3
|
|
800c26c: 687b ldr r3, [r7, #4]
|
|
800c26e: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800c272: 1a9b subs r3, r3, r2
|
|
800c274: b29a uxth r2, r3
|
|
800c276: 687b ldr r3, [r7, #4]
|
|
800c278: f8a3 2066 strh.w r2, [r3, #102] ; 0x66
|
|
|
|
/* Trim the original pbuf into our split size. At this point our remainder segment must be setup
|
|
successfully because we are modifying the original segment */
|
|
pbuf_realloc(useg->p, useg->p->tot_len - remainder);
|
|
800c27c: 697b ldr r3, [r7, #20]
|
|
800c27e: 6858 ldr r0, [r3, #4]
|
|
800c280: 697b ldr r3, [r7, #20]
|
|
800c282: 685b ldr r3, [r3, #4]
|
|
800c284: 891a ldrh r2, [r3, #8]
|
|
800c286: 89bb ldrh r3, [r7, #12]
|
|
800c288: 1ad3 subs r3, r2, r3
|
|
800c28a: b29b uxth r3, r3
|
|
800c28c: 4619 mov r1, r3
|
|
800c28e: f7fa fd1b bl 8006cc8 <pbuf_realloc>
|
|
useg->len -= remainder;
|
|
800c292: 697b ldr r3, [r7, #20]
|
|
800c294: 891a ldrh r2, [r3, #8]
|
|
800c296: 89bb ldrh r3, [r7, #12]
|
|
800c298: 1ad3 subs r3, r2, r3
|
|
800c29a: b29a uxth r2, r3
|
|
800c29c: 697b ldr r3, [r7, #20]
|
|
800c29e: 811a strh r2, [r3, #8]
|
|
TCPH_SET_FLAG(useg->tcphdr, split_flags);
|
|
800c2a0: 697b ldr r3, [r7, #20]
|
|
800c2a2: 691b ldr r3, [r3, #16]
|
|
800c2a4: 899b ldrh r3, [r3, #12]
|
|
800c2a6: b29c uxth r4, r3
|
|
800c2a8: 7ffb ldrb r3, [r7, #31]
|
|
800c2aa: b29b uxth r3, r3
|
|
800c2ac: 4618 mov r0, r3
|
|
800c2ae: f7f9 f94d bl 800554c <lwip_htons>
|
|
800c2b2: 4603 mov r3, r0
|
|
800c2b4: 461a mov r2, r3
|
|
800c2b6: 697b ldr r3, [r7, #20]
|
|
800c2b8: 691b ldr r3, [r3, #16]
|
|
800c2ba: 4322 orrs r2, r4
|
|
800c2bc: b292 uxth r2, r2
|
|
800c2be: 819a strh r2, [r3, #12]
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
/* By trimming, realloc may have actually shrunk the pbuf, so clear oversize_left */
|
|
useg->oversize_left = 0;
|
|
800c2c0: 697b ldr r3, [r7, #20]
|
|
800c2c2: 2200 movs r2, #0
|
|
800c2c4: 815a strh r2, [r3, #10]
|
|
#endif /* TCP_OVERSIZE_DBGCHECK */
|
|
|
|
/* Add back to the queue with new trimmed pbuf */
|
|
pcb->snd_queuelen += pbuf_clen(useg->p);
|
|
800c2c6: 697b ldr r3, [r7, #20]
|
|
800c2c8: 685b ldr r3, [r3, #4]
|
|
800c2ca: 4618 mov r0, r3
|
|
800c2cc: f7fa ff0a bl 80070e4 <pbuf_clen>
|
|
800c2d0: 4603 mov r3, r0
|
|
800c2d2: 461a mov r2, r3
|
|
800c2d4: 687b ldr r3, [r7, #4]
|
|
800c2d6: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800c2da: 4413 add r3, r2
|
|
800c2dc: b29a uxth r2, r3
|
|
800c2de: 687b ldr r3, [r7, #4]
|
|
800c2e0: f8a3 2066 strh.w r2, [r3, #102] ; 0x66
|
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
|
|
/* Update number of segments on the queues. Note that length now may
|
|
* exceed TCP_SND_QUEUELEN! We don't have to touch pcb->snd_buf
|
|
* because the total amount of data is constant when packet is split */
|
|
pcb->snd_queuelen += pbuf_clen(seg->p);
|
|
800c2e4: 69bb ldr r3, [r7, #24]
|
|
800c2e6: 685b ldr r3, [r3, #4]
|
|
800c2e8: 4618 mov r0, r3
|
|
800c2ea: f7fa fefb bl 80070e4 <pbuf_clen>
|
|
800c2ee: 4603 mov r3, r0
|
|
800c2f0: 461a mov r2, r3
|
|
800c2f2: 687b ldr r3, [r7, #4]
|
|
800c2f4: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800c2f8: 4413 add r3, r2
|
|
800c2fa: b29a uxth r2, r3
|
|
800c2fc: 687b ldr r3, [r7, #4]
|
|
800c2fe: f8a3 2066 strh.w r2, [r3, #102] ; 0x66
|
|
|
|
/* Finally insert remainder into queue after split (which stays head) */
|
|
seg->next = useg->next;
|
|
800c302: 697b ldr r3, [r7, #20]
|
|
800c304: 681a ldr r2, [r3, #0]
|
|
800c306: 69bb ldr r3, [r7, #24]
|
|
800c308: 601a str r2, [r3, #0]
|
|
useg->next = seg;
|
|
800c30a: 697b ldr r3, [r7, #20]
|
|
800c30c: 69ba ldr r2, [r7, #24]
|
|
800c30e: 601a str r2, [r3, #0]
|
|
|
|
#if TCP_OVERSIZE
|
|
/* If remainder is last segment on the unsent, ensure we clear the oversize amount
|
|
* because the remainder is always sized to the exact remaining amount */
|
|
if (seg->next == NULL) {
|
|
800c310: 69bb ldr r3, [r7, #24]
|
|
800c312: 681b ldr r3, [r3, #0]
|
|
800c314: 2b00 cmp r3, #0
|
|
800c316: d103 bne.n 800c320 <tcp_split_unsent_seg+0x240>
|
|
pcb->unsent_oversize = 0;
|
|
800c318: 687b ldr r3, [r7, #4]
|
|
800c31a: 2200 movs r2, #0
|
|
800c31c: f8a3 2068 strh.w r2, [r3, #104] ; 0x68
|
|
}
|
|
#endif /* TCP_OVERSIZE */
|
|
|
|
return ERR_OK;
|
|
800c320: 2300 movs r3, #0
|
|
800c322: e016 b.n 800c352 <tcp_split_unsent_seg+0x272>
|
|
goto memerr;
|
|
800c324: bf00 nop
|
|
800c326: e002 b.n 800c32e <tcp_split_unsent_seg+0x24e>
|
|
goto memerr;
|
|
800c328: bf00 nop
|
|
800c32a: e000 b.n 800c32e <tcp_split_unsent_seg+0x24e>
|
|
goto memerr;
|
|
800c32c: bf00 nop
|
|
memerr:
|
|
TCP_STATS_INC(tcp.memerr);
|
|
|
|
LWIP_ASSERT("seg == NULL", seg == NULL);
|
|
800c32e: 69bb ldr r3, [r7, #24]
|
|
800c330: 2b00 cmp r3, #0
|
|
800c332: d006 beq.n 800c342 <tcp_split_unsent_seg+0x262>
|
|
800c334: 4b09 ldr r3, [pc, #36] ; (800c35c <tcp_split_unsent_seg+0x27c>)
|
|
800c336: f44f 7276 mov.w r2, #984 ; 0x3d8
|
|
800c33a: 490e ldr r1, [pc, #56] ; (800c374 <tcp_split_unsent_seg+0x294>)
|
|
800c33c: 4809 ldr r0, [pc, #36] ; (800c364 <tcp_split_unsent_seg+0x284>)
|
|
800c33e: f004 fc43 bl 8010bc8 <iprintf>
|
|
if (p != NULL) {
|
|
800c342: 693b ldr r3, [r7, #16]
|
|
800c344: 2b00 cmp r3, #0
|
|
800c346: d002 beq.n 800c34e <tcp_split_unsent_seg+0x26e>
|
|
pbuf_free(p);
|
|
800c348: 6938 ldr r0, [r7, #16]
|
|
800c34a: f7fa fe43 bl 8006fd4 <pbuf_free>
|
|
}
|
|
|
|
return ERR_MEM;
|
|
800c34e: f04f 33ff mov.w r3, #4294967295
|
|
}
|
|
800c352: 4618 mov r0, r3
|
|
800c354: 3724 adds r7, #36 ; 0x24
|
|
800c356: 46bd mov sp, r7
|
|
800c358: bd90 pop {r4, r7, pc}
|
|
800c35a: bf00 nop
|
|
800c35c: 08013618 .word 0x08013618
|
|
800c360: 08013a08 .word 0x08013a08
|
|
800c364: 0801366c .word 0x0801366c
|
|
800c368: 08013a2c .word 0x08013a2c
|
|
800c36c: 08013a50 .word 0x08013a50
|
|
800c370: 08013a60 .word 0x08013a60
|
|
800c374: 08013a70 .word 0x08013a70
|
|
|
|
0800c378 <tcp_send_fin>:
|
|
* @param pcb the tcp_pcb over which to send a segment
|
|
* @return ERR_OK if sent, another err_t otherwise
|
|
*/
|
|
err_t
|
|
tcp_send_fin(struct tcp_pcb *pcb)
|
|
{
|
|
800c378: b590 push {r4, r7, lr}
|
|
800c37a: b085 sub sp, #20
|
|
800c37c: af00 add r7, sp, #0
|
|
800c37e: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("tcp_send_fin: invalid pcb", pcb != NULL);
|
|
800c380: 687b ldr r3, [r7, #4]
|
|
800c382: 2b00 cmp r3, #0
|
|
800c384: d106 bne.n 800c394 <tcp_send_fin+0x1c>
|
|
800c386: 4b21 ldr r3, [pc, #132] ; (800c40c <tcp_send_fin+0x94>)
|
|
800c388: f240 32eb movw r2, #1003 ; 0x3eb
|
|
800c38c: 4920 ldr r1, [pc, #128] ; (800c410 <tcp_send_fin+0x98>)
|
|
800c38e: 4821 ldr r0, [pc, #132] ; (800c414 <tcp_send_fin+0x9c>)
|
|
800c390: f004 fc1a bl 8010bc8 <iprintf>
|
|
|
|
/* first, try to add the fin to the last unsent segment */
|
|
if (pcb->unsent != NULL) {
|
|
800c394: 687b ldr r3, [r7, #4]
|
|
800c396: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c398: 2b00 cmp r3, #0
|
|
800c39a: d02e beq.n 800c3fa <tcp_send_fin+0x82>
|
|
struct tcp_seg *last_unsent;
|
|
for (last_unsent = pcb->unsent; last_unsent->next != NULL;
|
|
800c39c: 687b ldr r3, [r7, #4]
|
|
800c39e: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c3a0: 60fb str r3, [r7, #12]
|
|
800c3a2: e002 b.n 800c3aa <tcp_send_fin+0x32>
|
|
last_unsent = last_unsent->next);
|
|
800c3a4: 68fb ldr r3, [r7, #12]
|
|
800c3a6: 681b ldr r3, [r3, #0]
|
|
800c3a8: 60fb str r3, [r7, #12]
|
|
for (last_unsent = pcb->unsent; last_unsent->next != NULL;
|
|
800c3aa: 68fb ldr r3, [r7, #12]
|
|
800c3ac: 681b ldr r3, [r3, #0]
|
|
800c3ae: 2b00 cmp r3, #0
|
|
800c3b0: d1f8 bne.n 800c3a4 <tcp_send_fin+0x2c>
|
|
|
|
if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
|
|
800c3b2: 68fb ldr r3, [r7, #12]
|
|
800c3b4: 691b ldr r3, [r3, #16]
|
|
800c3b6: 899b ldrh r3, [r3, #12]
|
|
800c3b8: b29b uxth r3, r3
|
|
800c3ba: 4618 mov r0, r3
|
|
800c3bc: f7f9 f8c6 bl 800554c <lwip_htons>
|
|
800c3c0: 4603 mov r3, r0
|
|
800c3c2: b2db uxtb r3, r3
|
|
800c3c4: f003 0307 and.w r3, r3, #7
|
|
800c3c8: 2b00 cmp r3, #0
|
|
800c3ca: d116 bne.n 800c3fa <tcp_send_fin+0x82>
|
|
/* no SYN/FIN/RST flag in the header, we can add the FIN flag */
|
|
TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN);
|
|
800c3cc: 68fb ldr r3, [r7, #12]
|
|
800c3ce: 691b ldr r3, [r3, #16]
|
|
800c3d0: 899b ldrh r3, [r3, #12]
|
|
800c3d2: b29c uxth r4, r3
|
|
800c3d4: 2001 movs r0, #1
|
|
800c3d6: f7f9 f8b9 bl 800554c <lwip_htons>
|
|
800c3da: 4603 mov r3, r0
|
|
800c3dc: 461a mov r2, r3
|
|
800c3de: 68fb ldr r3, [r7, #12]
|
|
800c3e0: 691b ldr r3, [r3, #16]
|
|
800c3e2: 4322 orrs r2, r4
|
|
800c3e4: b292 uxth r2, r2
|
|
800c3e6: 819a strh r2, [r3, #12]
|
|
tcp_set_flags(pcb, TF_FIN);
|
|
800c3e8: 687b ldr r3, [r7, #4]
|
|
800c3ea: 8b5b ldrh r3, [r3, #26]
|
|
800c3ec: f043 0320 orr.w r3, r3, #32
|
|
800c3f0: b29a uxth r2, r3
|
|
800c3f2: 687b ldr r3, [r7, #4]
|
|
800c3f4: 835a strh r2, [r3, #26]
|
|
return ERR_OK;
|
|
800c3f6: 2300 movs r3, #0
|
|
800c3f8: e004 b.n 800c404 <tcp_send_fin+0x8c>
|
|
}
|
|
}
|
|
/* no data, no length, flags, copy=1, no optdata */
|
|
return tcp_enqueue_flags(pcb, TCP_FIN);
|
|
800c3fa: 2101 movs r1, #1
|
|
800c3fc: 6878 ldr r0, [r7, #4]
|
|
800c3fe: f000 f80b bl 800c418 <tcp_enqueue_flags>
|
|
800c402: 4603 mov r3, r0
|
|
}
|
|
800c404: 4618 mov r0, r3
|
|
800c406: 3714 adds r7, #20
|
|
800c408: 46bd mov sp, r7
|
|
800c40a: bd90 pop {r4, r7, pc}
|
|
800c40c: 08013618 .word 0x08013618
|
|
800c410: 08013a7c .word 0x08013a7c
|
|
800c414: 0801366c .word 0x0801366c
|
|
|
|
0800c418 <tcp_enqueue_flags>:
|
|
* @param pcb Protocol control block for the TCP connection.
|
|
* @param flags TCP header flags to set in the outgoing segment.
|
|
*/
|
|
err_t
|
|
tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)
|
|
{
|
|
800c418: b580 push {r7, lr}
|
|
800c41a: b088 sub sp, #32
|
|
800c41c: af02 add r7, sp, #8
|
|
800c41e: 6078 str r0, [r7, #4]
|
|
800c420: 460b mov r3, r1
|
|
800c422: 70fb strb r3, [r7, #3]
|
|
struct pbuf *p;
|
|
struct tcp_seg *seg;
|
|
u8_t optflags = 0;
|
|
800c424: 2300 movs r3, #0
|
|
800c426: 75fb strb r3, [r7, #23]
|
|
u8_t optlen = 0;
|
|
800c428: 2300 movs r3, #0
|
|
800c42a: 75bb strb r3, [r7, #22]
|
|
|
|
LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen));
|
|
|
|
LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
|
|
800c42c: 78fb ldrb r3, [r7, #3]
|
|
800c42e: f003 0303 and.w r3, r3, #3
|
|
800c432: 2b00 cmp r3, #0
|
|
800c434: d106 bne.n 800c444 <tcp_enqueue_flags+0x2c>
|
|
800c436: 4b67 ldr r3, [pc, #412] ; (800c5d4 <tcp_enqueue_flags+0x1bc>)
|
|
800c438: f240 4211 movw r2, #1041 ; 0x411
|
|
800c43c: 4966 ldr r1, [pc, #408] ; (800c5d8 <tcp_enqueue_flags+0x1c0>)
|
|
800c43e: 4867 ldr r0, [pc, #412] ; (800c5dc <tcp_enqueue_flags+0x1c4>)
|
|
800c440: f004 fbc2 bl 8010bc8 <iprintf>
|
|
(flags & (TCP_SYN | TCP_FIN)) != 0);
|
|
LWIP_ASSERT("tcp_enqueue_flags: invalid pcb", pcb != NULL);
|
|
800c444: 687b ldr r3, [r7, #4]
|
|
800c446: 2b00 cmp r3, #0
|
|
800c448: d106 bne.n 800c458 <tcp_enqueue_flags+0x40>
|
|
800c44a: 4b62 ldr r3, [pc, #392] ; (800c5d4 <tcp_enqueue_flags+0x1bc>)
|
|
800c44c: f240 4213 movw r2, #1043 ; 0x413
|
|
800c450: 4963 ldr r1, [pc, #396] ; (800c5e0 <tcp_enqueue_flags+0x1c8>)
|
|
800c452: 4862 ldr r0, [pc, #392] ; (800c5dc <tcp_enqueue_flags+0x1c4>)
|
|
800c454: f004 fbb8 bl 8010bc8 <iprintf>
|
|
|
|
/* No need to check pcb->snd_queuelen if only SYN or FIN are allowed! */
|
|
|
|
/* Get options for this segment. This is a special case since this is the
|
|
only place where a SYN can be sent. */
|
|
if (flags & TCP_SYN) {
|
|
800c458: 78fb ldrb r3, [r7, #3]
|
|
800c45a: f003 0302 and.w r3, r3, #2
|
|
800c45e: 2b00 cmp r3, #0
|
|
800c460: d001 beq.n 800c466 <tcp_enqueue_flags+0x4e>
|
|
optflags = TF_SEG_OPTS_MSS;
|
|
800c462: 2301 movs r3, #1
|
|
800c464: 75fb strb r3, [r7, #23]
|
|
/* Make sure the timestamp option is only included in data segments if we
|
|
agreed about it with the remote host (and in active open SYN segments). */
|
|
optflags |= TF_SEG_OPTS_TS;
|
|
}
|
|
#endif /* LWIP_TCP_TIMESTAMPS */
|
|
optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb);
|
|
800c466: 7dfb ldrb r3, [r7, #23]
|
|
800c468: 009b lsls r3, r3, #2
|
|
800c46a: b2db uxtb r3, r3
|
|
800c46c: f003 0304 and.w r3, r3, #4
|
|
800c470: 75bb strb r3, [r7, #22]
|
|
|
|
/* Allocate pbuf with room for TCP header + options */
|
|
if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
|
|
800c472: 7dbb ldrb r3, [r7, #22]
|
|
800c474: b29b uxth r3, r3
|
|
800c476: f44f 7220 mov.w r2, #640 ; 0x280
|
|
800c47a: 4619 mov r1, r3
|
|
800c47c: 2036 movs r0, #54 ; 0x36
|
|
800c47e: f7fa fac5 bl 8006a0c <pbuf_alloc>
|
|
800c482: 60f8 str r0, [r7, #12]
|
|
800c484: 68fb ldr r3, [r7, #12]
|
|
800c486: 2b00 cmp r3, #0
|
|
800c488: d109 bne.n 800c49e <tcp_enqueue_flags+0x86>
|
|
tcp_set_flags(pcb, TF_NAGLEMEMERR);
|
|
800c48a: 687b ldr r3, [r7, #4]
|
|
800c48c: 8b5b ldrh r3, [r3, #26]
|
|
800c48e: f043 0380 orr.w r3, r3, #128 ; 0x80
|
|
800c492: b29a uxth r2, r3
|
|
800c494: 687b ldr r3, [r7, #4]
|
|
800c496: 835a strh r2, [r3, #26]
|
|
TCP_STATS_INC(tcp.memerr);
|
|
return ERR_MEM;
|
|
800c498: f04f 33ff mov.w r3, #4294967295
|
|
800c49c: e095 b.n 800c5ca <tcp_enqueue_flags+0x1b2>
|
|
}
|
|
LWIP_ASSERT("tcp_enqueue_flags: check that first pbuf can hold optlen",
|
|
800c49e: 68fb ldr r3, [r7, #12]
|
|
800c4a0: 895a ldrh r2, [r3, #10]
|
|
800c4a2: 7dbb ldrb r3, [r7, #22]
|
|
800c4a4: b29b uxth r3, r3
|
|
800c4a6: 429a cmp r2, r3
|
|
800c4a8: d206 bcs.n 800c4b8 <tcp_enqueue_flags+0xa0>
|
|
800c4aa: 4b4a ldr r3, [pc, #296] ; (800c5d4 <tcp_enqueue_flags+0x1bc>)
|
|
800c4ac: f240 4239 movw r2, #1081 ; 0x439
|
|
800c4b0: 494c ldr r1, [pc, #304] ; (800c5e4 <tcp_enqueue_flags+0x1cc>)
|
|
800c4b2: 484a ldr r0, [pc, #296] ; (800c5dc <tcp_enqueue_flags+0x1c4>)
|
|
800c4b4: f004 fb88 bl 8010bc8 <iprintf>
|
|
(p->len >= optlen));
|
|
|
|
/* Allocate memory for tcp_seg, and fill in fields. */
|
|
if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) {
|
|
800c4b8: 687b ldr r3, [r7, #4]
|
|
800c4ba: 6dd9 ldr r1, [r3, #92] ; 0x5c
|
|
800c4bc: 78fa ldrb r2, [r7, #3]
|
|
800c4be: 7dfb ldrb r3, [r7, #23]
|
|
800c4c0: 9300 str r3, [sp, #0]
|
|
800c4c2: 460b mov r3, r1
|
|
800c4c4: 68f9 ldr r1, [r7, #12]
|
|
800c4c6: 6878 ldr r0, [r7, #4]
|
|
800c4c8: f7ff f8b8 bl 800b63c <tcp_create_segment>
|
|
800c4cc: 60b8 str r0, [r7, #8]
|
|
800c4ce: 68bb ldr r3, [r7, #8]
|
|
800c4d0: 2b00 cmp r3, #0
|
|
800c4d2: d109 bne.n 800c4e8 <tcp_enqueue_flags+0xd0>
|
|
tcp_set_flags(pcb, TF_NAGLEMEMERR);
|
|
800c4d4: 687b ldr r3, [r7, #4]
|
|
800c4d6: 8b5b ldrh r3, [r3, #26]
|
|
800c4d8: f043 0380 orr.w r3, r3, #128 ; 0x80
|
|
800c4dc: b29a uxth r2, r3
|
|
800c4de: 687b ldr r3, [r7, #4]
|
|
800c4e0: 835a strh r2, [r3, #26]
|
|
TCP_STATS_INC(tcp.memerr);
|
|
return ERR_MEM;
|
|
800c4e2: f04f 33ff mov.w r3, #4294967295
|
|
800c4e6: e070 b.n 800c5ca <tcp_enqueue_flags+0x1b2>
|
|
}
|
|
LWIP_ASSERT("seg->tcphdr not aligned", ((mem_ptr_t)seg->tcphdr % LWIP_MIN(MEM_ALIGNMENT, 4)) == 0);
|
|
800c4e8: 68bb ldr r3, [r7, #8]
|
|
800c4ea: 691b ldr r3, [r3, #16]
|
|
800c4ec: f003 0303 and.w r3, r3, #3
|
|
800c4f0: 2b00 cmp r3, #0
|
|
800c4f2: d006 beq.n 800c502 <tcp_enqueue_flags+0xea>
|
|
800c4f4: 4b37 ldr r3, [pc, #220] ; (800c5d4 <tcp_enqueue_flags+0x1bc>)
|
|
800c4f6: f240 4242 movw r2, #1090 ; 0x442
|
|
800c4fa: 493b ldr r1, [pc, #236] ; (800c5e8 <tcp_enqueue_flags+0x1d0>)
|
|
800c4fc: 4837 ldr r0, [pc, #220] ; (800c5dc <tcp_enqueue_flags+0x1c4>)
|
|
800c4fe: f004 fb63 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_enqueue_flags: invalid segment length", seg->len == 0);
|
|
800c502: 68bb ldr r3, [r7, #8]
|
|
800c504: 891b ldrh r3, [r3, #8]
|
|
800c506: 2b00 cmp r3, #0
|
|
800c508: d006 beq.n 800c518 <tcp_enqueue_flags+0x100>
|
|
800c50a: 4b32 ldr r3, [pc, #200] ; (800c5d4 <tcp_enqueue_flags+0x1bc>)
|
|
800c50c: f240 4243 movw r2, #1091 ; 0x443
|
|
800c510: 4936 ldr r1, [pc, #216] ; (800c5ec <tcp_enqueue_flags+0x1d4>)
|
|
800c512: 4832 ldr r0, [pc, #200] ; (800c5dc <tcp_enqueue_flags+0x1c4>)
|
|
800c514: f004 fb58 bl 8010bc8 <iprintf>
|
|
lwip_ntohl(seg->tcphdr->seqno),
|
|
lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg),
|
|
(u16_t)flags));
|
|
|
|
/* Now append seg to pcb->unsent queue */
|
|
if (pcb->unsent == NULL) {
|
|
800c518: 687b ldr r3, [r7, #4]
|
|
800c51a: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c51c: 2b00 cmp r3, #0
|
|
800c51e: d103 bne.n 800c528 <tcp_enqueue_flags+0x110>
|
|
pcb->unsent = seg;
|
|
800c520: 687b ldr r3, [r7, #4]
|
|
800c522: 68ba ldr r2, [r7, #8]
|
|
800c524: 66da str r2, [r3, #108] ; 0x6c
|
|
800c526: e00d b.n 800c544 <tcp_enqueue_flags+0x12c>
|
|
} else {
|
|
struct tcp_seg *useg;
|
|
for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
|
|
800c528: 687b ldr r3, [r7, #4]
|
|
800c52a: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c52c: 613b str r3, [r7, #16]
|
|
800c52e: e002 b.n 800c536 <tcp_enqueue_flags+0x11e>
|
|
800c530: 693b ldr r3, [r7, #16]
|
|
800c532: 681b ldr r3, [r3, #0]
|
|
800c534: 613b str r3, [r7, #16]
|
|
800c536: 693b ldr r3, [r7, #16]
|
|
800c538: 681b ldr r3, [r3, #0]
|
|
800c53a: 2b00 cmp r3, #0
|
|
800c53c: d1f8 bne.n 800c530 <tcp_enqueue_flags+0x118>
|
|
useg->next = seg;
|
|
800c53e: 693b ldr r3, [r7, #16]
|
|
800c540: 68ba ldr r2, [r7, #8]
|
|
800c542: 601a str r2, [r3, #0]
|
|
}
|
|
#if TCP_OVERSIZE
|
|
/* The new unsent tail has no space */
|
|
pcb->unsent_oversize = 0;
|
|
800c544: 687b ldr r3, [r7, #4]
|
|
800c546: 2200 movs r2, #0
|
|
800c548: f8a3 2068 strh.w r2, [r3, #104] ; 0x68
|
|
#endif /* TCP_OVERSIZE */
|
|
|
|
/* SYN and FIN bump the sequence number */
|
|
if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
|
|
800c54c: 78fb ldrb r3, [r7, #3]
|
|
800c54e: f003 0302 and.w r3, r3, #2
|
|
800c552: 2b00 cmp r3, #0
|
|
800c554: d104 bne.n 800c560 <tcp_enqueue_flags+0x148>
|
|
800c556: 78fb ldrb r3, [r7, #3]
|
|
800c558: f003 0301 and.w r3, r3, #1
|
|
800c55c: 2b00 cmp r3, #0
|
|
800c55e: d004 beq.n 800c56a <tcp_enqueue_flags+0x152>
|
|
pcb->snd_lbb++;
|
|
800c560: 687b ldr r3, [r7, #4]
|
|
800c562: 6ddb ldr r3, [r3, #92] ; 0x5c
|
|
800c564: 1c5a adds r2, r3, #1
|
|
800c566: 687b ldr r3, [r7, #4]
|
|
800c568: 65da str r2, [r3, #92] ; 0x5c
|
|
/* optlen does not influence snd_buf */
|
|
}
|
|
if (flags & TCP_FIN) {
|
|
800c56a: 78fb ldrb r3, [r7, #3]
|
|
800c56c: f003 0301 and.w r3, r3, #1
|
|
800c570: 2b00 cmp r3, #0
|
|
800c572: d006 beq.n 800c582 <tcp_enqueue_flags+0x16a>
|
|
tcp_set_flags(pcb, TF_FIN);
|
|
800c574: 687b ldr r3, [r7, #4]
|
|
800c576: 8b5b ldrh r3, [r3, #26]
|
|
800c578: f043 0320 orr.w r3, r3, #32
|
|
800c57c: b29a uxth r2, r3
|
|
800c57e: 687b ldr r3, [r7, #4]
|
|
800c580: 835a strh r2, [r3, #26]
|
|
}
|
|
|
|
/* update number of segments on the queues */
|
|
pcb->snd_queuelen += pbuf_clen(seg->p);
|
|
800c582: 68bb ldr r3, [r7, #8]
|
|
800c584: 685b ldr r3, [r3, #4]
|
|
800c586: 4618 mov r0, r3
|
|
800c588: f7fa fdac bl 80070e4 <pbuf_clen>
|
|
800c58c: 4603 mov r3, r0
|
|
800c58e: 461a mov r2, r3
|
|
800c590: 687b ldr r3, [r7, #4]
|
|
800c592: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800c596: 4413 add r3, r2
|
|
800c598: b29a uxth r2, r3
|
|
800c59a: 687b ldr r3, [r7, #4]
|
|
800c59c: f8a3 2066 strh.w r2, [r3, #102] ; 0x66
|
|
LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: %"S16_F" (after enqueued)\n", pcb->snd_queuelen));
|
|
if (pcb->snd_queuelen != 0) {
|
|
800c5a0: 687b ldr r3, [r7, #4]
|
|
800c5a2: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800c5a6: 2b00 cmp r3, #0
|
|
800c5a8: d00e beq.n 800c5c8 <tcp_enqueue_flags+0x1b0>
|
|
LWIP_ASSERT("tcp_enqueue_flags: invalid queue length",
|
|
800c5aa: 687b ldr r3, [r7, #4]
|
|
800c5ac: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800c5ae: 2b00 cmp r3, #0
|
|
800c5b0: d10a bne.n 800c5c8 <tcp_enqueue_flags+0x1b0>
|
|
800c5b2: 687b ldr r3, [r7, #4]
|
|
800c5b4: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c5b6: 2b00 cmp r3, #0
|
|
800c5b8: d106 bne.n 800c5c8 <tcp_enqueue_flags+0x1b0>
|
|
800c5ba: 4b06 ldr r3, [pc, #24] ; (800c5d4 <tcp_enqueue_flags+0x1bc>)
|
|
800c5bc: f240 4265 movw r2, #1125 ; 0x465
|
|
800c5c0: 490b ldr r1, [pc, #44] ; (800c5f0 <tcp_enqueue_flags+0x1d8>)
|
|
800c5c2: 4806 ldr r0, [pc, #24] ; (800c5dc <tcp_enqueue_flags+0x1c4>)
|
|
800c5c4: f004 fb00 bl 8010bc8 <iprintf>
|
|
pcb->unacked != NULL || pcb->unsent != NULL);
|
|
}
|
|
|
|
return ERR_OK;
|
|
800c5c8: 2300 movs r3, #0
|
|
}
|
|
800c5ca: 4618 mov r0, r3
|
|
800c5cc: 3718 adds r7, #24
|
|
800c5ce: 46bd mov sp, r7
|
|
800c5d0: bd80 pop {r7, pc}
|
|
800c5d2: bf00 nop
|
|
800c5d4: 08013618 .word 0x08013618
|
|
800c5d8: 08013a98 .word 0x08013a98
|
|
800c5dc: 0801366c .word 0x0801366c
|
|
800c5e0: 08013af0 .word 0x08013af0
|
|
800c5e4: 08013b10 .word 0x08013b10
|
|
800c5e8: 08013b4c .word 0x08013b4c
|
|
800c5ec: 08013b64 .word 0x08013b64
|
|
800c5f0: 08013b90 .word 0x08013b90
|
|
|
|
0800c5f4 <tcp_output>:
|
|
* @return ERR_OK if data has been sent or nothing to send
|
|
* another err_t on error
|
|
*/
|
|
err_t
|
|
tcp_output(struct tcp_pcb *pcb)
|
|
{
|
|
800c5f4: b5b0 push {r4, r5, r7, lr}
|
|
800c5f6: b08a sub sp, #40 ; 0x28
|
|
800c5f8: af00 add r7, sp, #0
|
|
800c5fa: 6078 str r0, [r7, #4]
|
|
s16_t i = 0;
|
|
#endif /* TCP_CWND_DEBUG */
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ASSERT("tcp_output: invalid pcb", pcb != NULL);
|
|
800c5fc: 687b ldr r3, [r7, #4]
|
|
800c5fe: 2b00 cmp r3, #0
|
|
800c600: d106 bne.n 800c610 <tcp_output+0x1c>
|
|
800c602: 4b8a ldr r3, [pc, #552] ; (800c82c <tcp_output+0x238>)
|
|
800c604: f240 42e1 movw r2, #1249 ; 0x4e1
|
|
800c608: 4989 ldr r1, [pc, #548] ; (800c830 <tcp_output+0x23c>)
|
|
800c60a: 488a ldr r0, [pc, #552] ; (800c834 <tcp_output+0x240>)
|
|
800c60c: f004 fadc bl 8010bc8 <iprintf>
|
|
/* pcb->state LISTEN not allowed here */
|
|
LWIP_ASSERT("don't call tcp_output for listen-pcbs",
|
|
800c610: 687b ldr r3, [r7, #4]
|
|
800c612: 7d1b ldrb r3, [r3, #20]
|
|
800c614: 2b01 cmp r3, #1
|
|
800c616: d106 bne.n 800c626 <tcp_output+0x32>
|
|
800c618: 4b84 ldr r3, [pc, #528] ; (800c82c <tcp_output+0x238>)
|
|
800c61a: f240 42e3 movw r2, #1251 ; 0x4e3
|
|
800c61e: 4986 ldr r1, [pc, #536] ; (800c838 <tcp_output+0x244>)
|
|
800c620: 4884 ldr r0, [pc, #528] ; (800c834 <tcp_output+0x240>)
|
|
800c622: f004 fad1 bl 8010bc8 <iprintf>
|
|
|
|
/* First, check if we are invoked by the TCP input processing
|
|
code. If so, we do not output anything. Instead, we rely on the
|
|
input processing code to call us when input processing is done
|
|
with. */
|
|
if (tcp_input_pcb == pcb) {
|
|
800c626: 4b85 ldr r3, [pc, #532] ; (800c83c <tcp_output+0x248>)
|
|
800c628: 681b ldr r3, [r3, #0]
|
|
800c62a: 687a ldr r2, [r7, #4]
|
|
800c62c: 429a cmp r2, r3
|
|
800c62e: d101 bne.n 800c634 <tcp_output+0x40>
|
|
return ERR_OK;
|
|
800c630: 2300 movs r3, #0
|
|
800c632: e1d1 b.n 800c9d8 <tcp_output+0x3e4>
|
|
}
|
|
|
|
wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
|
|
800c634: 687b ldr r3, [r7, #4]
|
|
800c636: f8b3 2048 ldrh.w r2, [r3, #72] ; 0x48
|
|
800c63a: 687b ldr r3, [r7, #4]
|
|
800c63c: f8b3 3060 ldrh.w r3, [r3, #96] ; 0x60
|
|
800c640: 4293 cmp r3, r2
|
|
800c642: bf28 it cs
|
|
800c644: 4613 movcs r3, r2
|
|
800c646: b29b uxth r3, r3
|
|
800c648: 61bb str r3, [r7, #24]
|
|
|
|
seg = pcb->unsent;
|
|
800c64a: 687b ldr r3, [r7, #4]
|
|
800c64c: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c64e: 627b str r3, [r7, #36] ; 0x24
|
|
|
|
if (seg == NULL) {
|
|
800c650: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c652: 2b00 cmp r3, #0
|
|
800c654: d10b bne.n 800c66e <tcp_output+0x7a>
|
|
", seg == NULL, ack %"U32_F"\n",
|
|
pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack));
|
|
|
|
/* If the TF_ACK_NOW flag is set and the ->unsent queue is empty, construct
|
|
* an empty ACK segment and send it. */
|
|
if (pcb->flags & TF_ACK_NOW) {
|
|
800c656: 687b ldr r3, [r7, #4]
|
|
800c658: 8b5b ldrh r3, [r3, #26]
|
|
800c65a: f003 0302 and.w r3, r3, #2
|
|
800c65e: 2b00 cmp r3, #0
|
|
800c660: f000 81ad beq.w 800c9be <tcp_output+0x3ca>
|
|
return tcp_send_empty_ack(pcb);
|
|
800c664: 6878 ldr r0, [r7, #4]
|
|
800c666: f000 fdd7 bl 800d218 <tcp_send_empty_ack>
|
|
800c66a: 4603 mov r3, r0
|
|
800c66c: e1b4 b.n 800c9d8 <tcp_output+0x3e4>
|
|
pcb->snd_wnd, pcb->cwnd, wnd,
|
|
lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
|
|
lwip_ntohl(seg->tcphdr->seqno), pcb->lastack));
|
|
}
|
|
|
|
netif = tcp_route(pcb, &pcb->local_ip, &pcb->remote_ip);
|
|
800c66e: 6879 ldr r1, [r7, #4]
|
|
800c670: 687b ldr r3, [r7, #4]
|
|
800c672: 3304 adds r3, #4
|
|
800c674: 461a mov r2, r3
|
|
800c676: 6878 ldr r0, [r7, #4]
|
|
800c678: f7fe ffc4 bl 800b604 <tcp_route>
|
|
800c67c: 6178 str r0, [r7, #20]
|
|
if (netif == NULL) {
|
|
800c67e: 697b ldr r3, [r7, #20]
|
|
800c680: 2b00 cmp r3, #0
|
|
800c682: d102 bne.n 800c68a <tcp_output+0x96>
|
|
return ERR_RTE;
|
|
800c684: f06f 0303 mvn.w r3, #3
|
|
800c688: e1a6 b.n 800c9d8 <tcp_output+0x3e4>
|
|
}
|
|
|
|
/* If we don't have a local IP address, we get one from netif */
|
|
if (ip_addr_isany(&pcb->local_ip)) {
|
|
800c68a: 687b ldr r3, [r7, #4]
|
|
800c68c: 2b00 cmp r3, #0
|
|
800c68e: d003 beq.n 800c698 <tcp_output+0xa4>
|
|
800c690: 687b ldr r3, [r7, #4]
|
|
800c692: 681b ldr r3, [r3, #0]
|
|
800c694: 2b00 cmp r3, #0
|
|
800c696: d111 bne.n 800c6bc <tcp_output+0xc8>
|
|
const ip_addr_t *local_ip = ip_netif_get_local_ip(netif, &pcb->remote_ip);
|
|
800c698: 697b ldr r3, [r7, #20]
|
|
800c69a: 2b00 cmp r3, #0
|
|
800c69c: d002 beq.n 800c6a4 <tcp_output+0xb0>
|
|
800c69e: 697b ldr r3, [r7, #20]
|
|
800c6a0: 3304 adds r3, #4
|
|
800c6a2: e000 b.n 800c6a6 <tcp_output+0xb2>
|
|
800c6a4: 2300 movs r3, #0
|
|
800c6a6: 613b str r3, [r7, #16]
|
|
if (local_ip == NULL) {
|
|
800c6a8: 693b ldr r3, [r7, #16]
|
|
800c6aa: 2b00 cmp r3, #0
|
|
800c6ac: d102 bne.n 800c6b4 <tcp_output+0xc0>
|
|
return ERR_RTE;
|
|
800c6ae: f06f 0303 mvn.w r3, #3
|
|
800c6b2: e191 b.n 800c9d8 <tcp_output+0x3e4>
|
|
}
|
|
ip_addr_copy(pcb->local_ip, *local_ip);
|
|
800c6b4: 693b ldr r3, [r7, #16]
|
|
800c6b6: 681a ldr r2, [r3, #0]
|
|
800c6b8: 687b ldr r3, [r7, #4]
|
|
800c6ba: 601a str r2, [r3, #0]
|
|
}
|
|
|
|
/* Handle the current segment not fitting within the window */
|
|
if (lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd) {
|
|
800c6bc: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c6be: 691b ldr r3, [r3, #16]
|
|
800c6c0: 685b ldr r3, [r3, #4]
|
|
800c6c2: 4618 mov r0, r3
|
|
800c6c4: f7f8 ff57 bl 8005576 <lwip_htonl>
|
|
800c6c8: 4602 mov r2, r0
|
|
800c6ca: 687b ldr r3, [r7, #4]
|
|
800c6cc: 6c5b ldr r3, [r3, #68] ; 0x44
|
|
800c6ce: 1ad3 subs r3, r2, r3
|
|
800c6d0: 6a7a ldr r2, [r7, #36] ; 0x24
|
|
800c6d2: 8912 ldrh r2, [r2, #8]
|
|
800c6d4: 4413 add r3, r2
|
|
800c6d6: 69ba ldr r2, [r7, #24]
|
|
800c6d8: 429a cmp r2, r3
|
|
800c6da: d227 bcs.n 800c72c <tcp_output+0x138>
|
|
* within the remaining (could be 0) send window and RTO timer is not running (we
|
|
* have no in-flight data). If window is still too small after persist timer fires,
|
|
* then we split the segment. We don't consider the congestion window since a cwnd
|
|
* smaller than 1 SMSS implies in-flight data
|
|
*/
|
|
if (wnd == pcb->snd_wnd && pcb->unacked == NULL && pcb->persist_backoff == 0) {
|
|
800c6dc: 687b ldr r3, [r7, #4]
|
|
800c6de: f8b3 3060 ldrh.w r3, [r3, #96] ; 0x60
|
|
800c6e2: 461a mov r2, r3
|
|
800c6e4: 69bb ldr r3, [r7, #24]
|
|
800c6e6: 4293 cmp r3, r2
|
|
800c6e8: d114 bne.n 800c714 <tcp_output+0x120>
|
|
800c6ea: 687b ldr r3, [r7, #4]
|
|
800c6ec: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800c6ee: 2b00 cmp r3, #0
|
|
800c6f0: d110 bne.n 800c714 <tcp_output+0x120>
|
|
800c6f2: 687b ldr r3, [r7, #4]
|
|
800c6f4: f893 3099 ldrb.w r3, [r3, #153] ; 0x99
|
|
800c6f8: 2b00 cmp r3, #0
|
|
800c6fa: d10b bne.n 800c714 <tcp_output+0x120>
|
|
pcb->persist_cnt = 0;
|
|
800c6fc: 687b ldr r3, [r7, #4]
|
|
800c6fe: 2200 movs r2, #0
|
|
800c700: f883 2098 strb.w r2, [r3, #152] ; 0x98
|
|
pcb->persist_backoff = 1;
|
|
800c704: 687b ldr r3, [r7, #4]
|
|
800c706: 2201 movs r2, #1
|
|
800c708: f883 2099 strb.w r2, [r3, #153] ; 0x99
|
|
pcb->persist_probe = 0;
|
|
800c70c: 687b ldr r3, [r7, #4]
|
|
800c70e: 2200 movs r2, #0
|
|
800c710: f883 209a strb.w r2, [r3, #154] ; 0x9a
|
|
}
|
|
/* We need an ACK, but can't send data now, so send an empty ACK */
|
|
if (pcb->flags & TF_ACK_NOW) {
|
|
800c714: 687b ldr r3, [r7, #4]
|
|
800c716: 8b5b ldrh r3, [r3, #26]
|
|
800c718: f003 0302 and.w r3, r3, #2
|
|
800c71c: 2b00 cmp r3, #0
|
|
800c71e: f000 8150 beq.w 800c9c2 <tcp_output+0x3ce>
|
|
return tcp_send_empty_ack(pcb);
|
|
800c722: 6878 ldr r0, [r7, #4]
|
|
800c724: f000 fd78 bl 800d218 <tcp_send_empty_ack>
|
|
800c728: 4603 mov r3, r0
|
|
800c72a: e155 b.n 800c9d8 <tcp_output+0x3e4>
|
|
}
|
|
goto output_done;
|
|
}
|
|
/* Stop persist timer, above conditions are not active */
|
|
pcb->persist_backoff = 0;
|
|
800c72c: 687b ldr r3, [r7, #4]
|
|
800c72e: 2200 movs r2, #0
|
|
800c730: f883 2099 strb.w r2, [r3, #153] ; 0x99
|
|
|
|
/* useg should point to last segment on unacked queue */
|
|
useg = pcb->unacked;
|
|
800c734: 687b ldr r3, [r7, #4]
|
|
800c736: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800c738: 623b str r3, [r7, #32]
|
|
if (useg != NULL) {
|
|
800c73a: 6a3b ldr r3, [r7, #32]
|
|
800c73c: 2b00 cmp r3, #0
|
|
800c73e: f000 811f beq.w 800c980 <tcp_output+0x38c>
|
|
for (; useg->next != NULL; useg = useg->next);
|
|
800c742: e002 b.n 800c74a <tcp_output+0x156>
|
|
800c744: 6a3b ldr r3, [r7, #32]
|
|
800c746: 681b ldr r3, [r3, #0]
|
|
800c748: 623b str r3, [r7, #32]
|
|
800c74a: 6a3b ldr r3, [r7, #32]
|
|
800c74c: 681b ldr r3, [r3, #0]
|
|
800c74e: 2b00 cmp r3, #0
|
|
800c750: d1f8 bne.n 800c744 <tcp_output+0x150>
|
|
}
|
|
/* data available and window allows it to be sent? */
|
|
while (seg != NULL &&
|
|
800c752: e115 b.n 800c980 <tcp_output+0x38c>
|
|
lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
|
|
LWIP_ASSERT("RST not expected here!",
|
|
800c754: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c756: 691b ldr r3, [r3, #16]
|
|
800c758: 899b ldrh r3, [r3, #12]
|
|
800c75a: b29b uxth r3, r3
|
|
800c75c: 4618 mov r0, r3
|
|
800c75e: f7f8 fef5 bl 800554c <lwip_htons>
|
|
800c762: 4603 mov r3, r0
|
|
800c764: b2db uxtb r3, r3
|
|
800c766: f003 0304 and.w r3, r3, #4
|
|
800c76a: 2b00 cmp r3, #0
|
|
800c76c: d006 beq.n 800c77c <tcp_output+0x188>
|
|
800c76e: 4b2f ldr r3, [pc, #188] ; (800c82c <tcp_output+0x238>)
|
|
800c770: f240 5236 movw r2, #1334 ; 0x536
|
|
800c774: 4932 ldr r1, [pc, #200] ; (800c840 <tcp_output+0x24c>)
|
|
800c776: 482f ldr r0, [pc, #188] ; (800c834 <tcp_output+0x240>)
|
|
800c778: f004 fa26 bl 8010bc8 <iprintf>
|
|
* - if tcp_write had a memory error before (prevent delayed ACK timeout) or
|
|
* - if FIN was already enqueued for this PCB (SYN is always alone in a segment -
|
|
* either seg->next != NULL or pcb->unacked == NULL;
|
|
* RST is no sent using tcp_write/tcp_output.
|
|
*/
|
|
if ((tcp_do_output_nagle(pcb) == 0) &&
|
|
800c77c: 687b ldr r3, [r7, #4]
|
|
800c77e: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800c780: 2b00 cmp r3, #0
|
|
800c782: d01f beq.n 800c7c4 <tcp_output+0x1d0>
|
|
800c784: 687b ldr r3, [r7, #4]
|
|
800c786: 8b5b ldrh r3, [r3, #26]
|
|
800c788: f003 0344 and.w r3, r3, #68 ; 0x44
|
|
800c78c: 2b00 cmp r3, #0
|
|
800c78e: d119 bne.n 800c7c4 <tcp_output+0x1d0>
|
|
800c790: 687b ldr r3, [r7, #4]
|
|
800c792: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c794: 2b00 cmp r3, #0
|
|
800c796: d00b beq.n 800c7b0 <tcp_output+0x1bc>
|
|
800c798: 687b ldr r3, [r7, #4]
|
|
800c79a: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c79c: 681b ldr r3, [r3, #0]
|
|
800c79e: 2b00 cmp r3, #0
|
|
800c7a0: d110 bne.n 800c7c4 <tcp_output+0x1d0>
|
|
800c7a2: 687b ldr r3, [r7, #4]
|
|
800c7a4: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c7a6: 891a ldrh r2, [r3, #8]
|
|
800c7a8: 687b ldr r3, [r7, #4]
|
|
800c7aa: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800c7ac: 429a cmp r2, r3
|
|
800c7ae: d209 bcs.n 800c7c4 <tcp_output+0x1d0>
|
|
800c7b0: 687b ldr r3, [r7, #4]
|
|
800c7b2: f8b3 3064 ldrh.w r3, [r3, #100] ; 0x64
|
|
800c7b6: 2b00 cmp r3, #0
|
|
800c7b8: d004 beq.n 800c7c4 <tcp_output+0x1d0>
|
|
800c7ba: 687b ldr r3, [r7, #4]
|
|
800c7bc: f8b3 3066 ldrh.w r3, [r3, #102] ; 0x66
|
|
800c7c0: 2b08 cmp r3, #8
|
|
800c7c2: d901 bls.n 800c7c8 <tcp_output+0x1d4>
|
|
800c7c4: 2301 movs r3, #1
|
|
800c7c6: e000 b.n 800c7ca <tcp_output+0x1d6>
|
|
800c7c8: 2300 movs r3, #0
|
|
800c7ca: 2b00 cmp r3, #0
|
|
800c7cc: d106 bne.n 800c7dc <tcp_output+0x1e8>
|
|
((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)) {
|
|
800c7ce: 687b ldr r3, [r7, #4]
|
|
800c7d0: 8b5b ldrh r3, [r3, #26]
|
|
800c7d2: f003 03a0 and.w r3, r3, #160 ; 0xa0
|
|
if ((tcp_do_output_nagle(pcb) == 0) &&
|
|
800c7d6: 2b00 cmp r3, #0
|
|
800c7d8: f000 80e7 beq.w 800c9aa <tcp_output+0x3b6>
|
|
pcb->lastack,
|
|
lwip_ntohl(seg->tcphdr->seqno), pcb->lastack, i));
|
|
++i;
|
|
#endif /* TCP_CWND_DEBUG */
|
|
|
|
if (pcb->state != SYN_SENT) {
|
|
800c7dc: 687b ldr r3, [r7, #4]
|
|
800c7de: 7d1b ldrb r3, [r3, #20]
|
|
800c7e0: 2b02 cmp r3, #2
|
|
800c7e2: d00d beq.n 800c800 <tcp_output+0x20c>
|
|
TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
|
|
800c7e4: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c7e6: 691b ldr r3, [r3, #16]
|
|
800c7e8: 899b ldrh r3, [r3, #12]
|
|
800c7ea: b29c uxth r4, r3
|
|
800c7ec: 2010 movs r0, #16
|
|
800c7ee: f7f8 fead bl 800554c <lwip_htons>
|
|
800c7f2: 4603 mov r3, r0
|
|
800c7f4: 461a mov r2, r3
|
|
800c7f6: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c7f8: 691b ldr r3, [r3, #16]
|
|
800c7fa: 4322 orrs r2, r4
|
|
800c7fc: b292 uxth r2, r2
|
|
800c7fe: 819a strh r2, [r3, #12]
|
|
}
|
|
|
|
err = tcp_output_segment(seg, pcb, netif);
|
|
800c800: 697a ldr r2, [r7, #20]
|
|
800c802: 6879 ldr r1, [r7, #4]
|
|
800c804: 6a78 ldr r0, [r7, #36] ; 0x24
|
|
800c806: f000 f90b bl 800ca20 <tcp_output_segment>
|
|
800c80a: 4603 mov r3, r0
|
|
800c80c: 73fb strb r3, [r7, #15]
|
|
if (err != ERR_OK) {
|
|
800c80e: f997 300f ldrsb.w r3, [r7, #15]
|
|
800c812: 2b00 cmp r3, #0
|
|
800c814: d016 beq.n 800c844 <tcp_output+0x250>
|
|
/* segment could not be sent, for whatever reason */
|
|
tcp_set_flags(pcb, TF_NAGLEMEMERR);
|
|
800c816: 687b ldr r3, [r7, #4]
|
|
800c818: 8b5b ldrh r3, [r3, #26]
|
|
800c81a: f043 0380 orr.w r3, r3, #128 ; 0x80
|
|
800c81e: b29a uxth r2, r3
|
|
800c820: 687b ldr r3, [r7, #4]
|
|
800c822: 835a strh r2, [r3, #26]
|
|
return err;
|
|
800c824: f997 300f ldrsb.w r3, [r7, #15]
|
|
800c828: e0d6 b.n 800c9d8 <tcp_output+0x3e4>
|
|
800c82a: bf00 nop
|
|
800c82c: 08013618 .word 0x08013618
|
|
800c830: 08013bb8 .word 0x08013bb8
|
|
800c834: 0801366c .word 0x0801366c
|
|
800c838: 08013bd0 .word 0x08013bd0
|
|
800c83c: 24007bbc .word 0x24007bbc
|
|
800c840: 08013bf8 .word 0x08013bf8
|
|
}
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
seg->oversize_left = 0;
|
|
800c844: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c846: 2200 movs r2, #0
|
|
800c848: 815a strh r2, [r3, #10]
|
|
#endif /* TCP_OVERSIZE_DBGCHECK */
|
|
pcb->unsent = seg->next;
|
|
800c84a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c84c: 681a ldr r2, [r3, #0]
|
|
800c84e: 687b ldr r3, [r7, #4]
|
|
800c850: 66da str r2, [r3, #108] ; 0x6c
|
|
if (pcb->state != SYN_SENT) {
|
|
800c852: 687b ldr r3, [r7, #4]
|
|
800c854: 7d1b ldrb r3, [r3, #20]
|
|
800c856: 2b02 cmp r3, #2
|
|
800c858: d006 beq.n 800c868 <tcp_output+0x274>
|
|
tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
|
|
800c85a: 687b ldr r3, [r7, #4]
|
|
800c85c: 8b5b ldrh r3, [r3, #26]
|
|
800c85e: f023 0303 bic.w r3, r3, #3
|
|
800c862: b29a uxth r2, r3
|
|
800c864: 687b ldr r3, [r7, #4]
|
|
800c866: 835a strh r2, [r3, #26]
|
|
}
|
|
snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
|
|
800c868: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c86a: 691b ldr r3, [r3, #16]
|
|
800c86c: 685b ldr r3, [r3, #4]
|
|
800c86e: 4618 mov r0, r3
|
|
800c870: f7f8 fe81 bl 8005576 <lwip_htonl>
|
|
800c874: 4604 mov r4, r0
|
|
800c876: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c878: 891b ldrh r3, [r3, #8]
|
|
800c87a: 461d mov r5, r3
|
|
800c87c: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c87e: 691b ldr r3, [r3, #16]
|
|
800c880: 899b ldrh r3, [r3, #12]
|
|
800c882: b29b uxth r3, r3
|
|
800c884: 4618 mov r0, r3
|
|
800c886: f7f8 fe61 bl 800554c <lwip_htons>
|
|
800c88a: 4603 mov r3, r0
|
|
800c88c: b2db uxtb r3, r3
|
|
800c88e: f003 0303 and.w r3, r3, #3
|
|
800c892: 2b00 cmp r3, #0
|
|
800c894: d001 beq.n 800c89a <tcp_output+0x2a6>
|
|
800c896: 2301 movs r3, #1
|
|
800c898: e000 b.n 800c89c <tcp_output+0x2a8>
|
|
800c89a: 2300 movs r3, #0
|
|
800c89c: 442b add r3, r5
|
|
800c89e: 4423 add r3, r4
|
|
800c8a0: 60bb str r3, [r7, #8]
|
|
if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
|
|
800c8a2: 687b ldr r3, [r7, #4]
|
|
800c8a4: 6d1a ldr r2, [r3, #80] ; 0x50
|
|
800c8a6: 68bb ldr r3, [r7, #8]
|
|
800c8a8: 1ad3 subs r3, r2, r3
|
|
800c8aa: 2b00 cmp r3, #0
|
|
800c8ac: da02 bge.n 800c8b4 <tcp_output+0x2c0>
|
|
pcb->snd_nxt = snd_nxt;
|
|
800c8ae: 687b ldr r3, [r7, #4]
|
|
800c8b0: 68ba ldr r2, [r7, #8]
|
|
800c8b2: 651a str r2, [r3, #80] ; 0x50
|
|
}
|
|
/* put segment on unacknowledged list if length > 0 */
|
|
if (TCP_TCPLEN(seg) > 0) {
|
|
800c8b4: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c8b6: 891b ldrh r3, [r3, #8]
|
|
800c8b8: 461c mov r4, r3
|
|
800c8ba: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c8bc: 691b ldr r3, [r3, #16]
|
|
800c8be: 899b ldrh r3, [r3, #12]
|
|
800c8c0: b29b uxth r3, r3
|
|
800c8c2: 4618 mov r0, r3
|
|
800c8c4: f7f8 fe42 bl 800554c <lwip_htons>
|
|
800c8c8: 4603 mov r3, r0
|
|
800c8ca: b2db uxtb r3, r3
|
|
800c8cc: f003 0303 and.w r3, r3, #3
|
|
800c8d0: 2b00 cmp r3, #0
|
|
800c8d2: d001 beq.n 800c8d8 <tcp_output+0x2e4>
|
|
800c8d4: 2301 movs r3, #1
|
|
800c8d6: e000 b.n 800c8da <tcp_output+0x2e6>
|
|
800c8d8: 2300 movs r3, #0
|
|
800c8da: 4423 add r3, r4
|
|
800c8dc: 2b00 cmp r3, #0
|
|
800c8de: d049 beq.n 800c974 <tcp_output+0x380>
|
|
seg->next = NULL;
|
|
800c8e0: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c8e2: 2200 movs r2, #0
|
|
800c8e4: 601a str r2, [r3, #0]
|
|
/* unacked list is empty? */
|
|
if (pcb->unacked == NULL) {
|
|
800c8e6: 687b ldr r3, [r7, #4]
|
|
800c8e8: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800c8ea: 2b00 cmp r3, #0
|
|
800c8ec: d105 bne.n 800c8fa <tcp_output+0x306>
|
|
pcb->unacked = seg;
|
|
800c8ee: 687b ldr r3, [r7, #4]
|
|
800c8f0: 6a7a ldr r2, [r7, #36] ; 0x24
|
|
800c8f2: 671a str r2, [r3, #112] ; 0x70
|
|
useg = seg;
|
|
800c8f4: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c8f6: 623b str r3, [r7, #32]
|
|
800c8f8: e03f b.n 800c97a <tcp_output+0x386>
|
|
/* unacked list is not empty? */
|
|
} else {
|
|
/* In the case of fast retransmit, the packet should not go to the tail
|
|
* of the unacked queue, but rather somewhere before it. We need to check for
|
|
* this case. -STJ Jul 27, 2004 */
|
|
if (TCP_SEQ_LT(lwip_ntohl(seg->tcphdr->seqno), lwip_ntohl(useg->tcphdr->seqno))) {
|
|
800c8fa: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c8fc: 691b ldr r3, [r3, #16]
|
|
800c8fe: 685b ldr r3, [r3, #4]
|
|
800c900: 4618 mov r0, r3
|
|
800c902: f7f8 fe38 bl 8005576 <lwip_htonl>
|
|
800c906: 4604 mov r4, r0
|
|
800c908: 6a3b ldr r3, [r7, #32]
|
|
800c90a: 691b ldr r3, [r3, #16]
|
|
800c90c: 685b ldr r3, [r3, #4]
|
|
800c90e: 4618 mov r0, r3
|
|
800c910: f7f8 fe31 bl 8005576 <lwip_htonl>
|
|
800c914: 4603 mov r3, r0
|
|
800c916: 1ae3 subs r3, r4, r3
|
|
800c918: 2b00 cmp r3, #0
|
|
800c91a: da24 bge.n 800c966 <tcp_output+0x372>
|
|
/* add segment to before tail of unacked list, keeping the list sorted */
|
|
struct tcp_seg **cur_seg = &(pcb->unacked);
|
|
800c91c: 687b ldr r3, [r7, #4]
|
|
800c91e: 3370 adds r3, #112 ; 0x70
|
|
800c920: 61fb str r3, [r7, #28]
|
|
while (*cur_seg &&
|
|
800c922: e002 b.n 800c92a <tcp_output+0x336>
|
|
TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
|
|
cur_seg = &((*cur_seg)->next );
|
|
800c924: 69fb ldr r3, [r7, #28]
|
|
800c926: 681b ldr r3, [r3, #0]
|
|
800c928: 61fb str r3, [r7, #28]
|
|
while (*cur_seg &&
|
|
800c92a: 69fb ldr r3, [r7, #28]
|
|
800c92c: 681b ldr r3, [r3, #0]
|
|
800c92e: 2b00 cmp r3, #0
|
|
800c930: d011 beq.n 800c956 <tcp_output+0x362>
|
|
TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
|
|
800c932: 69fb ldr r3, [r7, #28]
|
|
800c934: 681b ldr r3, [r3, #0]
|
|
800c936: 691b ldr r3, [r3, #16]
|
|
800c938: 685b ldr r3, [r3, #4]
|
|
800c93a: 4618 mov r0, r3
|
|
800c93c: f7f8 fe1b bl 8005576 <lwip_htonl>
|
|
800c940: 4604 mov r4, r0
|
|
800c942: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c944: 691b ldr r3, [r3, #16]
|
|
800c946: 685b ldr r3, [r3, #4]
|
|
800c948: 4618 mov r0, r3
|
|
800c94a: f7f8 fe14 bl 8005576 <lwip_htonl>
|
|
800c94e: 4603 mov r3, r0
|
|
800c950: 1ae3 subs r3, r4, r3
|
|
while (*cur_seg &&
|
|
800c952: 2b00 cmp r3, #0
|
|
800c954: dbe6 blt.n 800c924 <tcp_output+0x330>
|
|
}
|
|
seg->next = (*cur_seg);
|
|
800c956: 69fb ldr r3, [r7, #28]
|
|
800c958: 681a ldr r2, [r3, #0]
|
|
800c95a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c95c: 601a str r2, [r3, #0]
|
|
(*cur_seg) = seg;
|
|
800c95e: 69fb ldr r3, [r7, #28]
|
|
800c960: 6a7a ldr r2, [r7, #36] ; 0x24
|
|
800c962: 601a str r2, [r3, #0]
|
|
800c964: e009 b.n 800c97a <tcp_output+0x386>
|
|
} else {
|
|
/* add segment to tail of unacked list */
|
|
useg->next = seg;
|
|
800c966: 6a3b ldr r3, [r7, #32]
|
|
800c968: 6a7a ldr r2, [r7, #36] ; 0x24
|
|
800c96a: 601a str r2, [r3, #0]
|
|
useg = useg->next;
|
|
800c96c: 6a3b ldr r3, [r7, #32]
|
|
800c96e: 681b ldr r3, [r3, #0]
|
|
800c970: 623b str r3, [r7, #32]
|
|
800c972: e002 b.n 800c97a <tcp_output+0x386>
|
|
}
|
|
}
|
|
/* do not queue empty segments on the unacked list */
|
|
} else {
|
|
tcp_seg_free(seg);
|
|
800c974: 6a78 ldr r0, [r7, #36] ; 0x24
|
|
800c976: f7fb fefe bl 8008776 <tcp_seg_free>
|
|
}
|
|
seg = pcb->unsent;
|
|
800c97a: 687b ldr r3, [r7, #4]
|
|
800c97c: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c97e: 627b str r3, [r7, #36] ; 0x24
|
|
while (seg != NULL &&
|
|
800c980: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c982: 2b00 cmp r3, #0
|
|
800c984: d012 beq.n 800c9ac <tcp_output+0x3b8>
|
|
lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
|
|
800c986: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800c988: 691b ldr r3, [r3, #16]
|
|
800c98a: 685b ldr r3, [r3, #4]
|
|
800c98c: 4618 mov r0, r3
|
|
800c98e: f7f8 fdf2 bl 8005576 <lwip_htonl>
|
|
800c992: 4602 mov r2, r0
|
|
800c994: 687b ldr r3, [r7, #4]
|
|
800c996: 6c5b ldr r3, [r3, #68] ; 0x44
|
|
800c998: 1ad3 subs r3, r2, r3
|
|
800c99a: 6a7a ldr r2, [r7, #36] ; 0x24
|
|
800c99c: 8912 ldrh r2, [r2, #8]
|
|
800c99e: 4413 add r3, r2
|
|
while (seg != NULL &&
|
|
800c9a0: 69ba ldr r2, [r7, #24]
|
|
800c9a2: 429a cmp r2, r3
|
|
800c9a4: f4bf aed6 bcs.w 800c754 <tcp_output+0x160>
|
|
800c9a8: e000 b.n 800c9ac <tcp_output+0x3b8>
|
|
break;
|
|
800c9aa: bf00 nop
|
|
}
|
|
#if TCP_OVERSIZE
|
|
if (pcb->unsent == NULL) {
|
|
800c9ac: 687b ldr r3, [r7, #4]
|
|
800c9ae: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800c9b0: 2b00 cmp r3, #0
|
|
800c9b2: d108 bne.n 800c9c6 <tcp_output+0x3d2>
|
|
/* last unsent has been removed, reset unsent_oversize */
|
|
pcb->unsent_oversize = 0;
|
|
800c9b4: 687b ldr r3, [r7, #4]
|
|
800c9b6: 2200 movs r2, #0
|
|
800c9b8: f8a3 2068 strh.w r2, [r3, #104] ; 0x68
|
|
800c9bc: e004 b.n 800c9c8 <tcp_output+0x3d4>
|
|
goto output_done;
|
|
800c9be: bf00 nop
|
|
800c9c0: e002 b.n 800c9c8 <tcp_output+0x3d4>
|
|
goto output_done;
|
|
800c9c2: bf00 nop
|
|
800c9c4: e000 b.n 800c9c8 <tcp_output+0x3d4>
|
|
}
|
|
#endif /* TCP_OVERSIZE */
|
|
|
|
output_done:
|
|
800c9c6: bf00 nop
|
|
tcp_clear_flags(pcb, TF_NAGLEMEMERR);
|
|
800c9c8: 687b ldr r3, [r7, #4]
|
|
800c9ca: 8b5b ldrh r3, [r3, #26]
|
|
800c9cc: f023 0380 bic.w r3, r3, #128 ; 0x80
|
|
800c9d0: b29a uxth r2, r3
|
|
800c9d2: 687b ldr r3, [r7, #4]
|
|
800c9d4: 835a strh r2, [r3, #26]
|
|
return ERR_OK;
|
|
800c9d6: 2300 movs r3, #0
|
|
}
|
|
800c9d8: 4618 mov r0, r3
|
|
800c9da: 3728 adds r7, #40 ; 0x28
|
|
800c9dc: 46bd mov sp, r7
|
|
800c9de: bdb0 pop {r4, r5, r7, pc}
|
|
|
|
0800c9e0 <tcp_output_segment_busy>:
|
|
* @arg seg the tcp segment to check
|
|
* @return 1 if ref != 1, 0 if ref == 1
|
|
*/
|
|
static int
|
|
tcp_output_segment_busy(const struct tcp_seg *seg)
|
|
{
|
|
800c9e0: b580 push {r7, lr}
|
|
800c9e2: b082 sub sp, #8
|
|
800c9e4: af00 add r7, sp, #0
|
|
800c9e6: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("tcp_output_segment_busy: invalid seg", seg != NULL);
|
|
800c9e8: 687b ldr r3, [r7, #4]
|
|
800c9ea: 2b00 cmp r3, #0
|
|
800c9ec: d106 bne.n 800c9fc <tcp_output_segment_busy+0x1c>
|
|
800c9ee: 4b09 ldr r3, [pc, #36] ; (800ca14 <tcp_output_segment_busy+0x34>)
|
|
800c9f0: f240 529a movw r2, #1434 ; 0x59a
|
|
800c9f4: 4908 ldr r1, [pc, #32] ; (800ca18 <tcp_output_segment_busy+0x38>)
|
|
800c9f6: 4809 ldr r0, [pc, #36] ; (800ca1c <tcp_output_segment_busy+0x3c>)
|
|
800c9f8: f004 f8e6 bl 8010bc8 <iprintf>
|
|
|
|
/* We only need to check the first pbuf here:
|
|
If a pbuf is queued for transmission, a driver calls pbuf_ref(),
|
|
which only changes the ref count of the first pbuf */
|
|
if (seg->p->ref != 1) {
|
|
800c9fc: 687b ldr r3, [r7, #4]
|
|
800c9fe: 685b ldr r3, [r3, #4]
|
|
800ca00: 7b9b ldrb r3, [r3, #14]
|
|
800ca02: 2b01 cmp r3, #1
|
|
800ca04: d001 beq.n 800ca0a <tcp_output_segment_busy+0x2a>
|
|
/* other reference found */
|
|
return 1;
|
|
800ca06: 2301 movs r3, #1
|
|
800ca08: e000 b.n 800ca0c <tcp_output_segment_busy+0x2c>
|
|
}
|
|
/* no other references found */
|
|
return 0;
|
|
800ca0a: 2300 movs r3, #0
|
|
}
|
|
800ca0c: 4618 mov r0, r3
|
|
800ca0e: 3708 adds r7, #8
|
|
800ca10: 46bd mov sp, r7
|
|
800ca12: bd80 pop {r7, pc}
|
|
800ca14: 08013618 .word 0x08013618
|
|
800ca18: 08013c10 .word 0x08013c10
|
|
800ca1c: 0801366c .word 0x0801366c
|
|
|
|
0800ca20 <tcp_output_segment>:
|
|
* @param pcb the tcp_pcb for the TCP connection used to send the segment
|
|
* @param netif the netif used to send the segment
|
|
*/
|
|
static err_t
|
|
tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif)
|
|
{
|
|
800ca20: b5b0 push {r4, r5, r7, lr}
|
|
800ca22: b08c sub sp, #48 ; 0x30
|
|
800ca24: af04 add r7, sp, #16
|
|
800ca26: 60f8 str r0, [r7, #12]
|
|
800ca28: 60b9 str r1, [r7, #8]
|
|
800ca2a: 607a str r2, [r7, #4]
|
|
u32_t *opts;
|
|
#if TCP_CHECKSUM_ON_COPY
|
|
int seg_chksum_was_swapped = 0;
|
|
#endif
|
|
|
|
LWIP_ASSERT("tcp_output_segment: invalid seg", seg != NULL);
|
|
800ca2c: 68fb ldr r3, [r7, #12]
|
|
800ca2e: 2b00 cmp r3, #0
|
|
800ca30: d106 bne.n 800ca40 <tcp_output_segment+0x20>
|
|
800ca32: 4b64 ldr r3, [pc, #400] ; (800cbc4 <tcp_output_segment+0x1a4>)
|
|
800ca34: f44f 62b7 mov.w r2, #1464 ; 0x5b8
|
|
800ca38: 4963 ldr r1, [pc, #396] ; (800cbc8 <tcp_output_segment+0x1a8>)
|
|
800ca3a: 4864 ldr r0, [pc, #400] ; (800cbcc <tcp_output_segment+0x1ac>)
|
|
800ca3c: f004 f8c4 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_output_segment: invalid pcb", pcb != NULL);
|
|
800ca40: 68bb ldr r3, [r7, #8]
|
|
800ca42: 2b00 cmp r3, #0
|
|
800ca44: d106 bne.n 800ca54 <tcp_output_segment+0x34>
|
|
800ca46: 4b5f ldr r3, [pc, #380] ; (800cbc4 <tcp_output_segment+0x1a4>)
|
|
800ca48: f240 52b9 movw r2, #1465 ; 0x5b9
|
|
800ca4c: 4960 ldr r1, [pc, #384] ; (800cbd0 <tcp_output_segment+0x1b0>)
|
|
800ca4e: 485f ldr r0, [pc, #380] ; (800cbcc <tcp_output_segment+0x1ac>)
|
|
800ca50: f004 f8ba bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_output_segment: invalid netif", netif != NULL);
|
|
800ca54: 687b ldr r3, [r7, #4]
|
|
800ca56: 2b00 cmp r3, #0
|
|
800ca58: d106 bne.n 800ca68 <tcp_output_segment+0x48>
|
|
800ca5a: 4b5a ldr r3, [pc, #360] ; (800cbc4 <tcp_output_segment+0x1a4>)
|
|
800ca5c: f240 52ba movw r2, #1466 ; 0x5ba
|
|
800ca60: 495c ldr r1, [pc, #368] ; (800cbd4 <tcp_output_segment+0x1b4>)
|
|
800ca62: 485a ldr r0, [pc, #360] ; (800cbcc <tcp_output_segment+0x1ac>)
|
|
800ca64: f004 f8b0 bl 8010bc8 <iprintf>
|
|
|
|
if (tcp_output_segment_busy(seg)) {
|
|
800ca68: 68f8 ldr r0, [r7, #12]
|
|
800ca6a: f7ff ffb9 bl 800c9e0 <tcp_output_segment_busy>
|
|
800ca6e: 4603 mov r3, r0
|
|
800ca70: 2b00 cmp r3, #0
|
|
800ca72: d001 beq.n 800ca78 <tcp_output_segment+0x58>
|
|
/* This should not happen: rexmit functions should have checked this.
|
|
However, since this function modifies p->len, we must not continue in this case. */
|
|
LWIP_DEBUGF(TCP_RTO_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_output_segment: segment busy\n"));
|
|
return ERR_OK;
|
|
800ca74: 2300 movs r3, #0
|
|
800ca76: e0a1 b.n 800cbbc <tcp_output_segment+0x19c>
|
|
}
|
|
|
|
/* The TCP header has already been constructed, but the ackno and
|
|
wnd fields remain. */
|
|
seg->tcphdr->ackno = lwip_htonl(pcb->rcv_nxt);
|
|
800ca78: 68bb ldr r3, [r7, #8]
|
|
800ca7a: 6a5a ldr r2, [r3, #36] ; 0x24
|
|
800ca7c: 68fb ldr r3, [r7, #12]
|
|
800ca7e: 691c ldr r4, [r3, #16]
|
|
800ca80: 4610 mov r0, r2
|
|
800ca82: f7f8 fd78 bl 8005576 <lwip_htonl>
|
|
800ca86: 4603 mov r3, r0
|
|
800ca88: 60a3 str r3, [r4, #8]
|
|
the window scale option) is never scaled. */
|
|
seg->tcphdr->wnd = lwip_htons(TCPWND_MIN16(pcb->rcv_ann_wnd));
|
|
} else
|
|
#endif /* LWIP_WND_SCALE */
|
|
{
|
|
seg->tcphdr->wnd = lwip_htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));
|
|
800ca8a: 68bb ldr r3, [r7, #8]
|
|
800ca8c: 8d5a ldrh r2, [r3, #42] ; 0x2a
|
|
800ca8e: 68fb ldr r3, [r7, #12]
|
|
800ca90: 691c ldr r4, [r3, #16]
|
|
800ca92: 4610 mov r0, r2
|
|
800ca94: f7f8 fd5a bl 800554c <lwip_htons>
|
|
800ca98: 4603 mov r3, r0
|
|
800ca9a: 81e3 strh r3, [r4, #14]
|
|
}
|
|
|
|
pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
|
|
800ca9c: 68bb ldr r3, [r7, #8]
|
|
800ca9e: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800caa0: 68ba ldr r2, [r7, #8]
|
|
800caa2: 8d52 ldrh r2, [r2, #42] ; 0x2a
|
|
800caa4: 441a add r2, r3
|
|
800caa6: 68bb ldr r3, [r7, #8]
|
|
800caa8: 62da str r2, [r3, #44] ; 0x2c
|
|
|
|
/* Add any requested options. NB MSS option is only set on SYN
|
|
packets, so ignore it here */
|
|
/* cast through void* to get rid of alignment warnings */
|
|
opts = (u32_t *)(void *)(seg->tcphdr + 1);
|
|
800caaa: 68fb ldr r3, [r7, #12]
|
|
800caac: 691b ldr r3, [r3, #16]
|
|
800caae: 3314 adds r3, #20
|
|
800cab0: 61fb str r3, [r7, #28]
|
|
if (seg->flags & TF_SEG_OPTS_MSS) {
|
|
800cab2: 68fb ldr r3, [r7, #12]
|
|
800cab4: 7b1b ldrb r3, [r3, #12]
|
|
800cab6: f003 0301 and.w r3, r3, #1
|
|
800caba: 2b00 cmp r3, #0
|
|
800cabc: d015 beq.n 800caea <tcp_output_segment+0xca>
|
|
u16_t mss;
|
|
#if TCP_CALCULATE_EFF_SEND_MSS
|
|
mss = tcp_eff_send_mss_netif(TCP_MSS, netif, &pcb->remote_ip);
|
|
800cabe: 68bb ldr r3, [r7, #8]
|
|
800cac0: 3304 adds r3, #4
|
|
800cac2: 461a mov r2, r3
|
|
800cac4: 6879 ldr r1, [r7, #4]
|
|
800cac6: f44f 7006 mov.w r0, #536 ; 0x218
|
|
800caca: f7fc f9cb bl 8008e64 <tcp_eff_send_mss_netif>
|
|
800cace: 4603 mov r3, r0
|
|
800cad0: 837b strh r3, [r7, #26]
|
|
#else /* TCP_CALCULATE_EFF_SEND_MSS */
|
|
mss = TCP_MSS;
|
|
#endif /* TCP_CALCULATE_EFF_SEND_MSS */
|
|
*opts = TCP_BUILD_MSS_OPTION(mss);
|
|
800cad2: 8b7b ldrh r3, [r7, #26]
|
|
800cad4: f043 7301 orr.w r3, r3, #33816576 ; 0x2040000
|
|
800cad8: 4618 mov r0, r3
|
|
800cada: f7f8 fd4c bl 8005576 <lwip_htonl>
|
|
800cade: 4602 mov r2, r0
|
|
800cae0: 69fb ldr r3, [r7, #28]
|
|
800cae2: 601a str r2, [r3, #0]
|
|
opts += 1;
|
|
800cae4: 69fb ldr r3, [r7, #28]
|
|
800cae6: 3304 adds r3, #4
|
|
800cae8: 61fb str r3, [r7, #28]
|
|
}
|
|
#endif
|
|
|
|
/* Set retransmission timer running if it is not currently enabled
|
|
This must be set before checking the route. */
|
|
if (pcb->rtime < 0) {
|
|
800caea: 68bb ldr r3, [r7, #8]
|
|
800caec: f9b3 3030 ldrsh.w r3, [r3, #48] ; 0x30
|
|
800caf0: 2b00 cmp r3, #0
|
|
800caf2: da02 bge.n 800cafa <tcp_output_segment+0xda>
|
|
pcb->rtime = 0;
|
|
800caf4: 68bb ldr r3, [r7, #8]
|
|
800caf6: 2200 movs r2, #0
|
|
800caf8: 861a strh r2, [r3, #48] ; 0x30
|
|
}
|
|
|
|
if (pcb->rttest == 0) {
|
|
800cafa: 68bb ldr r3, [r7, #8]
|
|
800cafc: 6b5b ldr r3, [r3, #52] ; 0x34
|
|
800cafe: 2b00 cmp r3, #0
|
|
800cb00: d10c bne.n 800cb1c <tcp_output_segment+0xfc>
|
|
pcb->rttest = tcp_ticks;
|
|
800cb02: 4b35 ldr r3, [pc, #212] ; (800cbd8 <tcp_output_segment+0x1b8>)
|
|
800cb04: 681a ldr r2, [r3, #0]
|
|
800cb06: 68bb ldr r3, [r7, #8]
|
|
800cb08: 635a str r2, [r3, #52] ; 0x34
|
|
pcb->rtseq = lwip_ntohl(seg->tcphdr->seqno);
|
|
800cb0a: 68fb ldr r3, [r7, #12]
|
|
800cb0c: 691b ldr r3, [r3, #16]
|
|
800cb0e: 685b ldr r3, [r3, #4]
|
|
800cb10: 4618 mov r0, r3
|
|
800cb12: f7f8 fd30 bl 8005576 <lwip_htonl>
|
|
800cb16: 4602 mov r2, r0
|
|
800cb18: 68bb ldr r3, [r7, #8]
|
|
800cb1a: 639a str r2, [r3, #56] ; 0x38
|
|
}
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
|
|
lwip_htonl(seg->tcphdr->seqno), lwip_htonl(seg->tcphdr->seqno) +
|
|
seg->len));
|
|
|
|
len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
|
|
800cb1c: 68fb ldr r3, [r7, #12]
|
|
800cb1e: 691a ldr r2, [r3, #16]
|
|
800cb20: 68fb ldr r3, [r7, #12]
|
|
800cb22: 685b ldr r3, [r3, #4]
|
|
800cb24: 685b ldr r3, [r3, #4]
|
|
800cb26: 1ad3 subs r3, r2, r3
|
|
800cb28: 833b strh r3, [r7, #24]
|
|
if (len == 0) {
|
|
/** Exclude retransmitted segments from this count. */
|
|
MIB2_STATS_INC(mib2.tcpoutsegs);
|
|
}
|
|
|
|
seg->p->len -= len;
|
|
800cb2a: 68fb ldr r3, [r7, #12]
|
|
800cb2c: 685b ldr r3, [r3, #4]
|
|
800cb2e: 8959 ldrh r1, [r3, #10]
|
|
800cb30: 68fb ldr r3, [r7, #12]
|
|
800cb32: 685b ldr r3, [r3, #4]
|
|
800cb34: 8b3a ldrh r2, [r7, #24]
|
|
800cb36: 1a8a subs r2, r1, r2
|
|
800cb38: b292 uxth r2, r2
|
|
800cb3a: 815a strh r2, [r3, #10]
|
|
seg->p->tot_len -= len;
|
|
800cb3c: 68fb ldr r3, [r7, #12]
|
|
800cb3e: 685b ldr r3, [r3, #4]
|
|
800cb40: 8919 ldrh r1, [r3, #8]
|
|
800cb42: 68fb ldr r3, [r7, #12]
|
|
800cb44: 685b ldr r3, [r3, #4]
|
|
800cb46: 8b3a ldrh r2, [r7, #24]
|
|
800cb48: 1a8a subs r2, r1, r2
|
|
800cb4a: b292 uxth r2, r2
|
|
800cb4c: 811a strh r2, [r3, #8]
|
|
|
|
seg->p->payload = seg->tcphdr;
|
|
800cb4e: 68fb ldr r3, [r7, #12]
|
|
800cb50: 685b ldr r3, [r3, #4]
|
|
800cb52: 68fa ldr r2, [r7, #12]
|
|
800cb54: 6912 ldr r2, [r2, #16]
|
|
800cb56: 605a str r2, [r3, #4]
|
|
|
|
seg->tcphdr->chksum = 0;
|
|
800cb58: 68fb ldr r3, [r7, #12]
|
|
800cb5a: 691b ldr r3, [r3, #16]
|
|
800cb5c: 2200 movs r2, #0
|
|
800cb5e: 741a strb r2, [r3, #16]
|
|
800cb60: 2200 movs r2, #0
|
|
800cb62: 745a strb r2, [r3, #17]
|
|
|
|
#ifdef LWIP_HOOK_TCP_OUT_ADD_TCPOPTS
|
|
opts = LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(seg->p, seg->tcphdr, pcb, opts);
|
|
#endif
|
|
LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(seg->tcphdr + 1)) + LWIP_TCP_OPT_LENGTH_SEGMENT(seg->flags, pcb));
|
|
800cb64: 68fb ldr r3, [r7, #12]
|
|
800cb66: 691a ldr r2, [r3, #16]
|
|
800cb68: 68fb ldr r3, [r7, #12]
|
|
800cb6a: 7b1b ldrb r3, [r3, #12]
|
|
800cb6c: f003 0301 and.w r3, r3, #1
|
|
800cb70: 2b00 cmp r3, #0
|
|
800cb72: d001 beq.n 800cb78 <tcp_output_segment+0x158>
|
|
800cb74: 2318 movs r3, #24
|
|
800cb76: e000 b.n 800cb7a <tcp_output_segment+0x15a>
|
|
800cb78: 2314 movs r3, #20
|
|
800cb7a: 4413 add r3, r2
|
|
800cb7c: 69fa ldr r2, [r7, #28]
|
|
800cb7e: 429a cmp r2, r3
|
|
800cb80: d006 beq.n 800cb90 <tcp_output_segment+0x170>
|
|
800cb82: 4b10 ldr r3, [pc, #64] ; (800cbc4 <tcp_output_segment+0x1a4>)
|
|
800cb84: f240 621c movw r2, #1564 ; 0x61c
|
|
800cb88: 4914 ldr r1, [pc, #80] ; (800cbdc <tcp_output_segment+0x1bc>)
|
|
800cb8a: 4810 ldr r0, [pc, #64] ; (800cbcc <tcp_output_segment+0x1ac>)
|
|
800cb8c: f004 f81c bl 8010bc8 <iprintf>
|
|
}
|
|
#endif /* CHECKSUM_GEN_TCP */
|
|
TCP_STATS_INC(tcp.xmit);
|
|
|
|
NETIF_SET_HINTS(netif, &(pcb->netif_hints));
|
|
err = ip_output_if(seg->p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl,
|
|
800cb90: 68fb ldr r3, [r7, #12]
|
|
800cb92: 6858 ldr r0, [r3, #4]
|
|
800cb94: 68b9 ldr r1, [r7, #8]
|
|
800cb96: 68bb ldr r3, [r7, #8]
|
|
800cb98: 1d1c adds r4, r3, #4
|
|
800cb9a: 68bb ldr r3, [r7, #8]
|
|
800cb9c: 7add ldrb r5, [r3, #11]
|
|
800cb9e: 68bb ldr r3, [r7, #8]
|
|
800cba0: 7a9b ldrb r3, [r3, #10]
|
|
800cba2: 687a ldr r2, [r7, #4]
|
|
800cba4: 9202 str r2, [sp, #8]
|
|
800cba6: 2206 movs r2, #6
|
|
800cba8: 9201 str r2, [sp, #4]
|
|
800cbaa: 9300 str r3, [sp, #0]
|
|
800cbac: 462b mov r3, r5
|
|
800cbae: 4622 mov r2, r4
|
|
800cbb0: f002 fb28 bl 800f204 <ip4_output_if>
|
|
800cbb4: 4603 mov r3, r0
|
|
800cbb6: 75fb strb r3, [r7, #23]
|
|
seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum);
|
|
seg->chksum_swapped = 1;
|
|
}
|
|
#endif
|
|
|
|
return err;
|
|
800cbb8: f997 3017 ldrsb.w r3, [r7, #23]
|
|
}
|
|
800cbbc: 4618 mov r0, r3
|
|
800cbbe: 3720 adds r7, #32
|
|
800cbc0: 46bd mov sp, r7
|
|
800cbc2: bdb0 pop {r4, r5, r7, pc}
|
|
800cbc4: 08013618 .word 0x08013618
|
|
800cbc8: 08013c38 .word 0x08013c38
|
|
800cbcc: 0801366c .word 0x0801366c
|
|
800cbd0: 08013c58 .word 0x08013c58
|
|
800cbd4: 08013c78 .word 0x08013c78
|
|
800cbd8: 24007b6c .word 0x24007b6c
|
|
800cbdc: 08013c9c .word 0x08013c9c
|
|
|
|
0800cbe0 <tcp_rexmit_rto_prepare>:
|
|
*
|
|
* @param pcb the tcp_pcb for which to re-enqueue all unacked segments
|
|
*/
|
|
err_t
|
|
tcp_rexmit_rto_prepare(struct tcp_pcb *pcb)
|
|
{
|
|
800cbe0: b5b0 push {r4, r5, r7, lr}
|
|
800cbe2: b084 sub sp, #16
|
|
800cbe4: af00 add r7, sp, #0
|
|
800cbe6: 6078 str r0, [r7, #4]
|
|
struct tcp_seg *seg;
|
|
|
|
LWIP_ASSERT("tcp_rexmit_rto_prepare: invalid pcb", pcb != NULL);
|
|
800cbe8: 687b ldr r3, [r7, #4]
|
|
800cbea: 2b00 cmp r3, #0
|
|
800cbec: d106 bne.n 800cbfc <tcp_rexmit_rto_prepare+0x1c>
|
|
800cbee: 4b36 ldr r3, [pc, #216] ; (800ccc8 <tcp_rexmit_rto_prepare+0xe8>)
|
|
800cbf0: f240 6263 movw r2, #1635 ; 0x663
|
|
800cbf4: 4935 ldr r1, [pc, #212] ; (800cccc <tcp_rexmit_rto_prepare+0xec>)
|
|
800cbf6: 4836 ldr r0, [pc, #216] ; (800ccd0 <tcp_rexmit_rto_prepare+0xf0>)
|
|
800cbf8: f003 ffe6 bl 8010bc8 <iprintf>
|
|
|
|
if (pcb->unacked == NULL) {
|
|
800cbfc: 687b ldr r3, [r7, #4]
|
|
800cbfe: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800cc00: 2b00 cmp r3, #0
|
|
800cc02: d102 bne.n 800cc0a <tcp_rexmit_rto_prepare+0x2a>
|
|
return ERR_VAL;
|
|
800cc04: f06f 0305 mvn.w r3, #5
|
|
800cc08: e059 b.n 800ccbe <tcp_rexmit_rto_prepare+0xde>
|
|
|
|
/* Move all unacked segments to the head of the unsent queue.
|
|
However, give up if any of the unsent pbufs are still referenced by the
|
|
netif driver due to deferred transmission. No point loading the link further
|
|
if it is struggling to flush its buffered writes. */
|
|
for (seg = pcb->unacked; seg->next != NULL; seg = seg->next) {
|
|
800cc0a: 687b ldr r3, [r7, #4]
|
|
800cc0c: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800cc0e: 60fb str r3, [r7, #12]
|
|
800cc10: e00b b.n 800cc2a <tcp_rexmit_rto_prepare+0x4a>
|
|
if (tcp_output_segment_busy(seg)) {
|
|
800cc12: 68f8 ldr r0, [r7, #12]
|
|
800cc14: f7ff fee4 bl 800c9e0 <tcp_output_segment_busy>
|
|
800cc18: 4603 mov r3, r0
|
|
800cc1a: 2b00 cmp r3, #0
|
|
800cc1c: d002 beq.n 800cc24 <tcp_rexmit_rto_prepare+0x44>
|
|
LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit_rto: segment busy\n"));
|
|
return ERR_VAL;
|
|
800cc1e: f06f 0305 mvn.w r3, #5
|
|
800cc22: e04c b.n 800ccbe <tcp_rexmit_rto_prepare+0xde>
|
|
for (seg = pcb->unacked; seg->next != NULL; seg = seg->next) {
|
|
800cc24: 68fb ldr r3, [r7, #12]
|
|
800cc26: 681b ldr r3, [r3, #0]
|
|
800cc28: 60fb str r3, [r7, #12]
|
|
800cc2a: 68fb ldr r3, [r7, #12]
|
|
800cc2c: 681b ldr r3, [r3, #0]
|
|
800cc2e: 2b00 cmp r3, #0
|
|
800cc30: d1ef bne.n 800cc12 <tcp_rexmit_rto_prepare+0x32>
|
|
}
|
|
}
|
|
if (tcp_output_segment_busy(seg)) {
|
|
800cc32: 68f8 ldr r0, [r7, #12]
|
|
800cc34: f7ff fed4 bl 800c9e0 <tcp_output_segment_busy>
|
|
800cc38: 4603 mov r3, r0
|
|
800cc3a: 2b00 cmp r3, #0
|
|
800cc3c: d002 beq.n 800cc44 <tcp_rexmit_rto_prepare+0x64>
|
|
LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit_rto: segment busy\n"));
|
|
return ERR_VAL;
|
|
800cc3e: f06f 0305 mvn.w r3, #5
|
|
800cc42: e03c b.n 800ccbe <tcp_rexmit_rto_prepare+0xde>
|
|
}
|
|
/* concatenate unsent queue after unacked queue */
|
|
seg->next = pcb->unsent;
|
|
800cc44: 687b ldr r3, [r7, #4]
|
|
800cc46: 6eda ldr r2, [r3, #108] ; 0x6c
|
|
800cc48: 68fb ldr r3, [r7, #12]
|
|
800cc4a: 601a str r2, [r3, #0]
|
|
#if TCP_OVERSIZE_DBGCHECK
|
|
/* if last unsent changed, we need to update unsent_oversize */
|
|
if (pcb->unsent == NULL) {
|
|
800cc4c: 687b ldr r3, [r7, #4]
|
|
800cc4e: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800cc50: 2b00 cmp r3, #0
|
|
800cc52: d104 bne.n 800cc5e <tcp_rexmit_rto_prepare+0x7e>
|
|
pcb->unsent_oversize = seg->oversize_left;
|
|
800cc54: 68fb ldr r3, [r7, #12]
|
|
800cc56: 895a ldrh r2, [r3, #10]
|
|
800cc58: 687b ldr r3, [r7, #4]
|
|
800cc5a: f8a3 2068 strh.w r2, [r3, #104] ; 0x68
|
|
}
|
|
#endif /* TCP_OVERSIZE_DBGCHECK */
|
|
/* unsent queue is the concatenated queue (of unacked, unsent) */
|
|
pcb->unsent = pcb->unacked;
|
|
800cc5e: 687b ldr r3, [r7, #4]
|
|
800cc60: 6f1a ldr r2, [r3, #112] ; 0x70
|
|
800cc62: 687b ldr r3, [r7, #4]
|
|
800cc64: 66da str r2, [r3, #108] ; 0x6c
|
|
/* unacked queue is now empty */
|
|
pcb->unacked = NULL;
|
|
800cc66: 687b ldr r3, [r7, #4]
|
|
800cc68: 2200 movs r2, #0
|
|
800cc6a: 671a str r2, [r3, #112] ; 0x70
|
|
|
|
/* Mark RTO in-progress */
|
|
tcp_set_flags(pcb, TF_RTO);
|
|
800cc6c: 687b ldr r3, [r7, #4]
|
|
800cc6e: 8b5b ldrh r3, [r3, #26]
|
|
800cc70: f443 6300 orr.w r3, r3, #2048 ; 0x800
|
|
800cc74: b29a uxth r2, r3
|
|
800cc76: 687b ldr r3, [r7, #4]
|
|
800cc78: 835a strh r2, [r3, #26]
|
|
/* Record the next byte following retransmit */
|
|
pcb->rto_end = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
|
|
800cc7a: 68fb ldr r3, [r7, #12]
|
|
800cc7c: 691b ldr r3, [r3, #16]
|
|
800cc7e: 685b ldr r3, [r3, #4]
|
|
800cc80: 4618 mov r0, r3
|
|
800cc82: f7f8 fc78 bl 8005576 <lwip_htonl>
|
|
800cc86: 4604 mov r4, r0
|
|
800cc88: 68fb ldr r3, [r7, #12]
|
|
800cc8a: 891b ldrh r3, [r3, #8]
|
|
800cc8c: 461d mov r5, r3
|
|
800cc8e: 68fb ldr r3, [r7, #12]
|
|
800cc90: 691b ldr r3, [r3, #16]
|
|
800cc92: 899b ldrh r3, [r3, #12]
|
|
800cc94: b29b uxth r3, r3
|
|
800cc96: 4618 mov r0, r3
|
|
800cc98: f7f8 fc58 bl 800554c <lwip_htons>
|
|
800cc9c: 4603 mov r3, r0
|
|
800cc9e: b2db uxtb r3, r3
|
|
800cca0: f003 0303 and.w r3, r3, #3
|
|
800cca4: 2b00 cmp r3, #0
|
|
800cca6: d001 beq.n 800ccac <tcp_rexmit_rto_prepare+0xcc>
|
|
800cca8: 2301 movs r3, #1
|
|
800ccaa: e000 b.n 800ccae <tcp_rexmit_rto_prepare+0xce>
|
|
800ccac: 2300 movs r3, #0
|
|
800ccae: 442b add r3, r5
|
|
800ccb0: 18e2 adds r2, r4, r3
|
|
800ccb2: 687b ldr r3, [r7, #4]
|
|
800ccb4: 64da str r2, [r3, #76] ; 0x4c
|
|
/* Don't take any RTT measurements after retransmitting. */
|
|
pcb->rttest = 0;
|
|
800ccb6: 687b ldr r3, [r7, #4]
|
|
800ccb8: 2200 movs r2, #0
|
|
800ccba: 635a str r2, [r3, #52] ; 0x34
|
|
|
|
return ERR_OK;
|
|
800ccbc: 2300 movs r3, #0
|
|
}
|
|
800ccbe: 4618 mov r0, r3
|
|
800ccc0: 3710 adds r7, #16
|
|
800ccc2: 46bd mov sp, r7
|
|
800ccc4: bdb0 pop {r4, r5, r7, pc}
|
|
800ccc6: bf00 nop
|
|
800ccc8: 08013618 .word 0x08013618
|
|
800cccc: 08013cb0 .word 0x08013cb0
|
|
800ccd0: 0801366c .word 0x0801366c
|
|
|
|
0800ccd4 <tcp_rexmit_rto_commit>:
|
|
*
|
|
* @param pcb the tcp_pcb for which to re-enqueue all unacked segments
|
|
*/
|
|
void
|
|
tcp_rexmit_rto_commit(struct tcp_pcb *pcb)
|
|
{
|
|
800ccd4: b580 push {r7, lr}
|
|
800ccd6: b082 sub sp, #8
|
|
800ccd8: af00 add r7, sp, #0
|
|
800ccda: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("tcp_rexmit_rto_commit: invalid pcb", pcb != NULL);
|
|
800ccdc: 687b ldr r3, [r7, #4]
|
|
800ccde: 2b00 cmp r3, #0
|
|
800cce0: d106 bne.n 800ccf0 <tcp_rexmit_rto_commit+0x1c>
|
|
800cce2: 4b0d ldr r3, [pc, #52] ; (800cd18 <tcp_rexmit_rto_commit+0x44>)
|
|
800cce4: f44f 62d3 mov.w r2, #1688 ; 0x698
|
|
800cce8: 490c ldr r1, [pc, #48] ; (800cd1c <tcp_rexmit_rto_commit+0x48>)
|
|
800ccea: 480d ldr r0, [pc, #52] ; (800cd20 <tcp_rexmit_rto_commit+0x4c>)
|
|
800ccec: f003 ff6c bl 8010bc8 <iprintf>
|
|
|
|
/* increment number of retransmissions */
|
|
if (pcb->nrtx < 0xFF) {
|
|
800ccf0: 687b ldr r3, [r7, #4]
|
|
800ccf2: f893 3042 ldrb.w r3, [r3, #66] ; 0x42
|
|
800ccf6: 2bff cmp r3, #255 ; 0xff
|
|
800ccf8: d007 beq.n 800cd0a <tcp_rexmit_rto_commit+0x36>
|
|
++pcb->nrtx;
|
|
800ccfa: 687b ldr r3, [r7, #4]
|
|
800ccfc: f893 3042 ldrb.w r3, [r3, #66] ; 0x42
|
|
800cd00: 3301 adds r3, #1
|
|
800cd02: b2da uxtb r2, r3
|
|
800cd04: 687b ldr r3, [r7, #4]
|
|
800cd06: f883 2042 strb.w r2, [r3, #66] ; 0x42
|
|
}
|
|
/* Do the actual retransmission */
|
|
tcp_output(pcb);
|
|
800cd0a: 6878 ldr r0, [r7, #4]
|
|
800cd0c: f7ff fc72 bl 800c5f4 <tcp_output>
|
|
}
|
|
800cd10: bf00 nop
|
|
800cd12: 3708 adds r7, #8
|
|
800cd14: 46bd mov sp, r7
|
|
800cd16: bd80 pop {r7, pc}
|
|
800cd18: 08013618 .word 0x08013618
|
|
800cd1c: 08013cd4 .word 0x08013cd4
|
|
800cd20: 0801366c .word 0x0801366c
|
|
|
|
0800cd24 <tcp_rexmit_rto>:
|
|
*
|
|
* @param pcb the tcp_pcb for which to re-enqueue all unacked segments
|
|
*/
|
|
void
|
|
tcp_rexmit_rto(struct tcp_pcb *pcb)
|
|
{
|
|
800cd24: b580 push {r7, lr}
|
|
800cd26: b082 sub sp, #8
|
|
800cd28: af00 add r7, sp, #0
|
|
800cd2a: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("tcp_rexmit_rto: invalid pcb", pcb != NULL);
|
|
800cd2c: 687b ldr r3, [r7, #4]
|
|
800cd2e: 2b00 cmp r3, #0
|
|
800cd30: d106 bne.n 800cd40 <tcp_rexmit_rto+0x1c>
|
|
800cd32: 4b0a ldr r3, [pc, #40] ; (800cd5c <tcp_rexmit_rto+0x38>)
|
|
800cd34: f240 62ad movw r2, #1709 ; 0x6ad
|
|
800cd38: 4909 ldr r1, [pc, #36] ; (800cd60 <tcp_rexmit_rto+0x3c>)
|
|
800cd3a: 480a ldr r0, [pc, #40] ; (800cd64 <tcp_rexmit_rto+0x40>)
|
|
800cd3c: f003 ff44 bl 8010bc8 <iprintf>
|
|
|
|
if (tcp_rexmit_rto_prepare(pcb) == ERR_OK) {
|
|
800cd40: 6878 ldr r0, [r7, #4]
|
|
800cd42: f7ff ff4d bl 800cbe0 <tcp_rexmit_rto_prepare>
|
|
800cd46: 4603 mov r3, r0
|
|
800cd48: 2b00 cmp r3, #0
|
|
800cd4a: d102 bne.n 800cd52 <tcp_rexmit_rto+0x2e>
|
|
tcp_rexmit_rto_commit(pcb);
|
|
800cd4c: 6878 ldr r0, [r7, #4]
|
|
800cd4e: f7ff ffc1 bl 800ccd4 <tcp_rexmit_rto_commit>
|
|
}
|
|
}
|
|
800cd52: bf00 nop
|
|
800cd54: 3708 adds r7, #8
|
|
800cd56: 46bd mov sp, r7
|
|
800cd58: bd80 pop {r7, pc}
|
|
800cd5a: bf00 nop
|
|
800cd5c: 08013618 .word 0x08013618
|
|
800cd60: 08013cf8 .word 0x08013cf8
|
|
800cd64: 0801366c .word 0x0801366c
|
|
|
|
0800cd68 <tcp_rexmit>:
|
|
*
|
|
* @param pcb the tcp_pcb for which to retransmit the first unacked segment
|
|
*/
|
|
err_t
|
|
tcp_rexmit(struct tcp_pcb *pcb)
|
|
{
|
|
800cd68: b590 push {r4, r7, lr}
|
|
800cd6a: b085 sub sp, #20
|
|
800cd6c: af00 add r7, sp, #0
|
|
800cd6e: 6078 str r0, [r7, #4]
|
|
struct tcp_seg *seg;
|
|
struct tcp_seg **cur_seg;
|
|
|
|
LWIP_ASSERT("tcp_rexmit: invalid pcb", pcb != NULL);
|
|
800cd70: 687b ldr r3, [r7, #4]
|
|
800cd72: 2b00 cmp r3, #0
|
|
800cd74: d106 bne.n 800cd84 <tcp_rexmit+0x1c>
|
|
800cd76: 4b2f ldr r3, [pc, #188] ; (800ce34 <tcp_rexmit+0xcc>)
|
|
800cd78: f240 62c1 movw r2, #1729 ; 0x6c1
|
|
800cd7c: 492e ldr r1, [pc, #184] ; (800ce38 <tcp_rexmit+0xd0>)
|
|
800cd7e: 482f ldr r0, [pc, #188] ; (800ce3c <tcp_rexmit+0xd4>)
|
|
800cd80: f003 ff22 bl 8010bc8 <iprintf>
|
|
|
|
if (pcb->unacked == NULL) {
|
|
800cd84: 687b ldr r3, [r7, #4]
|
|
800cd86: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800cd88: 2b00 cmp r3, #0
|
|
800cd8a: d102 bne.n 800cd92 <tcp_rexmit+0x2a>
|
|
return ERR_VAL;
|
|
800cd8c: f06f 0305 mvn.w r3, #5
|
|
800cd90: e04c b.n 800ce2c <tcp_rexmit+0xc4>
|
|
}
|
|
|
|
seg = pcb->unacked;
|
|
800cd92: 687b ldr r3, [r7, #4]
|
|
800cd94: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800cd96: 60bb str r3, [r7, #8]
|
|
|
|
/* Give up if the segment is still referenced by the netif driver
|
|
due to deferred transmission. */
|
|
if (tcp_output_segment_busy(seg)) {
|
|
800cd98: 68b8 ldr r0, [r7, #8]
|
|
800cd9a: f7ff fe21 bl 800c9e0 <tcp_output_segment_busy>
|
|
800cd9e: 4603 mov r3, r0
|
|
800cda0: 2b00 cmp r3, #0
|
|
800cda2: d002 beq.n 800cdaa <tcp_rexmit+0x42>
|
|
LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit busy\n"));
|
|
return ERR_VAL;
|
|
800cda4: f06f 0305 mvn.w r3, #5
|
|
800cda8: e040 b.n 800ce2c <tcp_rexmit+0xc4>
|
|
}
|
|
|
|
/* Move the first unacked segment to the unsent queue */
|
|
/* Keep the unsent queue sorted. */
|
|
pcb->unacked = seg->next;
|
|
800cdaa: 68bb ldr r3, [r7, #8]
|
|
800cdac: 681a ldr r2, [r3, #0]
|
|
800cdae: 687b ldr r3, [r7, #4]
|
|
800cdb0: 671a str r2, [r3, #112] ; 0x70
|
|
|
|
cur_seg = &(pcb->unsent);
|
|
800cdb2: 687b ldr r3, [r7, #4]
|
|
800cdb4: 336c adds r3, #108 ; 0x6c
|
|
800cdb6: 60fb str r3, [r7, #12]
|
|
while (*cur_seg &&
|
|
800cdb8: e002 b.n 800cdc0 <tcp_rexmit+0x58>
|
|
TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
|
|
cur_seg = &((*cur_seg)->next );
|
|
800cdba: 68fb ldr r3, [r7, #12]
|
|
800cdbc: 681b ldr r3, [r3, #0]
|
|
800cdbe: 60fb str r3, [r7, #12]
|
|
while (*cur_seg &&
|
|
800cdc0: 68fb ldr r3, [r7, #12]
|
|
800cdc2: 681b ldr r3, [r3, #0]
|
|
800cdc4: 2b00 cmp r3, #0
|
|
800cdc6: d011 beq.n 800cdec <tcp_rexmit+0x84>
|
|
TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
|
|
800cdc8: 68fb ldr r3, [r7, #12]
|
|
800cdca: 681b ldr r3, [r3, #0]
|
|
800cdcc: 691b ldr r3, [r3, #16]
|
|
800cdce: 685b ldr r3, [r3, #4]
|
|
800cdd0: 4618 mov r0, r3
|
|
800cdd2: f7f8 fbd0 bl 8005576 <lwip_htonl>
|
|
800cdd6: 4604 mov r4, r0
|
|
800cdd8: 68bb ldr r3, [r7, #8]
|
|
800cdda: 691b ldr r3, [r3, #16]
|
|
800cddc: 685b ldr r3, [r3, #4]
|
|
800cdde: 4618 mov r0, r3
|
|
800cde0: f7f8 fbc9 bl 8005576 <lwip_htonl>
|
|
800cde4: 4603 mov r3, r0
|
|
800cde6: 1ae3 subs r3, r4, r3
|
|
while (*cur_seg &&
|
|
800cde8: 2b00 cmp r3, #0
|
|
800cdea: dbe6 blt.n 800cdba <tcp_rexmit+0x52>
|
|
}
|
|
seg->next = *cur_seg;
|
|
800cdec: 68fb ldr r3, [r7, #12]
|
|
800cdee: 681a ldr r2, [r3, #0]
|
|
800cdf0: 68bb ldr r3, [r7, #8]
|
|
800cdf2: 601a str r2, [r3, #0]
|
|
*cur_seg = seg;
|
|
800cdf4: 68fb ldr r3, [r7, #12]
|
|
800cdf6: 68ba ldr r2, [r7, #8]
|
|
800cdf8: 601a str r2, [r3, #0]
|
|
#if TCP_OVERSIZE
|
|
if (seg->next == NULL) {
|
|
800cdfa: 68bb ldr r3, [r7, #8]
|
|
800cdfc: 681b ldr r3, [r3, #0]
|
|
800cdfe: 2b00 cmp r3, #0
|
|
800ce00: d103 bne.n 800ce0a <tcp_rexmit+0xa2>
|
|
/* the retransmitted segment is last in unsent, so reset unsent_oversize */
|
|
pcb->unsent_oversize = 0;
|
|
800ce02: 687b ldr r3, [r7, #4]
|
|
800ce04: 2200 movs r2, #0
|
|
800ce06: f8a3 2068 strh.w r2, [r3, #104] ; 0x68
|
|
}
|
|
#endif /* TCP_OVERSIZE */
|
|
|
|
if (pcb->nrtx < 0xFF) {
|
|
800ce0a: 687b ldr r3, [r7, #4]
|
|
800ce0c: f893 3042 ldrb.w r3, [r3, #66] ; 0x42
|
|
800ce10: 2bff cmp r3, #255 ; 0xff
|
|
800ce12: d007 beq.n 800ce24 <tcp_rexmit+0xbc>
|
|
++pcb->nrtx;
|
|
800ce14: 687b ldr r3, [r7, #4]
|
|
800ce16: f893 3042 ldrb.w r3, [r3, #66] ; 0x42
|
|
800ce1a: 3301 adds r3, #1
|
|
800ce1c: b2da uxtb r2, r3
|
|
800ce1e: 687b ldr r3, [r7, #4]
|
|
800ce20: f883 2042 strb.w r2, [r3, #66] ; 0x42
|
|
}
|
|
|
|
/* Don't take any rtt measurements after retransmitting. */
|
|
pcb->rttest = 0;
|
|
800ce24: 687b ldr r3, [r7, #4]
|
|
800ce26: 2200 movs r2, #0
|
|
800ce28: 635a str r2, [r3, #52] ; 0x34
|
|
|
|
/* Do the actual retransmission. */
|
|
MIB2_STATS_INC(mib2.tcpretranssegs);
|
|
/* No need to call tcp_output: we are always called from tcp_input()
|
|
and thus tcp_output directly returns. */
|
|
return ERR_OK;
|
|
800ce2a: 2300 movs r3, #0
|
|
}
|
|
800ce2c: 4618 mov r0, r3
|
|
800ce2e: 3714 adds r7, #20
|
|
800ce30: 46bd mov sp, r7
|
|
800ce32: bd90 pop {r4, r7, pc}
|
|
800ce34: 08013618 .word 0x08013618
|
|
800ce38: 08013d14 .word 0x08013d14
|
|
800ce3c: 0801366c .word 0x0801366c
|
|
|
|
0800ce40 <tcp_rexmit_fast>:
|
|
*
|
|
* @param pcb the tcp_pcb for which to retransmit the first unacked segment
|
|
*/
|
|
void
|
|
tcp_rexmit_fast(struct tcp_pcb *pcb)
|
|
{
|
|
800ce40: b580 push {r7, lr}
|
|
800ce42: b082 sub sp, #8
|
|
800ce44: af00 add r7, sp, #0
|
|
800ce46: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("tcp_rexmit_fast: invalid pcb", pcb != NULL);
|
|
800ce48: 687b ldr r3, [r7, #4]
|
|
800ce4a: 2b00 cmp r3, #0
|
|
800ce4c: d106 bne.n 800ce5c <tcp_rexmit_fast+0x1c>
|
|
800ce4e: 4b2a ldr r3, [pc, #168] ; (800cef8 <tcp_rexmit_fast+0xb8>)
|
|
800ce50: f240 62f9 movw r2, #1785 ; 0x6f9
|
|
800ce54: 4929 ldr r1, [pc, #164] ; (800cefc <tcp_rexmit_fast+0xbc>)
|
|
800ce56: 482a ldr r0, [pc, #168] ; (800cf00 <tcp_rexmit_fast+0xc0>)
|
|
800ce58: f003 feb6 bl 8010bc8 <iprintf>
|
|
|
|
if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
|
|
800ce5c: 687b ldr r3, [r7, #4]
|
|
800ce5e: 6f1b ldr r3, [r3, #112] ; 0x70
|
|
800ce60: 2b00 cmp r3, #0
|
|
800ce62: d045 beq.n 800cef0 <tcp_rexmit_fast+0xb0>
|
|
800ce64: 687b ldr r3, [r7, #4]
|
|
800ce66: 8b5b ldrh r3, [r3, #26]
|
|
800ce68: f003 0304 and.w r3, r3, #4
|
|
800ce6c: 2b00 cmp r3, #0
|
|
800ce6e: d13f bne.n 800cef0 <tcp_rexmit_fast+0xb0>
|
|
LWIP_DEBUGF(TCP_FR_DEBUG,
|
|
("tcp_receive: dupacks %"U16_F" (%"U32_F
|
|
"), fast retransmit %"U32_F"\n",
|
|
(u16_t)pcb->dupacks, pcb->lastack,
|
|
lwip_ntohl(pcb->unacked->tcphdr->seqno)));
|
|
if (tcp_rexmit(pcb) == ERR_OK) {
|
|
800ce70: 6878 ldr r0, [r7, #4]
|
|
800ce72: f7ff ff79 bl 800cd68 <tcp_rexmit>
|
|
800ce76: 4603 mov r3, r0
|
|
800ce78: 2b00 cmp r3, #0
|
|
800ce7a: d139 bne.n 800cef0 <tcp_rexmit_fast+0xb0>
|
|
/* Set ssthresh to half of the minimum of the current
|
|
* cwnd and the advertised window */
|
|
pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2;
|
|
800ce7c: 687b ldr r3, [r7, #4]
|
|
800ce7e: f8b3 2060 ldrh.w r2, [r3, #96] ; 0x60
|
|
800ce82: 687b ldr r3, [r7, #4]
|
|
800ce84: f8b3 3048 ldrh.w r3, [r3, #72] ; 0x48
|
|
800ce88: 4293 cmp r3, r2
|
|
800ce8a: bf28 it cs
|
|
800ce8c: 4613 movcs r3, r2
|
|
800ce8e: b29b uxth r3, r3
|
|
800ce90: 2b00 cmp r3, #0
|
|
800ce92: da00 bge.n 800ce96 <tcp_rexmit_fast+0x56>
|
|
800ce94: 3301 adds r3, #1
|
|
800ce96: 105b asrs r3, r3, #1
|
|
800ce98: b29a uxth r2, r3
|
|
800ce9a: 687b ldr r3, [r7, #4]
|
|
800ce9c: f8a3 204a strh.w r2, [r3, #74] ; 0x4a
|
|
|
|
/* The minimum value for ssthresh should be 2 MSS */
|
|
if (pcb->ssthresh < (2U * pcb->mss)) {
|
|
800cea0: 687b ldr r3, [r7, #4]
|
|
800cea2: f8b3 304a ldrh.w r3, [r3, #74] ; 0x4a
|
|
800cea6: 461a mov r2, r3
|
|
800cea8: 687b ldr r3, [r7, #4]
|
|
800ceaa: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800ceac: 005b lsls r3, r3, #1
|
|
800ceae: 429a cmp r2, r3
|
|
800ceb0: d206 bcs.n 800cec0 <tcp_rexmit_fast+0x80>
|
|
LWIP_DEBUGF(TCP_FR_DEBUG,
|
|
("tcp_receive: The minimum value for ssthresh %"TCPWNDSIZE_F
|
|
" should be min 2 mss %"U16_F"...\n",
|
|
pcb->ssthresh, (u16_t)(2 * pcb->mss)));
|
|
pcb->ssthresh = 2 * pcb->mss;
|
|
800ceb2: 687b ldr r3, [r7, #4]
|
|
800ceb4: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800ceb6: 005b lsls r3, r3, #1
|
|
800ceb8: b29a uxth r2, r3
|
|
800ceba: 687b ldr r3, [r7, #4]
|
|
800cebc: f8a3 204a strh.w r2, [r3, #74] ; 0x4a
|
|
}
|
|
|
|
pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
|
|
800cec0: 687b ldr r3, [r7, #4]
|
|
800cec2: f8b3 204a ldrh.w r2, [r3, #74] ; 0x4a
|
|
800cec6: 687b ldr r3, [r7, #4]
|
|
800cec8: 8e5b ldrh r3, [r3, #50] ; 0x32
|
|
800ceca: 4619 mov r1, r3
|
|
800cecc: 0049 lsls r1, r1, #1
|
|
800cece: 440b add r3, r1
|
|
800ced0: b29b uxth r3, r3
|
|
800ced2: 4413 add r3, r2
|
|
800ced4: b29a uxth r2, r3
|
|
800ced6: 687b ldr r3, [r7, #4]
|
|
800ced8: f8a3 2048 strh.w r2, [r3, #72] ; 0x48
|
|
tcp_set_flags(pcb, TF_INFR);
|
|
800cedc: 687b ldr r3, [r7, #4]
|
|
800cede: 8b5b ldrh r3, [r3, #26]
|
|
800cee0: f043 0304 orr.w r3, r3, #4
|
|
800cee4: b29a uxth r2, r3
|
|
800cee6: 687b ldr r3, [r7, #4]
|
|
800cee8: 835a strh r2, [r3, #26]
|
|
|
|
/* Reset the retransmission timer to prevent immediate rto retransmissions */
|
|
pcb->rtime = 0;
|
|
800ceea: 687b ldr r3, [r7, #4]
|
|
800ceec: 2200 movs r2, #0
|
|
800ceee: 861a strh r2, [r3, #48] ; 0x30
|
|
}
|
|
}
|
|
}
|
|
800cef0: bf00 nop
|
|
800cef2: 3708 adds r7, #8
|
|
800cef4: 46bd mov sp, r7
|
|
800cef6: bd80 pop {r7, pc}
|
|
800cef8: 08013618 .word 0x08013618
|
|
800cefc: 08013d2c .word 0x08013d2c
|
|
800cf00: 0801366c .word 0x0801366c
|
|
|
|
0800cf04 <tcp_output_alloc_header_common>:
|
|
|
|
static struct pbuf *
|
|
tcp_output_alloc_header_common(u32_t ackno, u16_t optlen, u16_t datalen,
|
|
u32_t seqno_be /* already in network byte order */,
|
|
u16_t src_port, u16_t dst_port, u8_t flags, u16_t wnd)
|
|
{
|
|
800cf04: b580 push {r7, lr}
|
|
800cf06: b086 sub sp, #24
|
|
800cf08: af00 add r7, sp, #0
|
|
800cf0a: 60f8 str r0, [r7, #12]
|
|
800cf0c: 607b str r3, [r7, #4]
|
|
800cf0e: 460b mov r3, r1
|
|
800cf10: 817b strh r3, [r7, #10]
|
|
800cf12: 4613 mov r3, r2
|
|
800cf14: 813b strh r3, [r7, #8]
|
|
struct tcp_hdr *tcphdr;
|
|
struct pbuf *p;
|
|
|
|
p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
|
|
800cf16: 897a ldrh r2, [r7, #10]
|
|
800cf18: 893b ldrh r3, [r7, #8]
|
|
800cf1a: 4413 add r3, r2
|
|
800cf1c: b29b uxth r3, r3
|
|
800cf1e: 3314 adds r3, #20
|
|
800cf20: b29b uxth r3, r3
|
|
800cf22: f44f 7220 mov.w r2, #640 ; 0x280
|
|
800cf26: 4619 mov r1, r3
|
|
800cf28: 2022 movs r0, #34 ; 0x22
|
|
800cf2a: f7f9 fd6f bl 8006a0c <pbuf_alloc>
|
|
800cf2e: 6178 str r0, [r7, #20]
|
|
if (p != NULL) {
|
|
800cf30: 697b ldr r3, [r7, #20]
|
|
800cf32: 2b00 cmp r3, #0
|
|
800cf34: d04d beq.n 800cfd2 <tcp_output_alloc_header_common+0xce>
|
|
LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
|
|
800cf36: 897b ldrh r3, [r7, #10]
|
|
800cf38: 3313 adds r3, #19
|
|
800cf3a: 697a ldr r2, [r7, #20]
|
|
800cf3c: 8952 ldrh r2, [r2, #10]
|
|
800cf3e: 4293 cmp r3, r2
|
|
800cf40: db06 blt.n 800cf50 <tcp_output_alloc_header_common+0x4c>
|
|
800cf42: 4b26 ldr r3, [pc, #152] ; (800cfdc <tcp_output_alloc_header_common+0xd8>)
|
|
800cf44: f240 7223 movw r2, #1827 ; 0x723
|
|
800cf48: 4925 ldr r1, [pc, #148] ; (800cfe0 <tcp_output_alloc_header_common+0xdc>)
|
|
800cf4a: 4826 ldr r0, [pc, #152] ; (800cfe4 <tcp_output_alloc_header_common+0xe0>)
|
|
800cf4c: f003 fe3c bl 8010bc8 <iprintf>
|
|
(p->len >= TCP_HLEN + optlen));
|
|
tcphdr = (struct tcp_hdr *)p->payload;
|
|
800cf50: 697b ldr r3, [r7, #20]
|
|
800cf52: 685b ldr r3, [r3, #4]
|
|
800cf54: 613b str r3, [r7, #16]
|
|
tcphdr->src = lwip_htons(src_port);
|
|
800cf56: 8c3b ldrh r3, [r7, #32]
|
|
800cf58: 4618 mov r0, r3
|
|
800cf5a: f7f8 faf7 bl 800554c <lwip_htons>
|
|
800cf5e: 4603 mov r3, r0
|
|
800cf60: 461a mov r2, r3
|
|
800cf62: 693b ldr r3, [r7, #16]
|
|
800cf64: 801a strh r2, [r3, #0]
|
|
tcphdr->dest = lwip_htons(dst_port);
|
|
800cf66: 8cbb ldrh r3, [r7, #36] ; 0x24
|
|
800cf68: 4618 mov r0, r3
|
|
800cf6a: f7f8 faef bl 800554c <lwip_htons>
|
|
800cf6e: 4603 mov r3, r0
|
|
800cf70: 461a mov r2, r3
|
|
800cf72: 693b ldr r3, [r7, #16]
|
|
800cf74: 805a strh r2, [r3, #2]
|
|
tcphdr->seqno = seqno_be;
|
|
800cf76: 693b ldr r3, [r7, #16]
|
|
800cf78: 687a ldr r2, [r7, #4]
|
|
800cf7a: 605a str r2, [r3, #4]
|
|
tcphdr->ackno = lwip_htonl(ackno);
|
|
800cf7c: 68f8 ldr r0, [r7, #12]
|
|
800cf7e: f7f8 fafa bl 8005576 <lwip_htonl>
|
|
800cf82: 4602 mov r2, r0
|
|
800cf84: 693b ldr r3, [r7, #16]
|
|
800cf86: 609a str r2, [r3, #8]
|
|
TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), flags);
|
|
800cf88: 897b ldrh r3, [r7, #10]
|
|
800cf8a: 089b lsrs r3, r3, #2
|
|
800cf8c: b29b uxth r3, r3
|
|
800cf8e: 3305 adds r3, #5
|
|
800cf90: b29b uxth r3, r3
|
|
800cf92: 031b lsls r3, r3, #12
|
|
800cf94: b29a uxth r2, r3
|
|
800cf96: f897 3028 ldrb.w r3, [r7, #40] ; 0x28
|
|
800cf9a: b29b uxth r3, r3
|
|
800cf9c: 4313 orrs r3, r2
|
|
800cf9e: b29b uxth r3, r3
|
|
800cfa0: 4618 mov r0, r3
|
|
800cfa2: f7f8 fad3 bl 800554c <lwip_htons>
|
|
800cfa6: 4603 mov r3, r0
|
|
800cfa8: 461a mov r2, r3
|
|
800cfaa: 693b ldr r3, [r7, #16]
|
|
800cfac: 819a strh r2, [r3, #12]
|
|
tcphdr->wnd = lwip_htons(wnd);
|
|
800cfae: 8dbb ldrh r3, [r7, #44] ; 0x2c
|
|
800cfb0: 4618 mov r0, r3
|
|
800cfb2: f7f8 facb bl 800554c <lwip_htons>
|
|
800cfb6: 4603 mov r3, r0
|
|
800cfb8: 461a mov r2, r3
|
|
800cfba: 693b ldr r3, [r7, #16]
|
|
800cfbc: 81da strh r2, [r3, #14]
|
|
tcphdr->chksum = 0;
|
|
800cfbe: 693b ldr r3, [r7, #16]
|
|
800cfc0: 2200 movs r2, #0
|
|
800cfc2: 741a strb r2, [r3, #16]
|
|
800cfc4: 2200 movs r2, #0
|
|
800cfc6: 745a strb r2, [r3, #17]
|
|
tcphdr->urgp = 0;
|
|
800cfc8: 693b ldr r3, [r7, #16]
|
|
800cfca: 2200 movs r2, #0
|
|
800cfcc: 749a strb r2, [r3, #18]
|
|
800cfce: 2200 movs r2, #0
|
|
800cfd0: 74da strb r2, [r3, #19]
|
|
}
|
|
return p;
|
|
800cfd2: 697b ldr r3, [r7, #20]
|
|
}
|
|
800cfd4: 4618 mov r0, r3
|
|
800cfd6: 3718 adds r7, #24
|
|
800cfd8: 46bd mov sp, r7
|
|
800cfda: bd80 pop {r7, pc}
|
|
800cfdc: 08013618 .word 0x08013618
|
|
800cfe0: 08013d4c .word 0x08013d4c
|
|
800cfe4: 0801366c .word 0x0801366c
|
|
|
|
0800cfe8 <tcp_output_alloc_header>:
|
|
* @return pbuf with p->payload being the tcp_hdr
|
|
*/
|
|
static struct pbuf *
|
|
tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
|
|
u32_t seqno_be /* already in network byte order */)
|
|
{
|
|
800cfe8: b5b0 push {r4, r5, r7, lr}
|
|
800cfea: b08a sub sp, #40 ; 0x28
|
|
800cfec: af04 add r7, sp, #16
|
|
800cfee: 60f8 str r0, [r7, #12]
|
|
800cff0: 607b str r3, [r7, #4]
|
|
800cff2: 460b mov r3, r1
|
|
800cff4: 817b strh r3, [r7, #10]
|
|
800cff6: 4613 mov r3, r2
|
|
800cff8: 813b strh r3, [r7, #8]
|
|
struct pbuf *p;
|
|
|
|
LWIP_ASSERT("tcp_output_alloc_header: invalid pcb", pcb != NULL);
|
|
800cffa: 68fb ldr r3, [r7, #12]
|
|
800cffc: 2b00 cmp r3, #0
|
|
800cffe: d106 bne.n 800d00e <tcp_output_alloc_header+0x26>
|
|
800d000: 4b15 ldr r3, [pc, #84] ; (800d058 <tcp_output_alloc_header+0x70>)
|
|
800d002: f240 7242 movw r2, #1858 ; 0x742
|
|
800d006: 4915 ldr r1, [pc, #84] ; (800d05c <tcp_output_alloc_header+0x74>)
|
|
800d008: 4815 ldr r0, [pc, #84] ; (800d060 <tcp_output_alloc_header+0x78>)
|
|
800d00a: f003 fddd bl 8010bc8 <iprintf>
|
|
|
|
p = tcp_output_alloc_header_common(pcb->rcv_nxt, optlen, datalen,
|
|
800d00e: 68fb ldr r3, [r7, #12]
|
|
800d010: 6a58 ldr r0, [r3, #36] ; 0x24
|
|
800d012: 68fb ldr r3, [r7, #12]
|
|
800d014: 8adb ldrh r3, [r3, #22]
|
|
800d016: 68fa ldr r2, [r7, #12]
|
|
800d018: 8b12 ldrh r2, [r2, #24]
|
|
800d01a: 68f9 ldr r1, [r7, #12]
|
|
800d01c: 8d49 ldrh r1, [r1, #42] ; 0x2a
|
|
800d01e: 893d ldrh r5, [r7, #8]
|
|
800d020: 897c ldrh r4, [r7, #10]
|
|
800d022: 9103 str r1, [sp, #12]
|
|
800d024: 2110 movs r1, #16
|
|
800d026: 9102 str r1, [sp, #8]
|
|
800d028: 9201 str r2, [sp, #4]
|
|
800d02a: 9300 str r3, [sp, #0]
|
|
800d02c: 687b ldr r3, [r7, #4]
|
|
800d02e: 462a mov r2, r5
|
|
800d030: 4621 mov r1, r4
|
|
800d032: f7ff ff67 bl 800cf04 <tcp_output_alloc_header_common>
|
|
800d036: 6178 str r0, [r7, #20]
|
|
seqno_be, pcb->local_port, pcb->remote_port, TCP_ACK,
|
|
TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));
|
|
if (p != NULL) {
|
|
800d038: 697b ldr r3, [r7, #20]
|
|
800d03a: 2b00 cmp r3, #0
|
|
800d03c: d006 beq.n 800d04c <tcp_output_alloc_header+0x64>
|
|
/* If we're sending a packet, update the announced right window edge */
|
|
pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
|
|
800d03e: 68fb ldr r3, [r7, #12]
|
|
800d040: 6a5b ldr r3, [r3, #36] ; 0x24
|
|
800d042: 68fa ldr r2, [r7, #12]
|
|
800d044: 8d52 ldrh r2, [r2, #42] ; 0x2a
|
|
800d046: 441a add r2, r3
|
|
800d048: 68fb ldr r3, [r7, #12]
|
|
800d04a: 62da str r2, [r3, #44] ; 0x2c
|
|
}
|
|
return p;
|
|
800d04c: 697b ldr r3, [r7, #20]
|
|
}
|
|
800d04e: 4618 mov r0, r3
|
|
800d050: 3718 adds r7, #24
|
|
800d052: 46bd mov sp, r7
|
|
800d054: bdb0 pop {r4, r5, r7, pc}
|
|
800d056: bf00 nop
|
|
800d058: 08013618 .word 0x08013618
|
|
800d05c: 08013d7c .word 0x08013d7c
|
|
800d060: 0801366c .word 0x0801366c
|
|
|
|
0800d064 <tcp_output_fill_options>:
|
|
|
|
/* Fill in options for control segments */
|
|
static void
|
|
tcp_output_fill_options(const struct tcp_pcb *pcb, struct pbuf *p, u8_t optflags, u8_t num_sacks)
|
|
{
|
|
800d064: b580 push {r7, lr}
|
|
800d066: b088 sub sp, #32
|
|
800d068: af00 add r7, sp, #0
|
|
800d06a: 60f8 str r0, [r7, #12]
|
|
800d06c: 60b9 str r1, [r7, #8]
|
|
800d06e: 4611 mov r1, r2
|
|
800d070: 461a mov r2, r3
|
|
800d072: 460b mov r3, r1
|
|
800d074: 71fb strb r3, [r7, #7]
|
|
800d076: 4613 mov r3, r2
|
|
800d078: 71bb strb r3, [r7, #6]
|
|
struct tcp_hdr *tcphdr;
|
|
u32_t *opts;
|
|
u16_t sacks_len = 0;
|
|
800d07a: 2300 movs r3, #0
|
|
800d07c: 83fb strh r3, [r7, #30]
|
|
|
|
LWIP_ASSERT("tcp_output_fill_options: invalid pbuf", p != NULL);
|
|
800d07e: 68bb ldr r3, [r7, #8]
|
|
800d080: 2b00 cmp r3, #0
|
|
800d082: d106 bne.n 800d092 <tcp_output_fill_options+0x2e>
|
|
800d084: 4b12 ldr r3, [pc, #72] ; (800d0d0 <tcp_output_fill_options+0x6c>)
|
|
800d086: f240 7256 movw r2, #1878 ; 0x756
|
|
800d08a: 4912 ldr r1, [pc, #72] ; (800d0d4 <tcp_output_fill_options+0x70>)
|
|
800d08c: 4812 ldr r0, [pc, #72] ; (800d0d8 <tcp_output_fill_options+0x74>)
|
|
800d08e: f003 fd9b bl 8010bc8 <iprintf>
|
|
|
|
tcphdr = (struct tcp_hdr *)p->payload;
|
|
800d092: 68bb ldr r3, [r7, #8]
|
|
800d094: 685b ldr r3, [r3, #4]
|
|
800d096: 61bb str r3, [r7, #24]
|
|
opts = (u32_t *)(void *)(tcphdr + 1);
|
|
800d098: 69bb ldr r3, [r7, #24]
|
|
800d09a: 3314 adds r3, #20
|
|
800d09c: 617b str r3, [r7, #20]
|
|
opts = LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(p, tcphdr, pcb, opts);
|
|
#endif
|
|
|
|
LWIP_UNUSED_ARG(pcb);
|
|
LWIP_UNUSED_ARG(sacks_len);
|
|
LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(tcphdr + 1)) + sacks_len * 4 + LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb));
|
|
800d09e: 8bfb ldrh r3, [r7, #30]
|
|
800d0a0: 009b lsls r3, r3, #2
|
|
800d0a2: 461a mov r2, r3
|
|
800d0a4: 79fb ldrb r3, [r7, #7]
|
|
800d0a6: 009b lsls r3, r3, #2
|
|
800d0a8: f003 0304 and.w r3, r3, #4
|
|
800d0ac: 4413 add r3, r2
|
|
800d0ae: 3314 adds r3, #20
|
|
800d0b0: 69ba ldr r2, [r7, #24]
|
|
800d0b2: 4413 add r3, r2
|
|
800d0b4: 697a ldr r2, [r7, #20]
|
|
800d0b6: 429a cmp r2, r3
|
|
800d0b8: d006 beq.n 800d0c8 <tcp_output_fill_options+0x64>
|
|
800d0ba: 4b05 ldr r3, [pc, #20] ; (800d0d0 <tcp_output_fill_options+0x6c>)
|
|
800d0bc: f240 7275 movw r2, #1909 ; 0x775
|
|
800d0c0: 4906 ldr r1, [pc, #24] ; (800d0dc <tcp_output_fill_options+0x78>)
|
|
800d0c2: 4805 ldr r0, [pc, #20] ; (800d0d8 <tcp_output_fill_options+0x74>)
|
|
800d0c4: f003 fd80 bl 8010bc8 <iprintf>
|
|
LWIP_UNUSED_ARG(optflags); /* for LWIP_NOASSERT */
|
|
LWIP_UNUSED_ARG(opts); /* for LWIP_NOASSERT */
|
|
}
|
|
800d0c8: bf00 nop
|
|
800d0ca: 3720 adds r7, #32
|
|
800d0cc: 46bd mov sp, r7
|
|
800d0ce: bd80 pop {r7, pc}
|
|
800d0d0: 08013618 .word 0x08013618
|
|
800d0d4: 08013da4 .word 0x08013da4
|
|
800d0d8: 0801366c .word 0x0801366c
|
|
800d0dc: 08013c9c .word 0x08013c9c
|
|
|
|
0800d0e0 <tcp_output_control_segment>:
|
|
* header checksum and calling ip_output_if while handling netif hints and stats.
|
|
*/
|
|
static err_t
|
|
tcp_output_control_segment(const struct tcp_pcb *pcb, struct pbuf *p,
|
|
const ip_addr_t *src, const ip_addr_t *dst)
|
|
{
|
|
800d0e0: b580 push {r7, lr}
|
|
800d0e2: b08a sub sp, #40 ; 0x28
|
|
800d0e4: af04 add r7, sp, #16
|
|
800d0e6: 60f8 str r0, [r7, #12]
|
|
800d0e8: 60b9 str r1, [r7, #8]
|
|
800d0ea: 607a str r2, [r7, #4]
|
|
800d0ec: 603b str r3, [r7, #0]
|
|
err_t err;
|
|
struct netif *netif;
|
|
|
|
LWIP_ASSERT("tcp_output_control_segment: invalid pbuf", p != NULL);
|
|
800d0ee: 68bb ldr r3, [r7, #8]
|
|
800d0f0: 2b00 cmp r3, #0
|
|
800d0f2: d106 bne.n 800d102 <tcp_output_control_segment+0x22>
|
|
800d0f4: 4b1c ldr r3, [pc, #112] ; (800d168 <tcp_output_control_segment+0x88>)
|
|
800d0f6: f240 7287 movw r2, #1927 ; 0x787
|
|
800d0fa: 491c ldr r1, [pc, #112] ; (800d16c <tcp_output_control_segment+0x8c>)
|
|
800d0fc: 481c ldr r0, [pc, #112] ; (800d170 <tcp_output_control_segment+0x90>)
|
|
800d0fe: f003 fd63 bl 8010bc8 <iprintf>
|
|
|
|
netif = tcp_route(pcb, src, dst);
|
|
800d102: 683a ldr r2, [r7, #0]
|
|
800d104: 6879 ldr r1, [r7, #4]
|
|
800d106: 68f8 ldr r0, [r7, #12]
|
|
800d108: f7fe fa7c bl 800b604 <tcp_route>
|
|
800d10c: 6138 str r0, [r7, #16]
|
|
if (netif == NULL) {
|
|
800d10e: 693b ldr r3, [r7, #16]
|
|
800d110: 2b00 cmp r3, #0
|
|
800d112: d102 bne.n 800d11a <tcp_output_control_segment+0x3a>
|
|
err = ERR_RTE;
|
|
800d114: 23fc movs r3, #252 ; 0xfc
|
|
800d116: 75fb strb r3, [r7, #23]
|
|
800d118: e01c b.n 800d154 <tcp_output_control_segment+0x74>
|
|
struct tcp_hdr *tcphdr = (struct tcp_hdr *)p->payload;
|
|
tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
|
|
src, dst);
|
|
}
|
|
#endif
|
|
if (pcb != NULL) {
|
|
800d11a: 68fb ldr r3, [r7, #12]
|
|
800d11c: 2b00 cmp r3, #0
|
|
800d11e: d006 beq.n 800d12e <tcp_output_control_segment+0x4e>
|
|
NETIF_SET_HINTS(netif, LWIP_CONST_CAST(struct netif_hint*, &(pcb->netif_hints)));
|
|
ttl = pcb->ttl;
|
|
800d120: 68fb ldr r3, [r7, #12]
|
|
800d122: 7adb ldrb r3, [r3, #11]
|
|
800d124: 75bb strb r3, [r7, #22]
|
|
tos = pcb->tos;
|
|
800d126: 68fb ldr r3, [r7, #12]
|
|
800d128: 7a9b ldrb r3, [r3, #10]
|
|
800d12a: 757b strb r3, [r7, #21]
|
|
800d12c: e003 b.n 800d136 <tcp_output_control_segment+0x56>
|
|
} else {
|
|
/* Send output with hardcoded TTL/HL since we have no access to the pcb */
|
|
ttl = TCP_TTL;
|
|
800d12e: 23ff movs r3, #255 ; 0xff
|
|
800d130: 75bb strb r3, [r7, #22]
|
|
tos = 0;
|
|
800d132: 2300 movs r3, #0
|
|
800d134: 757b strb r3, [r7, #21]
|
|
}
|
|
TCP_STATS_INC(tcp.xmit);
|
|
err = ip_output_if(p, src, dst, ttl, tos, IP_PROTO_TCP, netif);
|
|
800d136: 7dba ldrb r2, [r7, #22]
|
|
800d138: 693b ldr r3, [r7, #16]
|
|
800d13a: 9302 str r3, [sp, #8]
|
|
800d13c: 2306 movs r3, #6
|
|
800d13e: 9301 str r3, [sp, #4]
|
|
800d140: 7d7b ldrb r3, [r7, #21]
|
|
800d142: 9300 str r3, [sp, #0]
|
|
800d144: 4613 mov r3, r2
|
|
800d146: 683a ldr r2, [r7, #0]
|
|
800d148: 6879 ldr r1, [r7, #4]
|
|
800d14a: 68b8 ldr r0, [r7, #8]
|
|
800d14c: f002 f85a bl 800f204 <ip4_output_if>
|
|
800d150: 4603 mov r3, r0
|
|
800d152: 75fb strb r3, [r7, #23]
|
|
NETIF_RESET_HINTS(netif);
|
|
}
|
|
pbuf_free(p);
|
|
800d154: 68b8 ldr r0, [r7, #8]
|
|
800d156: f7f9 ff3d bl 8006fd4 <pbuf_free>
|
|
return err;
|
|
800d15a: f997 3017 ldrsb.w r3, [r7, #23]
|
|
}
|
|
800d15e: 4618 mov r0, r3
|
|
800d160: 3718 adds r7, #24
|
|
800d162: 46bd mov sp, r7
|
|
800d164: bd80 pop {r7, pc}
|
|
800d166: bf00 nop
|
|
800d168: 08013618 .word 0x08013618
|
|
800d16c: 08013dcc .word 0x08013dcc
|
|
800d170: 0801366c .word 0x0801366c
|
|
|
|
0800d174 <tcp_rst>:
|
|
*/
|
|
void
|
|
tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno,
|
|
const ip_addr_t *local_ip, const ip_addr_t *remote_ip,
|
|
u16_t local_port, u16_t remote_port)
|
|
{
|
|
800d174: b590 push {r4, r7, lr}
|
|
800d176: b08b sub sp, #44 ; 0x2c
|
|
800d178: af04 add r7, sp, #16
|
|
800d17a: 60f8 str r0, [r7, #12]
|
|
800d17c: 60b9 str r1, [r7, #8]
|
|
800d17e: 607a str r2, [r7, #4]
|
|
800d180: 603b str r3, [r7, #0]
|
|
struct pbuf *p;
|
|
u16_t wnd;
|
|
u8_t optlen;
|
|
|
|
LWIP_ASSERT("tcp_rst: invalid local_ip", local_ip != NULL);
|
|
800d182: 683b ldr r3, [r7, #0]
|
|
800d184: 2b00 cmp r3, #0
|
|
800d186: d106 bne.n 800d196 <tcp_rst+0x22>
|
|
800d188: 4b1f ldr r3, [pc, #124] ; (800d208 <tcp_rst+0x94>)
|
|
800d18a: f240 72c4 movw r2, #1988 ; 0x7c4
|
|
800d18e: 491f ldr r1, [pc, #124] ; (800d20c <tcp_rst+0x98>)
|
|
800d190: 481f ldr r0, [pc, #124] ; (800d210 <tcp_rst+0x9c>)
|
|
800d192: f003 fd19 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("tcp_rst: invalid remote_ip", remote_ip != NULL);
|
|
800d196: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800d198: 2b00 cmp r3, #0
|
|
800d19a: d106 bne.n 800d1aa <tcp_rst+0x36>
|
|
800d19c: 4b1a ldr r3, [pc, #104] ; (800d208 <tcp_rst+0x94>)
|
|
800d19e: f240 72c5 movw r2, #1989 ; 0x7c5
|
|
800d1a2: 491c ldr r1, [pc, #112] ; (800d214 <tcp_rst+0xa0>)
|
|
800d1a4: 481a ldr r0, [pc, #104] ; (800d210 <tcp_rst+0x9c>)
|
|
800d1a6: f003 fd0f bl 8010bc8 <iprintf>
|
|
|
|
optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
|
|
800d1aa: 2300 movs r3, #0
|
|
800d1ac: 75fb strb r3, [r7, #23]
|
|
|
|
#if LWIP_WND_SCALE
|
|
wnd = PP_HTONS(((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF));
|
|
#else
|
|
wnd = PP_HTONS(TCP_WND);
|
|
800d1ae: f246 0308 movw r3, #24584 ; 0x6008
|
|
800d1b2: 82bb strh r3, [r7, #20]
|
|
#endif
|
|
|
|
p = tcp_output_alloc_header_common(ackno, optlen, 0, lwip_htonl(seqno), local_port,
|
|
800d1b4: 7dfb ldrb r3, [r7, #23]
|
|
800d1b6: b29c uxth r4, r3
|
|
800d1b8: 68b8 ldr r0, [r7, #8]
|
|
800d1ba: f7f8 f9dc bl 8005576 <lwip_htonl>
|
|
800d1be: 4602 mov r2, r0
|
|
800d1c0: 8abb ldrh r3, [r7, #20]
|
|
800d1c2: 9303 str r3, [sp, #12]
|
|
800d1c4: 2314 movs r3, #20
|
|
800d1c6: 9302 str r3, [sp, #8]
|
|
800d1c8: 8e3b ldrh r3, [r7, #48] ; 0x30
|
|
800d1ca: 9301 str r3, [sp, #4]
|
|
800d1cc: 8dbb ldrh r3, [r7, #44] ; 0x2c
|
|
800d1ce: 9300 str r3, [sp, #0]
|
|
800d1d0: 4613 mov r3, r2
|
|
800d1d2: 2200 movs r2, #0
|
|
800d1d4: 4621 mov r1, r4
|
|
800d1d6: 6878 ldr r0, [r7, #4]
|
|
800d1d8: f7ff fe94 bl 800cf04 <tcp_output_alloc_header_common>
|
|
800d1dc: 6138 str r0, [r7, #16]
|
|
remote_port, TCP_RST | TCP_ACK, wnd);
|
|
if (p == NULL) {
|
|
800d1de: 693b ldr r3, [r7, #16]
|
|
800d1e0: 2b00 cmp r3, #0
|
|
800d1e2: d00c beq.n 800d1fe <tcp_rst+0x8a>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n"));
|
|
return;
|
|
}
|
|
tcp_output_fill_options(pcb, p, 0, optlen);
|
|
800d1e4: 7dfb ldrb r3, [r7, #23]
|
|
800d1e6: 2200 movs r2, #0
|
|
800d1e8: 6939 ldr r1, [r7, #16]
|
|
800d1ea: 68f8 ldr r0, [r7, #12]
|
|
800d1ec: f7ff ff3a bl 800d064 <tcp_output_fill_options>
|
|
|
|
MIB2_STATS_INC(mib2.tcpoutrsts);
|
|
|
|
tcp_output_control_segment(pcb, p, local_ip, remote_ip);
|
|
800d1f0: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800d1f2: 683a ldr r2, [r7, #0]
|
|
800d1f4: 6939 ldr r1, [r7, #16]
|
|
800d1f6: 68f8 ldr r0, [r7, #12]
|
|
800d1f8: f7ff ff72 bl 800d0e0 <tcp_output_control_segment>
|
|
800d1fc: e000 b.n 800d200 <tcp_rst+0x8c>
|
|
return;
|
|
800d1fe: bf00 nop
|
|
LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
|
|
}
|
|
800d200: 371c adds r7, #28
|
|
800d202: 46bd mov sp, r7
|
|
800d204: bd90 pop {r4, r7, pc}
|
|
800d206: bf00 nop
|
|
800d208: 08013618 .word 0x08013618
|
|
800d20c: 08013df8 .word 0x08013df8
|
|
800d210: 0801366c .word 0x0801366c
|
|
800d214: 08013e14 .word 0x08013e14
|
|
|
|
0800d218 <tcp_send_empty_ack>:
|
|
*
|
|
* @param pcb Protocol control block for the TCP connection to send the ACK
|
|
*/
|
|
err_t
|
|
tcp_send_empty_ack(struct tcp_pcb *pcb)
|
|
{
|
|
800d218: b590 push {r4, r7, lr}
|
|
800d21a: b087 sub sp, #28
|
|
800d21c: af00 add r7, sp, #0
|
|
800d21e: 6078 str r0, [r7, #4]
|
|
err_t err;
|
|
struct pbuf *p;
|
|
u8_t optlen, optflags = 0;
|
|
800d220: 2300 movs r3, #0
|
|
800d222: 75fb strb r3, [r7, #23]
|
|
u8_t num_sacks = 0;
|
|
800d224: 2300 movs r3, #0
|
|
800d226: 75bb strb r3, [r7, #22]
|
|
|
|
LWIP_ASSERT("tcp_send_empty_ack: invalid pcb", pcb != NULL);
|
|
800d228: 687b ldr r3, [r7, #4]
|
|
800d22a: 2b00 cmp r3, #0
|
|
800d22c: d106 bne.n 800d23c <tcp_send_empty_ack+0x24>
|
|
800d22e: 4b28 ldr r3, [pc, #160] ; (800d2d0 <tcp_send_empty_ack+0xb8>)
|
|
800d230: f240 72ea movw r2, #2026 ; 0x7ea
|
|
800d234: 4927 ldr r1, [pc, #156] ; (800d2d4 <tcp_send_empty_ack+0xbc>)
|
|
800d236: 4828 ldr r0, [pc, #160] ; (800d2d8 <tcp_send_empty_ack+0xc0>)
|
|
800d238: f003 fcc6 bl 8010bc8 <iprintf>
|
|
#if LWIP_TCP_TIMESTAMPS
|
|
if (pcb->flags & TF_TIMESTAMP) {
|
|
optflags = TF_SEG_OPTS_TS;
|
|
}
|
|
#endif
|
|
optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb);
|
|
800d23c: 7dfb ldrb r3, [r7, #23]
|
|
800d23e: 009b lsls r3, r3, #2
|
|
800d240: b2db uxtb r3, r3
|
|
800d242: f003 0304 and.w r3, r3, #4
|
|
800d246: 757b strb r3, [r7, #21]
|
|
if ((num_sacks = tcp_get_num_sacks(pcb, optlen)) > 0) {
|
|
optlen += 4 + num_sacks * 8; /* 4 bytes for header (including 2*NOP), plus 8B for each SACK */
|
|
}
|
|
#endif
|
|
|
|
p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt));
|
|
800d248: 7d7b ldrb r3, [r7, #21]
|
|
800d24a: b29c uxth r4, r3
|
|
800d24c: 687b ldr r3, [r7, #4]
|
|
800d24e: 6d1b ldr r3, [r3, #80] ; 0x50
|
|
800d250: 4618 mov r0, r3
|
|
800d252: f7f8 f990 bl 8005576 <lwip_htonl>
|
|
800d256: 4603 mov r3, r0
|
|
800d258: 2200 movs r2, #0
|
|
800d25a: 4621 mov r1, r4
|
|
800d25c: 6878 ldr r0, [r7, #4]
|
|
800d25e: f7ff fec3 bl 800cfe8 <tcp_output_alloc_header>
|
|
800d262: 6138 str r0, [r7, #16]
|
|
if (p == NULL) {
|
|
800d264: 693b ldr r3, [r7, #16]
|
|
800d266: 2b00 cmp r3, #0
|
|
800d268: d109 bne.n 800d27e <tcp_send_empty_ack+0x66>
|
|
/* let tcp_fasttmr retry sending this ACK */
|
|
tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
|
|
800d26a: 687b ldr r3, [r7, #4]
|
|
800d26c: 8b5b ldrh r3, [r3, #26]
|
|
800d26e: f043 0303 orr.w r3, r3, #3
|
|
800d272: b29a uxth r2, r3
|
|
800d274: 687b ldr r3, [r7, #4]
|
|
800d276: 835a strh r2, [r3, #26]
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n"));
|
|
return ERR_BUF;
|
|
800d278: f06f 0301 mvn.w r3, #1
|
|
800d27c: e023 b.n 800d2c6 <tcp_send_empty_ack+0xae>
|
|
}
|
|
tcp_output_fill_options(pcb, p, optflags, num_sacks);
|
|
800d27e: 7dbb ldrb r3, [r7, #22]
|
|
800d280: 7dfa ldrb r2, [r7, #23]
|
|
800d282: 6939 ldr r1, [r7, #16]
|
|
800d284: 6878 ldr r0, [r7, #4]
|
|
800d286: f7ff feed bl 800d064 <tcp_output_fill_options>
|
|
pcb->ts_lastacksent = pcb->rcv_nxt;
|
|
#endif
|
|
|
|
LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
|
|
("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
|
|
err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip);
|
|
800d28a: 687a ldr r2, [r7, #4]
|
|
800d28c: 687b ldr r3, [r7, #4]
|
|
800d28e: 3304 adds r3, #4
|
|
800d290: 6939 ldr r1, [r7, #16]
|
|
800d292: 6878 ldr r0, [r7, #4]
|
|
800d294: f7ff ff24 bl 800d0e0 <tcp_output_control_segment>
|
|
800d298: 4603 mov r3, r0
|
|
800d29a: 73fb strb r3, [r7, #15]
|
|
if (err != ERR_OK) {
|
|
800d29c: f997 300f ldrsb.w r3, [r7, #15]
|
|
800d2a0: 2b00 cmp r3, #0
|
|
800d2a2: d007 beq.n 800d2b4 <tcp_send_empty_ack+0x9c>
|
|
/* let tcp_fasttmr retry sending this ACK */
|
|
tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
|
|
800d2a4: 687b ldr r3, [r7, #4]
|
|
800d2a6: 8b5b ldrh r3, [r3, #26]
|
|
800d2a8: f043 0303 orr.w r3, r3, #3
|
|
800d2ac: b29a uxth r2, r3
|
|
800d2ae: 687b ldr r3, [r7, #4]
|
|
800d2b0: 835a strh r2, [r3, #26]
|
|
800d2b2: e006 b.n 800d2c2 <tcp_send_empty_ack+0xaa>
|
|
} else {
|
|
/* remove ACK flags from the PCB, as we sent an empty ACK now */
|
|
tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
|
|
800d2b4: 687b ldr r3, [r7, #4]
|
|
800d2b6: 8b5b ldrh r3, [r3, #26]
|
|
800d2b8: f023 0303 bic.w r3, r3, #3
|
|
800d2bc: b29a uxth r2, r3
|
|
800d2be: 687b ldr r3, [r7, #4]
|
|
800d2c0: 835a strh r2, [r3, #26]
|
|
}
|
|
|
|
return err;
|
|
800d2c2: f997 300f ldrsb.w r3, [r7, #15]
|
|
}
|
|
800d2c6: 4618 mov r0, r3
|
|
800d2c8: 371c adds r7, #28
|
|
800d2ca: 46bd mov sp, r7
|
|
800d2cc: bd90 pop {r4, r7, pc}
|
|
800d2ce: bf00 nop
|
|
800d2d0: 08013618 .word 0x08013618
|
|
800d2d4: 08013e30 .word 0x08013e30
|
|
800d2d8: 0801366c .word 0x0801366c
|
|
|
|
0800d2dc <tcp_keepalive>:
|
|
*
|
|
* @param pcb the tcp_pcb for which to send a keepalive packet
|
|
*/
|
|
err_t
|
|
tcp_keepalive(struct tcp_pcb *pcb)
|
|
{
|
|
800d2dc: b590 push {r4, r7, lr}
|
|
800d2de: b085 sub sp, #20
|
|
800d2e0: af00 add r7, sp, #0
|
|
800d2e2: 6078 str r0, [r7, #4]
|
|
err_t err;
|
|
struct pbuf *p;
|
|
u8_t optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
|
|
800d2e4: 2300 movs r3, #0
|
|
800d2e6: 72bb strb r3, [r7, #10]
|
|
|
|
LWIP_ASSERT("tcp_keepalive: invalid pcb", pcb != NULL);
|
|
800d2e8: 687b ldr r3, [r7, #4]
|
|
800d2ea: 2b00 cmp r3, #0
|
|
800d2ec: d106 bne.n 800d2fc <tcp_keepalive+0x20>
|
|
800d2ee: 4b18 ldr r3, [pc, #96] ; (800d350 <tcp_keepalive+0x74>)
|
|
800d2f0: f640 0224 movw r2, #2084 ; 0x824
|
|
800d2f4: 4917 ldr r1, [pc, #92] ; (800d354 <tcp_keepalive+0x78>)
|
|
800d2f6: 4818 ldr r0, [pc, #96] ; (800d358 <tcp_keepalive+0x7c>)
|
|
800d2f8: f003 fc66 bl 8010bc8 <iprintf>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("\n"));
|
|
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
|
|
tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent));
|
|
|
|
p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt - 1));
|
|
800d2fc: 7abb ldrb r3, [r7, #10]
|
|
800d2fe: b29c uxth r4, r3
|
|
800d300: 687b ldr r3, [r7, #4]
|
|
800d302: 6d1b ldr r3, [r3, #80] ; 0x50
|
|
800d304: 3b01 subs r3, #1
|
|
800d306: 4618 mov r0, r3
|
|
800d308: f7f8 f935 bl 8005576 <lwip_htonl>
|
|
800d30c: 4603 mov r3, r0
|
|
800d30e: 2200 movs r2, #0
|
|
800d310: 4621 mov r1, r4
|
|
800d312: 6878 ldr r0, [r7, #4]
|
|
800d314: f7ff fe68 bl 800cfe8 <tcp_output_alloc_header>
|
|
800d318: 60f8 str r0, [r7, #12]
|
|
if (p == NULL) {
|
|
800d31a: 68fb ldr r3, [r7, #12]
|
|
800d31c: 2b00 cmp r3, #0
|
|
800d31e: d102 bne.n 800d326 <tcp_keepalive+0x4a>
|
|
LWIP_DEBUGF(TCP_DEBUG,
|
|
("tcp_keepalive: could not allocate memory for pbuf\n"));
|
|
return ERR_MEM;
|
|
800d320: f04f 33ff mov.w r3, #4294967295
|
|
800d324: e010 b.n 800d348 <tcp_keepalive+0x6c>
|
|
}
|
|
tcp_output_fill_options(pcb, p, 0, optlen);
|
|
800d326: 7abb ldrb r3, [r7, #10]
|
|
800d328: 2200 movs r2, #0
|
|
800d32a: 68f9 ldr r1, [r7, #12]
|
|
800d32c: 6878 ldr r0, [r7, #4]
|
|
800d32e: f7ff fe99 bl 800d064 <tcp_output_fill_options>
|
|
err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip);
|
|
800d332: 687a ldr r2, [r7, #4]
|
|
800d334: 687b ldr r3, [r7, #4]
|
|
800d336: 3304 adds r3, #4
|
|
800d338: 68f9 ldr r1, [r7, #12]
|
|
800d33a: 6878 ldr r0, [r7, #4]
|
|
800d33c: f7ff fed0 bl 800d0e0 <tcp_output_control_segment>
|
|
800d340: 4603 mov r3, r0
|
|
800d342: 72fb strb r3, [r7, #11]
|
|
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F" err %d.\n",
|
|
pcb->snd_nxt - 1, pcb->rcv_nxt, (int)err));
|
|
return err;
|
|
800d344: f997 300b ldrsb.w r3, [r7, #11]
|
|
}
|
|
800d348: 4618 mov r0, r3
|
|
800d34a: 3714 adds r7, #20
|
|
800d34c: 46bd mov sp, r7
|
|
800d34e: bd90 pop {r4, r7, pc}
|
|
800d350: 08013618 .word 0x08013618
|
|
800d354: 08013e50 .word 0x08013e50
|
|
800d358: 0801366c .word 0x0801366c
|
|
|
|
0800d35c <tcp_zero_window_probe>:
|
|
*
|
|
* @param pcb the tcp_pcb for which to send a zero-window probe packet
|
|
*/
|
|
err_t
|
|
tcp_zero_window_probe(struct tcp_pcb *pcb)
|
|
{
|
|
800d35c: b590 push {r4, r7, lr}
|
|
800d35e: b08b sub sp, #44 ; 0x2c
|
|
800d360: af00 add r7, sp, #0
|
|
800d362: 6078 str r0, [r7, #4]
|
|
struct tcp_hdr *tcphdr;
|
|
struct tcp_seg *seg;
|
|
u16_t len;
|
|
u8_t is_fin;
|
|
u32_t snd_nxt;
|
|
u8_t optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
|
|
800d364: 2300 movs r3, #0
|
|
800d366: 74fb strb r3, [r7, #19]
|
|
|
|
LWIP_ASSERT("tcp_zero_window_probe: invalid pcb", pcb != NULL);
|
|
800d368: 687b ldr r3, [r7, #4]
|
|
800d36a: 2b00 cmp r3, #0
|
|
800d36c: d106 bne.n 800d37c <tcp_zero_window_probe+0x20>
|
|
800d36e: 4b4d ldr r3, [pc, #308] ; (800d4a4 <tcp_zero_window_probe+0x148>)
|
|
800d370: f640 024f movw r2, #2127 ; 0x84f
|
|
800d374: 494c ldr r1, [pc, #304] ; (800d4a8 <tcp_zero_window_probe+0x14c>)
|
|
800d376: 484d ldr r0, [pc, #308] ; (800d4ac <tcp_zero_window_probe+0x150>)
|
|
800d378: f003 fc26 bl 8010bc8 <iprintf>
|
|
("tcp_zero_window_probe: tcp_ticks %"U32_F
|
|
" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
|
|
tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent));
|
|
|
|
/* Only consider unsent, persist timer should be off when there is data in-flight */
|
|
seg = pcb->unsent;
|
|
800d37c: 687b ldr r3, [r7, #4]
|
|
800d37e: 6edb ldr r3, [r3, #108] ; 0x6c
|
|
800d380: 627b str r3, [r7, #36] ; 0x24
|
|
if (seg == NULL) {
|
|
800d382: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d384: 2b00 cmp r3, #0
|
|
800d386: d101 bne.n 800d38c <tcp_zero_window_probe+0x30>
|
|
/* Not expected, persist timer should be off when the send buffer is empty */
|
|
return ERR_OK;
|
|
800d388: 2300 movs r3, #0
|
|
800d38a: e087 b.n 800d49c <tcp_zero_window_probe+0x140>
|
|
|
|
/* increment probe count. NOTE: we record probe even if it fails
|
|
to actually transmit due to an error. This ensures memory exhaustion/
|
|
routing problem doesn't leave a zero-window pcb as an indefinite zombie.
|
|
RTO mechanism has similar behavior, see pcb->nrtx */
|
|
if (pcb->persist_probe < 0xFF) {
|
|
800d38c: 687b ldr r3, [r7, #4]
|
|
800d38e: f893 309a ldrb.w r3, [r3, #154] ; 0x9a
|
|
800d392: 2bff cmp r3, #255 ; 0xff
|
|
800d394: d007 beq.n 800d3a6 <tcp_zero_window_probe+0x4a>
|
|
++pcb->persist_probe;
|
|
800d396: 687b ldr r3, [r7, #4]
|
|
800d398: f893 309a ldrb.w r3, [r3, #154] ; 0x9a
|
|
800d39c: 3301 adds r3, #1
|
|
800d39e: b2da uxtb r2, r3
|
|
800d3a0: 687b ldr r3, [r7, #4]
|
|
800d3a2: f883 209a strb.w r2, [r3, #154] ; 0x9a
|
|
}
|
|
|
|
is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);
|
|
800d3a6: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d3a8: 691b ldr r3, [r3, #16]
|
|
800d3aa: 899b ldrh r3, [r3, #12]
|
|
800d3ac: b29b uxth r3, r3
|
|
800d3ae: 4618 mov r0, r3
|
|
800d3b0: f7f8 f8cc bl 800554c <lwip_htons>
|
|
800d3b4: 4603 mov r3, r0
|
|
800d3b6: b2db uxtb r3, r3
|
|
800d3b8: f003 0301 and.w r3, r3, #1
|
|
800d3bc: 2b00 cmp r3, #0
|
|
800d3be: d005 beq.n 800d3cc <tcp_zero_window_probe+0x70>
|
|
800d3c0: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d3c2: 891b ldrh r3, [r3, #8]
|
|
800d3c4: 2b00 cmp r3, #0
|
|
800d3c6: d101 bne.n 800d3cc <tcp_zero_window_probe+0x70>
|
|
800d3c8: 2301 movs r3, #1
|
|
800d3ca: e000 b.n 800d3ce <tcp_zero_window_probe+0x72>
|
|
800d3cc: 2300 movs r3, #0
|
|
800d3ce: f887 3023 strb.w r3, [r7, #35] ; 0x23
|
|
/* we want to send one seqno: either FIN or data (no options) */
|
|
len = is_fin ? 0 : 1;
|
|
800d3d2: f897 3023 ldrb.w r3, [r7, #35] ; 0x23
|
|
800d3d6: 2b00 cmp r3, #0
|
|
800d3d8: bf0c ite eq
|
|
800d3da: 2301 moveq r3, #1
|
|
800d3dc: 2300 movne r3, #0
|
|
800d3de: b2db uxtb r3, r3
|
|
800d3e0: 843b strh r3, [r7, #32]
|
|
|
|
p = tcp_output_alloc_header(pcb, optlen, len, seg->tcphdr->seqno);
|
|
800d3e2: 7cfb ldrb r3, [r7, #19]
|
|
800d3e4: b299 uxth r1, r3
|
|
800d3e6: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d3e8: 691b ldr r3, [r3, #16]
|
|
800d3ea: 685b ldr r3, [r3, #4]
|
|
800d3ec: 8c3a ldrh r2, [r7, #32]
|
|
800d3ee: 6878 ldr r0, [r7, #4]
|
|
800d3f0: f7ff fdfa bl 800cfe8 <tcp_output_alloc_header>
|
|
800d3f4: 61f8 str r0, [r7, #28]
|
|
if (p == NULL) {
|
|
800d3f6: 69fb ldr r3, [r7, #28]
|
|
800d3f8: 2b00 cmp r3, #0
|
|
800d3fa: d102 bne.n 800d402 <tcp_zero_window_probe+0xa6>
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n"));
|
|
return ERR_MEM;
|
|
800d3fc: f04f 33ff mov.w r3, #4294967295
|
|
800d400: e04c b.n 800d49c <tcp_zero_window_probe+0x140>
|
|
}
|
|
tcphdr = (struct tcp_hdr *)p->payload;
|
|
800d402: 69fb ldr r3, [r7, #28]
|
|
800d404: 685b ldr r3, [r3, #4]
|
|
800d406: 61bb str r3, [r7, #24]
|
|
|
|
if (is_fin) {
|
|
800d408: f897 3023 ldrb.w r3, [r7, #35] ; 0x23
|
|
800d40c: 2b00 cmp r3, #0
|
|
800d40e: d011 beq.n 800d434 <tcp_zero_window_probe+0xd8>
|
|
/* FIN segment, no data */
|
|
TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN);
|
|
800d410: 69bb ldr r3, [r7, #24]
|
|
800d412: 899b ldrh r3, [r3, #12]
|
|
800d414: b29b uxth r3, r3
|
|
800d416: b21b sxth r3, r3
|
|
800d418: f423 537c bic.w r3, r3, #16128 ; 0x3f00
|
|
800d41c: b21c sxth r4, r3
|
|
800d41e: 2011 movs r0, #17
|
|
800d420: f7f8 f894 bl 800554c <lwip_htons>
|
|
800d424: 4603 mov r3, r0
|
|
800d426: b21b sxth r3, r3
|
|
800d428: 4323 orrs r3, r4
|
|
800d42a: b21b sxth r3, r3
|
|
800d42c: b29a uxth r2, r3
|
|
800d42e: 69bb ldr r3, [r7, #24]
|
|
800d430: 819a strh r2, [r3, #12]
|
|
800d432: e010 b.n 800d456 <tcp_zero_window_probe+0xfa>
|
|
} else {
|
|
/* Data segment, copy in one byte from the head of the unacked queue */
|
|
char *d = ((char *)p->payload + TCP_HLEN);
|
|
800d434: 69fb ldr r3, [r7, #28]
|
|
800d436: 685b ldr r3, [r3, #4]
|
|
800d438: 3314 adds r3, #20
|
|
800d43a: 617b str r3, [r7, #20]
|
|
/* Depending on whether the segment has already been sent (unacked) or not
|
|
(unsent), seg->p->payload points to the IP header or TCP header.
|
|
Ensure we copy the first TCP data byte: */
|
|
pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len);
|
|
800d43c: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d43e: 6858 ldr r0, [r3, #4]
|
|
800d440: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d442: 685b ldr r3, [r3, #4]
|
|
800d444: 891a ldrh r2, [r3, #8]
|
|
800d446: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d448: 891b ldrh r3, [r3, #8]
|
|
800d44a: 1ad3 subs r3, r2, r3
|
|
800d44c: b29b uxth r3, r3
|
|
800d44e: 2201 movs r2, #1
|
|
800d450: 6979 ldr r1, [r7, #20]
|
|
800d452: f7f9 ffa9 bl 80073a8 <pbuf_copy_partial>
|
|
}
|
|
|
|
/* The byte may be acknowledged without the window being opened. */
|
|
snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + 1;
|
|
800d456: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d458: 691b ldr r3, [r3, #16]
|
|
800d45a: 685b ldr r3, [r3, #4]
|
|
800d45c: 4618 mov r0, r3
|
|
800d45e: f7f8 f88a bl 8005576 <lwip_htonl>
|
|
800d462: 4603 mov r3, r0
|
|
800d464: 3301 adds r3, #1
|
|
800d466: 60fb str r3, [r7, #12]
|
|
if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
|
|
800d468: 687b ldr r3, [r7, #4]
|
|
800d46a: 6d1a ldr r2, [r3, #80] ; 0x50
|
|
800d46c: 68fb ldr r3, [r7, #12]
|
|
800d46e: 1ad3 subs r3, r2, r3
|
|
800d470: 2b00 cmp r3, #0
|
|
800d472: da02 bge.n 800d47a <tcp_zero_window_probe+0x11e>
|
|
pcb->snd_nxt = snd_nxt;
|
|
800d474: 687b ldr r3, [r7, #4]
|
|
800d476: 68fa ldr r2, [r7, #12]
|
|
800d478: 651a str r2, [r3, #80] ; 0x50
|
|
}
|
|
tcp_output_fill_options(pcb, p, 0, optlen);
|
|
800d47a: 7cfb ldrb r3, [r7, #19]
|
|
800d47c: 2200 movs r2, #0
|
|
800d47e: 69f9 ldr r1, [r7, #28]
|
|
800d480: 6878 ldr r0, [r7, #4]
|
|
800d482: f7ff fdef bl 800d064 <tcp_output_fill_options>
|
|
|
|
err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip);
|
|
800d486: 687a ldr r2, [r7, #4]
|
|
800d488: 687b ldr r3, [r7, #4]
|
|
800d48a: 3304 adds r3, #4
|
|
800d48c: 69f9 ldr r1, [r7, #28]
|
|
800d48e: 6878 ldr r0, [r7, #4]
|
|
800d490: f7ff fe26 bl 800d0e0 <tcp_output_control_segment>
|
|
800d494: 4603 mov r3, r0
|
|
800d496: 72fb strb r3, [r7, #11]
|
|
|
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
|
|
" ackno %"U32_F" err %d.\n",
|
|
pcb->snd_nxt - 1, pcb->rcv_nxt, (int)err));
|
|
return err;
|
|
800d498: f997 300b ldrsb.w r3, [r7, #11]
|
|
}
|
|
800d49c: 4618 mov r0, r3
|
|
800d49e: 372c adds r7, #44 ; 0x2c
|
|
800d4a0: 46bd mov sp, r7
|
|
800d4a2: bd90 pop {r4, r7, pc}
|
|
800d4a4: 08013618 .word 0x08013618
|
|
800d4a8: 08013e6c .word 0x08013e6c
|
|
800d4ac: 0801366c .word 0x0801366c
|
|
|
|
0800d4b0 <tcpip_tcp_timer>:
|
|
*
|
|
* @param arg unused argument
|
|
*/
|
|
static void
|
|
tcpip_tcp_timer(void *arg)
|
|
{
|
|
800d4b0: b580 push {r7, lr}
|
|
800d4b2: b082 sub sp, #8
|
|
800d4b4: af00 add r7, sp, #0
|
|
800d4b6: 6078 str r0, [r7, #4]
|
|
LWIP_UNUSED_ARG(arg);
|
|
|
|
/* call TCP timer handler */
|
|
tcp_tmr();
|
|
800d4b8: f7fa f864 bl 8007584 <tcp_tmr>
|
|
/* timer still needed? */
|
|
if (tcp_active_pcbs || tcp_tw_pcbs) {
|
|
800d4bc: 4b0a ldr r3, [pc, #40] ; (800d4e8 <tcpip_tcp_timer+0x38>)
|
|
800d4be: 681b ldr r3, [r3, #0]
|
|
800d4c0: 2b00 cmp r3, #0
|
|
800d4c2: d103 bne.n 800d4cc <tcpip_tcp_timer+0x1c>
|
|
800d4c4: 4b09 ldr r3, [pc, #36] ; (800d4ec <tcpip_tcp_timer+0x3c>)
|
|
800d4c6: 681b ldr r3, [r3, #0]
|
|
800d4c8: 2b00 cmp r3, #0
|
|
800d4ca: d005 beq.n 800d4d8 <tcpip_tcp_timer+0x28>
|
|
/* restart timer */
|
|
sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
|
|
800d4cc: 2200 movs r2, #0
|
|
800d4ce: 4908 ldr r1, [pc, #32] ; (800d4f0 <tcpip_tcp_timer+0x40>)
|
|
800d4d0: 20fa movs r0, #250 ; 0xfa
|
|
800d4d2: f000 f8f3 bl 800d6bc <sys_timeout>
|
|
800d4d6: e003 b.n 800d4e0 <tcpip_tcp_timer+0x30>
|
|
} else {
|
|
/* disable timer */
|
|
tcpip_tcp_timer_active = 0;
|
|
800d4d8: 4b06 ldr r3, [pc, #24] ; (800d4f4 <tcpip_tcp_timer+0x44>)
|
|
800d4da: 2200 movs r2, #0
|
|
800d4dc: 601a str r2, [r3, #0]
|
|
}
|
|
}
|
|
800d4de: bf00 nop
|
|
800d4e0: bf00 nop
|
|
800d4e2: 3708 adds r7, #8
|
|
800d4e4: 46bd mov sp, r7
|
|
800d4e6: bd80 pop {r7, pc}
|
|
800d4e8: 24007b78 .word 0x24007b78
|
|
800d4ec: 24007b7c .word 0x24007b7c
|
|
800d4f0: 0800d4b1 .word 0x0800d4b1
|
|
800d4f4: 24007bc8 .word 0x24007bc8
|
|
|
|
0800d4f8 <tcp_timer_needed>:
|
|
* the reason is to have the TCP timer only running when
|
|
* there are active (or time-wait) PCBs.
|
|
*/
|
|
void
|
|
tcp_timer_needed(void)
|
|
{
|
|
800d4f8: b580 push {r7, lr}
|
|
800d4fa: af00 add r7, sp, #0
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
/* timer is off but needed again? */
|
|
if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
|
|
800d4fc: 4b0a ldr r3, [pc, #40] ; (800d528 <tcp_timer_needed+0x30>)
|
|
800d4fe: 681b ldr r3, [r3, #0]
|
|
800d500: 2b00 cmp r3, #0
|
|
800d502: d10f bne.n 800d524 <tcp_timer_needed+0x2c>
|
|
800d504: 4b09 ldr r3, [pc, #36] ; (800d52c <tcp_timer_needed+0x34>)
|
|
800d506: 681b ldr r3, [r3, #0]
|
|
800d508: 2b00 cmp r3, #0
|
|
800d50a: d103 bne.n 800d514 <tcp_timer_needed+0x1c>
|
|
800d50c: 4b08 ldr r3, [pc, #32] ; (800d530 <tcp_timer_needed+0x38>)
|
|
800d50e: 681b ldr r3, [r3, #0]
|
|
800d510: 2b00 cmp r3, #0
|
|
800d512: d007 beq.n 800d524 <tcp_timer_needed+0x2c>
|
|
/* enable and start timer */
|
|
tcpip_tcp_timer_active = 1;
|
|
800d514: 4b04 ldr r3, [pc, #16] ; (800d528 <tcp_timer_needed+0x30>)
|
|
800d516: 2201 movs r2, #1
|
|
800d518: 601a str r2, [r3, #0]
|
|
sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
|
|
800d51a: 2200 movs r2, #0
|
|
800d51c: 4905 ldr r1, [pc, #20] ; (800d534 <tcp_timer_needed+0x3c>)
|
|
800d51e: 20fa movs r0, #250 ; 0xfa
|
|
800d520: f000 f8cc bl 800d6bc <sys_timeout>
|
|
}
|
|
}
|
|
800d524: bf00 nop
|
|
800d526: bd80 pop {r7, pc}
|
|
800d528: 24007bc8 .word 0x24007bc8
|
|
800d52c: 24007b78 .word 0x24007b78
|
|
800d530: 24007b7c .word 0x24007b7c
|
|
800d534: 0800d4b1 .word 0x0800d4b1
|
|
|
|
0800d538 <sys_timeout_abs>:
|
|
#if LWIP_DEBUG_TIMERNAMES
|
|
sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg, const char *handler_name)
|
|
#else /* LWIP_DEBUG_TIMERNAMES */
|
|
sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg)
|
|
#endif
|
|
{
|
|
800d538: b580 push {r7, lr}
|
|
800d53a: b086 sub sp, #24
|
|
800d53c: af00 add r7, sp, #0
|
|
800d53e: 60f8 str r0, [r7, #12]
|
|
800d540: 60b9 str r1, [r7, #8]
|
|
800d542: 607a str r2, [r7, #4]
|
|
struct sys_timeo *timeout, *t;
|
|
|
|
timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
|
|
800d544: 2006 movs r0, #6
|
|
800d546: f7f8 fd69 bl 800601c <memp_malloc>
|
|
800d54a: 6138 str r0, [r7, #16]
|
|
if (timeout == NULL) {
|
|
800d54c: 693b ldr r3, [r7, #16]
|
|
800d54e: 2b00 cmp r3, #0
|
|
800d550: d109 bne.n 800d566 <sys_timeout_abs+0x2e>
|
|
LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL);
|
|
800d552: 693b ldr r3, [r7, #16]
|
|
800d554: 2b00 cmp r3, #0
|
|
800d556: d151 bne.n 800d5fc <sys_timeout_abs+0xc4>
|
|
800d558: 4b2a ldr r3, [pc, #168] ; (800d604 <sys_timeout_abs+0xcc>)
|
|
800d55a: 22be movs r2, #190 ; 0xbe
|
|
800d55c: 492a ldr r1, [pc, #168] ; (800d608 <sys_timeout_abs+0xd0>)
|
|
800d55e: 482b ldr r0, [pc, #172] ; (800d60c <sys_timeout_abs+0xd4>)
|
|
800d560: f003 fb32 bl 8010bc8 <iprintf>
|
|
return;
|
|
800d564: e04a b.n 800d5fc <sys_timeout_abs+0xc4>
|
|
}
|
|
|
|
timeout->next = NULL;
|
|
800d566: 693b ldr r3, [r7, #16]
|
|
800d568: 2200 movs r2, #0
|
|
800d56a: 601a str r2, [r3, #0]
|
|
timeout->h = handler;
|
|
800d56c: 693b ldr r3, [r7, #16]
|
|
800d56e: 68ba ldr r2, [r7, #8]
|
|
800d570: 609a str r2, [r3, #8]
|
|
timeout->arg = arg;
|
|
800d572: 693b ldr r3, [r7, #16]
|
|
800d574: 687a ldr r2, [r7, #4]
|
|
800d576: 60da str r2, [r3, #12]
|
|
timeout->time = abs_time;
|
|
800d578: 693b ldr r3, [r7, #16]
|
|
800d57a: 68fa ldr r2, [r7, #12]
|
|
800d57c: 605a str r2, [r3, #4]
|
|
timeout->handler_name = handler_name;
|
|
LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p abs_time=%"U32_F" handler=%s arg=%p\n",
|
|
(void *)timeout, abs_time, handler_name, (void *)arg));
|
|
#endif /* LWIP_DEBUG_TIMERNAMES */
|
|
|
|
if (next_timeout == NULL) {
|
|
800d57e: 4b24 ldr r3, [pc, #144] ; (800d610 <sys_timeout_abs+0xd8>)
|
|
800d580: 681b ldr r3, [r3, #0]
|
|
800d582: 2b00 cmp r3, #0
|
|
800d584: d103 bne.n 800d58e <sys_timeout_abs+0x56>
|
|
next_timeout = timeout;
|
|
800d586: 4a22 ldr r2, [pc, #136] ; (800d610 <sys_timeout_abs+0xd8>)
|
|
800d588: 693b ldr r3, [r7, #16]
|
|
800d58a: 6013 str r3, [r2, #0]
|
|
return;
|
|
800d58c: e037 b.n 800d5fe <sys_timeout_abs+0xc6>
|
|
}
|
|
if (TIME_LESS_THAN(timeout->time, next_timeout->time)) {
|
|
800d58e: 693b ldr r3, [r7, #16]
|
|
800d590: 685a ldr r2, [r3, #4]
|
|
800d592: 4b1f ldr r3, [pc, #124] ; (800d610 <sys_timeout_abs+0xd8>)
|
|
800d594: 681b ldr r3, [r3, #0]
|
|
800d596: 685b ldr r3, [r3, #4]
|
|
800d598: 1ad3 subs r3, r2, r3
|
|
800d59a: 0fdb lsrs r3, r3, #31
|
|
800d59c: f003 0301 and.w r3, r3, #1
|
|
800d5a0: b2db uxtb r3, r3
|
|
800d5a2: 2b00 cmp r3, #0
|
|
800d5a4: d007 beq.n 800d5b6 <sys_timeout_abs+0x7e>
|
|
timeout->next = next_timeout;
|
|
800d5a6: 4b1a ldr r3, [pc, #104] ; (800d610 <sys_timeout_abs+0xd8>)
|
|
800d5a8: 681a ldr r2, [r3, #0]
|
|
800d5aa: 693b ldr r3, [r7, #16]
|
|
800d5ac: 601a str r2, [r3, #0]
|
|
next_timeout = timeout;
|
|
800d5ae: 4a18 ldr r2, [pc, #96] ; (800d610 <sys_timeout_abs+0xd8>)
|
|
800d5b0: 693b ldr r3, [r7, #16]
|
|
800d5b2: 6013 str r3, [r2, #0]
|
|
800d5b4: e023 b.n 800d5fe <sys_timeout_abs+0xc6>
|
|
} else {
|
|
for (t = next_timeout; t != NULL; t = t->next) {
|
|
800d5b6: 4b16 ldr r3, [pc, #88] ; (800d610 <sys_timeout_abs+0xd8>)
|
|
800d5b8: 681b ldr r3, [r3, #0]
|
|
800d5ba: 617b str r3, [r7, #20]
|
|
800d5bc: e01a b.n 800d5f4 <sys_timeout_abs+0xbc>
|
|
if ((t->next == NULL) || TIME_LESS_THAN(timeout->time, t->next->time)) {
|
|
800d5be: 697b ldr r3, [r7, #20]
|
|
800d5c0: 681b ldr r3, [r3, #0]
|
|
800d5c2: 2b00 cmp r3, #0
|
|
800d5c4: d00b beq.n 800d5de <sys_timeout_abs+0xa6>
|
|
800d5c6: 693b ldr r3, [r7, #16]
|
|
800d5c8: 685a ldr r2, [r3, #4]
|
|
800d5ca: 697b ldr r3, [r7, #20]
|
|
800d5cc: 681b ldr r3, [r3, #0]
|
|
800d5ce: 685b ldr r3, [r3, #4]
|
|
800d5d0: 1ad3 subs r3, r2, r3
|
|
800d5d2: 0fdb lsrs r3, r3, #31
|
|
800d5d4: f003 0301 and.w r3, r3, #1
|
|
800d5d8: b2db uxtb r3, r3
|
|
800d5da: 2b00 cmp r3, #0
|
|
800d5dc: d007 beq.n 800d5ee <sys_timeout_abs+0xb6>
|
|
timeout->next = t->next;
|
|
800d5de: 697b ldr r3, [r7, #20]
|
|
800d5e0: 681a ldr r2, [r3, #0]
|
|
800d5e2: 693b ldr r3, [r7, #16]
|
|
800d5e4: 601a str r2, [r3, #0]
|
|
t->next = timeout;
|
|
800d5e6: 697b ldr r3, [r7, #20]
|
|
800d5e8: 693a ldr r2, [r7, #16]
|
|
800d5ea: 601a str r2, [r3, #0]
|
|
break;
|
|
800d5ec: e007 b.n 800d5fe <sys_timeout_abs+0xc6>
|
|
for (t = next_timeout; t != NULL; t = t->next) {
|
|
800d5ee: 697b ldr r3, [r7, #20]
|
|
800d5f0: 681b ldr r3, [r3, #0]
|
|
800d5f2: 617b str r3, [r7, #20]
|
|
800d5f4: 697b ldr r3, [r7, #20]
|
|
800d5f6: 2b00 cmp r3, #0
|
|
800d5f8: d1e1 bne.n 800d5be <sys_timeout_abs+0x86>
|
|
800d5fa: e000 b.n 800d5fe <sys_timeout_abs+0xc6>
|
|
return;
|
|
800d5fc: bf00 nop
|
|
}
|
|
}
|
|
}
|
|
}
|
|
800d5fe: 3718 adds r7, #24
|
|
800d600: 46bd mov sp, r7
|
|
800d602: bd80 pop {r7, pc}
|
|
800d604: 08013e90 .word 0x08013e90
|
|
800d608: 08013ec4 .word 0x08013ec4
|
|
800d60c: 08013f04 .word 0x08013f04
|
|
800d610: 24007bc0 .word 0x24007bc0
|
|
|
|
0800d614 <lwip_cyclic_timer>:
|
|
#if !LWIP_TESTMODE
|
|
static
|
|
#endif
|
|
void
|
|
lwip_cyclic_timer(void *arg)
|
|
{
|
|
800d614: b580 push {r7, lr}
|
|
800d616: b086 sub sp, #24
|
|
800d618: af00 add r7, sp, #0
|
|
800d61a: 6078 str r0, [r7, #4]
|
|
u32_t now;
|
|
u32_t next_timeout_time;
|
|
const struct lwip_cyclic_timer *cyclic = (const struct lwip_cyclic_timer *)arg;
|
|
800d61c: 687b ldr r3, [r7, #4]
|
|
800d61e: 617b str r3, [r7, #20]
|
|
|
|
#if LWIP_DEBUG_TIMERNAMES
|
|
LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: %s()\n", cyclic->handler_name));
|
|
#endif
|
|
cyclic->handler();
|
|
800d620: 697b ldr r3, [r7, #20]
|
|
800d622: 685b ldr r3, [r3, #4]
|
|
800d624: 4798 blx r3
|
|
|
|
now = sys_now();
|
|
800d626: f7f7 fd43 bl 80050b0 <sys_now>
|
|
800d62a: 6138 str r0, [r7, #16]
|
|
next_timeout_time = (u32_t)(current_timeout_due_time + cyclic->interval_ms); /* overflow handled by TIME_LESS_THAN macro */
|
|
800d62c: 697b ldr r3, [r7, #20]
|
|
800d62e: 681a ldr r2, [r3, #0]
|
|
800d630: 4b0f ldr r3, [pc, #60] ; (800d670 <lwip_cyclic_timer+0x5c>)
|
|
800d632: 681b ldr r3, [r3, #0]
|
|
800d634: 4413 add r3, r2
|
|
800d636: 60fb str r3, [r7, #12]
|
|
if (TIME_LESS_THAN(next_timeout_time, now)) {
|
|
800d638: 68fa ldr r2, [r7, #12]
|
|
800d63a: 693b ldr r3, [r7, #16]
|
|
800d63c: 1ad3 subs r3, r2, r3
|
|
800d63e: 0fdb lsrs r3, r3, #31
|
|
800d640: f003 0301 and.w r3, r3, #1
|
|
800d644: b2db uxtb r3, r3
|
|
800d646: 2b00 cmp r3, #0
|
|
800d648: d009 beq.n 800d65e <lwip_cyclic_timer+0x4a>
|
|
/* timer would immediately expire again -> "overload" -> restart without any correction */
|
|
#if LWIP_DEBUG_TIMERNAMES
|
|
sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg, cyclic->handler_name);
|
|
#else
|
|
sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg);
|
|
800d64a: 697b ldr r3, [r7, #20]
|
|
800d64c: 681a ldr r2, [r3, #0]
|
|
800d64e: 693b ldr r3, [r7, #16]
|
|
800d650: 4413 add r3, r2
|
|
800d652: 687a ldr r2, [r7, #4]
|
|
800d654: 4907 ldr r1, [pc, #28] ; (800d674 <lwip_cyclic_timer+0x60>)
|
|
800d656: 4618 mov r0, r3
|
|
800d658: f7ff ff6e bl 800d538 <sys_timeout_abs>
|
|
sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg, cyclic->handler_name);
|
|
#else
|
|
sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg);
|
|
#endif
|
|
}
|
|
}
|
|
800d65c: e004 b.n 800d668 <lwip_cyclic_timer+0x54>
|
|
sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg);
|
|
800d65e: 687a ldr r2, [r7, #4]
|
|
800d660: 4904 ldr r1, [pc, #16] ; (800d674 <lwip_cyclic_timer+0x60>)
|
|
800d662: 68f8 ldr r0, [r7, #12]
|
|
800d664: f7ff ff68 bl 800d538 <sys_timeout_abs>
|
|
}
|
|
800d668: bf00 nop
|
|
800d66a: 3718 adds r7, #24
|
|
800d66c: 46bd mov sp, r7
|
|
800d66e: bd80 pop {r7, pc}
|
|
800d670: 24007bc4 .word 0x24007bc4
|
|
800d674: 0800d615 .word 0x0800d615
|
|
|
|
0800d678 <sys_timeouts_init>:
|
|
|
|
/** Initialize this module */
|
|
void sys_timeouts_init(void)
|
|
{
|
|
800d678: b580 push {r7, lr}
|
|
800d67a: b082 sub sp, #8
|
|
800d67c: af00 add r7, sp, #0
|
|
size_t i;
|
|
/* tcp_tmr() at index 0 is started on demand */
|
|
for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) {
|
|
800d67e: 2301 movs r3, #1
|
|
800d680: 607b str r3, [r7, #4]
|
|
800d682: e00e b.n 800d6a2 <sys_timeouts_init+0x2a>
|
|
/* we have to cast via size_t to get rid of const warning
|
|
(this is OK as cyclic_timer() casts back to const* */
|
|
sys_timeout(lwip_cyclic_timers[i].interval_ms, lwip_cyclic_timer, LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i]));
|
|
800d684: 4a0b ldr r2, [pc, #44] ; (800d6b4 <sys_timeouts_init+0x3c>)
|
|
800d686: 687b ldr r3, [r7, #4]
|
|
800d688: f852 0033 ldr.w r0, [r2, r3, lsl #3]
|
|
800d68c: 687b ldr r3, [r7, #4]
|
|
800d68e: 00db lsls r3, r3, #3
|
|
800d690: 4a08 ldr r2, [pc, #32] ; (800d6b4 <sys_timeouts_init+0x3c>)
|
|
800d692: 4413 add r3, r2
|
|
800d694: 461a mov r2, r3
|
|
800d696: 4908 ldr r1, [pc, #32] ; (800d6b8 <sys_timeouts_init+0x40>)
|
|
800d698: f000 f810 bl 800d6bc <sys_timeout>
|
|
for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) {
|
|
800d69c: 687b ldr r3, [r7, #4]
|
|
800d69e: 3301 adds r3, #1
|
|
800d6a0: 607b str r3, [r7, #4]
|
|
800d6a2: 687b ldr r3, [r7, #4]
|
|
800d6a4: 2b02 cmp r3, #2
|
|
800d6a6: d9ed bls.n 800d684 <sys_timeouts_init+0xc>
|
|
}
|
|
}
|
|
800d6a8: bf00 nop
|
|
800d6aa: bf00 nop
|
|
800d6ac: 3708 adds r7, #8
|
|
800d6ae: 46bd mov sp, r7
|
|
800d6b0: bd80 pop {r7, pc}
|
|
800d6b2: bf00 nop
|
|
800d6b4: 08014d7c .word 0x08014d7c
|
|
800d6b8: 0800d615 .word 0x0800d615
|
|
|
|
0800d6bc <sys_timeout>:
|
|
sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char *handler_name)
|
|
#else /* LWIP_DEBUG_TIMERNAMES */
|
|
void
|
|
sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
|
|
#endif /* LWIP_DEBUG_TIMERNAMES */
|
|
{
|
|
800d6bc: b580 push {r7, lr}
|
|
800d6be: b086 sub sp, #24
|
|
800d6c0: af00 add r7, sp, #0
|
|
800d6c2: 60f8 str r0, [r7, #12]
|
|
800d6c4: 60b9 str r1, [r7, #8]
|
|
800d6c6: 607a str r2, [r7, #4]
|
|
u32_t next_timeout_time;
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ASSERT("Timeout time too long, max is LWIP_UINT32_MAX/4 msecs", msecs <= (LWIP_UINT32_MAX / 4));
|
|
800d6c8: 68fb ldr r3, [r7, #12]
|
|
800d6ca: f1b3 4f80 cmp.w r3, #1073741824 ; 0x40000000
|
|
800d6ce: d306 bcc.n 800d6de <sys_timeout+0x22>
|
|
800d6d0: 4b0a ldr r3, [pc, #40] ; (800d6fc <sys_timeout+0x40>)
|
|
800d6d2: f240 1229 movw r2, #297 ; 0x129
|
|
800d6d6: 490a ldr r1, [pc, #40] ; (800d700 <sys_timeout+0x44>)
|
|
800d6d8: 480a ldr r0, [pc, #40] ; (800d704 <sys_timeout+0x48>)
|
|
800d6da: f003 fa75 bl 8010bc8 <iprintf>
|
|
|
|
next_timeout_time = (u32_t)(sys_now() + msecs); /* overflow handled by TIME_LESS_THAN macro */
|
|
800d6de: f7f7 fce7 bl 80050b0 <sys_now>
|
|
800d6e2: 4602 mov r2, r0
|
|
800d6e4: 68fb ldr r3, [r7, #12]
|
|
800d6e6: 4413 add r3, r2
|
|
800d6e8: 617b str r3, [r7, #20]
|
|
|
|
#if LWIP_DEBUG_TIMERNAMES
|
|
sys_timeout_abs(next_timeout_time, handler, arg, handler_name);
|
|
#else
|
|
sys_timeout_abs(next_timeout_time, handler, arg);
|
|
800d6ea: 687a ldr r2, [r7, #4]
|
|
800d6ec: 68b9 ldr r1, [r7, #8]
|
|
800d6ee: 6978 ldr r0, [r7, #20]
|
|
800d6f0: f7ff ff22 bl 800d538 <sys_timeout_abs>
|
|
#endif
|
|
}
|
|
800d6f4: bf00 nop
|
|
800d6f6: 3718 adds r7, #24
|
|
800d6f8: 46bd mov sp, r7
|
|
800d6fa: bd80 pop {r7, pc}
|
|
800d6fc: 08013e90 .word 0x08013e90
|
|
800d700: 08013f2c .word 0x08013f2c
|
|
800d704: 08013f04 .word 0x08013f04
|
|
|
|
0800d708 <sys_check_timeouts>:
|
|
*
|
|
* Must be called periodically from your main loop.
|
|
*/
|
|
void
|
|
sys_check_timeouts(void)
|
|
{
|
|
800d708: b580 push {r7, lr}
|
|
800d70a: b084 sub sp, #16
|
|
800d70c: af00 add r7, sp, #0
|
|
u32_t now;
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
/* Process only timers expired at the start of the function. */
|
|
now = sys_now();
|
|
800d70e: f7f7 fccf bl 80050b0 <sys_now>
|
|
800d712: 60f8 str r0, [r7, #12]
|
|
do {
|
|
struct sys_timeo *tmptimeout;
|
|
sys_timeout_handler handler;
|
|
void *arg;
|
|
|
|
PBUF_CHECK_FREE_OOSEQ();
|
|
800d714: 4b1a ldr r3, [pc, #104] ; (800d780 <sys_check_timeouts+0x78>)
|
|
800d716: 781b ldrb r3, [r3, #0]
|
|
800d718: b2db uxtb r3, r3
|
|
800d71a: 2b00 cmp r3, #0
|
|
800d71c: d001 beq.n 800d722 <sys_check_timeouts+0x1a>
|
|
800d71e: f7f9 f91f bl 8006960 <pbuf_free_ooseq>
|
|
|
|
tmptimeout = next_timeout;
|
|
800d722: 4b18 ldr r3, [pc, #96] ; (800d784 <sys_check_timeouts+0x7c>)
|
|
800d724: 681b ldr r3, [r3, #0]
|
|
800d726: 60bb str r3, [r7, #8]
|
|
if (tmptimeout == NULL) {
|
|
800d728: 68bb ldr r3, [r7, #8]
|
|
800d72a: 2b00 cmp r3, #0
|
|
800d72c: d022 beq.n 800d774 <sys_check_timeouts+0x6c>
|
|
return;
|
|
}
|
|
|
|
if (TIME_LESS_THAN(now, tmptimeout->time)) {
|
|
800d72e: 68bb ldr r3, [r7, #8]
|
|
800d730: 685b ldr r3, [r3, #4]
|
|
800d732: 68fa ldr r2, [r7, #12]
|
|
800d734: 1ad3 subs r3, r2, r3
|
|
800d736: 0fdb lsrs r3, r3, #31
|
|
800d738: f003 0301 and.w r3, r3, #1
|
|
800d73c: b2db uxtb r3, r3
|
|
800d73e: 2b00 cmp r3, #0
|
|
800d740: d11a bne.n 800d778 <sys_check_timeouts+0x70>
|
|
return;
|
|
}
|
|
|
|
/* Timeout has expired */
|
|
next_timeout = tmptimeout->next;
|
|
800d742: 68bb ldr r3, [r7, #8]
|
|
800d744: 681b ldr r3, [r3, #0]
|
|
800d746: 4a0f ldr r2, [pc, #60] ; (800d784 <sys_check_timeouts+0x7c>)
|
|
800d748: 6013 str r3, [r2, #0]
|
|
handler = tmptimeout->h;
|
|
800d74a: 68bb ldr r3, [r7, #8]
|
|
800d74c: 689b ldr r3, [r3, #8]
|
|
800d74e: 607b str r3, [r7, #4]
|
|
arg = tmptimeout->arg;
|
|
800d750: 68bb ldr r3, [r7, #8]
|
|
800d752: 68db ldr r3, [r3, #12]
|
|
800d754: 603b str r3, [r7, #0]
|
|
current_timeout_due_time = tmptimeout->time;
|
|
800d756: 68bb ldr r3, [r7, #8]
|
|
800d758: 685b ldr r3, [r3, #4]
|
|
800d75a: 4a0b ldr r2, [pc, #44] ; (800d788 <sys_check_timeouts+0x80>)
|
|
800d75c: 6013 str r3, [r2, #0]
|
|
if (handler != NULL) {
|
|
LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s t=%"U32_F" arg=%p\n",
|
|
tmptimeout->handler_name, sys_now() - tmptimeout->time, arg));
|
|
}
|
|
#endif /* LWIP_DEBUG_TIMERNAMES */
|
|
memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
|
|
800d75e: 68b9 ldr r1, [r7, #8]
|
|
800d760: 2006 movs r0, #6
|
|
800d762: f7f8 fccb bl 80060fc <memp_free>
|
|
if (handler != NULL) {
|
|
800d766: 687b ldr r3, [r7, #4]
|
|
800d768: 2b00 cmp r3, #0
|
|
800d76a: d0d3 beq.n 800d714 <sys_check_timeouts+0xc>
|
|
handler(arg);
|
|
800d76c: 687b ldr r3, [r7, #4]
|
|
800d76e: 6838 ldr r0, [r7, #0]
|
|
800d770: 4798 blx r3
|
|
do {
|
|
800d772: e7cf b.n 800d714 <sys_check_timeouts+0xc>
|
|
return;
|
|
800d774: bf00 nop
|
|
800d776: e000 b.n 800d77a <sys_check_timeouts+0x72>
|
|
return;
|
|
800d778: bf00 nop
|
|
}
|
|
LWIP_TCPIP_THREAD_ALIVE();
|
|
|
|
/* Repeat until all expired timers have been called */
|
|
} while (1);
|
|
}
|
|
800d77a: 3710 adds r7, #16
|
|
800d77c: 46bd mov sp, r7
|
|
800d77e: bd80 pop {r7, pc}
|
|
800d780: 24007b69 .word 0x24007b69
|
|
800d784: 24007bc0 .word 0x24007bc0
|
|
800d788: 24007bc4 .word 0x24007bc4
|
|
|
|
0800d78c <udp_init>:
|
|
/**
|
|
* Initialize this module.
|
|
*/
|
|
void
|
|
udp_init(void)
|
|
{
|
|
800d78c: b580 push {r7, lr}
|
|
800d78e: af00 add r7, sp, #0
|
|
#ifdef LWIP_RAND
|
|
udp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
|
|
800d790: f002 fd66 bl 8010260 <rand>
|
|
800d794: 4603 mov r3, r0
|
|
800d796: b29b uxth r3, r3
|
|
800d798: f3c3 030d ubfx r3, r3, #0, #14
|
|
800d79c: b29b uxth r3, r3
|
|
800d79e: f5a3 4380 sub.w r3, r3, #16384 ; 0x4000
|
|
800d7a2: b29a uxth r2, r3
|
|
800d7a4: 4b01 ldr r3, [pc, #4] ; (800d7ac <udp_init+0x20>)
|
|
800d7a6: 801a strh r2, [r3, #0]
|
|
#endif /* LWIP_RAND */
|
|
}
|
|
800d7a8: bf00 nop
|
|
800d7aa: bd80 pop {r7, pc}
|
|
800d7ac: 24000070 .word 0x24000070
|
|
|
|
0800d7b0 <udp_input_local_match>:
|
|
* @param broadcast 1 if his is an IPv4 broadcast (global or subnet-only), 0 otherwise (only used for IPv4)
|
|
* @return 1 on match, 0 otherwise
|
|
*/
|
|
static u8_t
|
|
udp_input_local_match(struct udp_pcb *pcb, struct netif *inp, u8_t broadcast)
|
|
{
|
|
800d7b0: b580 push {r7, lr}
|
|
800d7b2: b084 sub sp, #16
|
|
800d7b4: af00 add r7, sp, #0
|
|
800d7b6: 60f8 str r0, [r7, #12]
|
|
800d7b8: 60b9 str r1, [r7, #8]
|
|
800d7ba: 4613 mov r3, r2
|
|
800d7bc: 71fb strb r3, [r7, #7]
|
|
LWIP_UNUSED_ARG(inp); /* in IPv6 only case */
|
|
LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */
|
|
|
|
LWIP_ASSERT("udp_input_local_match: invalid pcb", pcb != NULL);
|
|
800d7be: 68fb ldr r3, [r7, #12]
|
|
800d7c0: 2b00 cmp r3, #0
|
|
800d7c2: d105 bne.n 800d7d0 <udp_input_local_match+0x20>
|
|
800d7c4: 4b27 ldr r3, [pc, #156] ; (800d864 <udp_input_local_match+0xb4>)
|
|
800d7c6: 2287 movs r2, #135 ; 0x87
|
|
800d7c8: 4927 ldr r1, [pc, #156] ; (800d868 <udp_input_local_match+0xb8>)
|
|
800d7ca: 4828 ldr r0, [pc, #160] ; (800d86c <udp_input_local_match+0xbc>)
|
|
800d7cc: f003 f9fc bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("udp_input_local_match: invalid netif", inp != NULL);
|
|
800d7d0: 68bb ldr r3, [r7, #8]
|
|
800d7d2: 2b00 cmp r3, #0
|
|
800d7d4: d105 bne.n 800d7e2 <udp_input_local_match+0x32>
|
|
800d7d6: 4b23 ldr r3, [pc, #140] ; (800d864 <udp_input_local_match+0xb4>)
|
|
800d7d8: 2288 movs r2, #136 ; 0x88
|
|
800d7da: 4925 ldr r1, [pc, #148] ; (800d870 <udp_input_local_match+0xc0>)
|
|
800d7dc: 4823 ldr r0, [pc, #140] ; (800d86c <udp_input_local_match+0xbc>)
|
|
800d7de: f003 f9f3 bl 8010bc8 <iprintf>
|
|
|
|
/* check if PCB is bound to specific netif */
|
|
if ((pcb->netif_idx != NETIF_NO_INDEX) &&
|
|
800d7e2: 68fb ldr r3, [r7, #12]
|
|
800d7e4: 7a1b ldrb r3, [r3, #8]
|
|
800d7e6: 2b00 cmp r3, #0
|
|
800d7e8: d00b beq.n 800d802 <udp_input_local_match+0x52>
|
|
(pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
|
|
800d7ea: 68fb ldr r3, [r7, #12]
|
|
800d7ec: 7a1a ldrb r2, [r3, #8]
|
|
800d7ee: 4b21 ldr r3, [pc, #132] ; (800d874 <udp_input_local_match+0xc4>)
|
|
800d7f0: 685b ldr r3, [r3, #4]
|
|
800d7f2: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
800d7f6: 3301 adds r3, #1
|
|
800d7f8: b2db uxtb r3, r3
|
|
if ((pcb->netif_idx != NETIF_NO_INDEX) &&
|
|
800d7fa: 429a cmp r2, r3
|
|
800d7fc: d001 beq.n 800d802 <udp_input_local_match+0x52>
|
|
return 0;
|
|
800d7fe: 2300 movs r3, #0
|
|
800d800: e02b b.n 800d85a <udp_input_local_match+0xaa>
|
|
/* Only need to check PCB if incoming IP version matches PCB IP version */
|
|
if (IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ip_current_dest_addr())) {
|
|
#if LWIP_IPV4
|
|
/* Special case: IPv4 broadcast: all or broadcasts in my subnet
|
|
* Note: broadcast variable can only be 1 if it is an IPv4 broadcast */
|
|
if (broadcast != 0) {
|
|
800d802: 79fb ldrb r3, [r7, #7]
|
|
800d804: 2b00 cmp r3, #0
|
|
800d806: d018 beq.n 800d83a <udp_input_local_match+0x8a>
|
|
#if IP_SOF_BROADCAST_RECV
|
|
if (ip_get_option(pcb, SOF_BROADCAST))
|
|
#endif /* IP_SOF_BROADCAST_RECV */
|
|
{
|
|
if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||
|
|
800d808: 68fb ldr r3, [r7, #12]
|
|
800d80a: 2b00 cmp r3, #0
|
|
800d80c: d013 beq.n 800d836 <udp_input_local_match+0x86>
|
|
800d80e: 68fb ldr r3, [r7, #12]
|
|
800d810: 681b ldr r3, [r3, #0]
|
|
800d812: 2b00 cmp r3, #0
|
|
800d814: d00f beq.n 800d836 <udp_input_local_match+0x86>
|
|
((ip4_current_dest_addr()->addr == IPADDR_BROADCAST)) ||
|
|
800d816: 4b17 ldr r3, [pc, #92] ; (800d874 <udp_input_local_match+0xc4>)
|
|
800d818: 695b ldr r3, [r3, #20]
|
|
if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||
|
|
800d81a: f1b3 3fff cmp.w r3, #4294967295
|
|
800d81e: d00a beq.n 800d836 <udp_input_local_match+0x86>
|
|
ip4_addr_netcmp(ip_2_ip4(&pcb->local_ip), ip4_current_dest_addr(), netif_ip4_netmask(inp))) {
|
|
800d820: 68fb ldr r3, [r7, #12]
|
|
800d822: 681a ldr r2, [r3, #0]
|
|
800d824: 4b13 ldr r3, [pc, #76] ; (800d874 <udp_input_local_match+0xc4>)
|
|
800d826: 695b ldr r3, [r3, #20]
|
|
800d828: 405a eors r2, r3
|
|
800d82a: 68bb ldr r3, [r7, #8]
|
|
800d82c: 3308 adds r3, #8
|
|
800d82e: 681b ldr r3, [r3, #0]
|
|
800d830: 4013 ands r3, r2
|
|
((ip4_current_dest_addr()->addr == IPADDR_BROADCAST)) ||
|
|
800d832: 2b00 cmp r3, #0
|
|
800d834: d110 bne.n 800d858 <udp_input_local_match+0xa8>
|
|
return 1;
|
|
800d836: 2301 movs r3, #1
|
|
800d838: e00f b.n 800d85a <udp_input_local_match+0xaa>
|
|
}
|
|
}
|
|
} else
|
|
#endif /* LWIP_IPV4 */
|
|
/* Handle IPv4 and IPv6: all or exact match */
|
|
if (ip_addr_isany(&pcb->local_ip) || ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
|
|
800d83a: 68fb ldr r3, [r7, #12]
|
|
800d83c: 2b00 cmp r3, #0
|
|
800d83e: d009 beq.n 800d854 <udp_input_local_match+0xa4>
|
|
800d840: 68fb ldr r3, [r7, #12]
|
|
800d842: 681b ldr r3, [r3, #0]
|
|
800d844: 2b00 cmp r3, #0
|
|
800d846: d005 beq.n 800d854 <udp_input_local_match+0xa4>
|
|
800d848: 68fb ldr r3, [r7, #12]
|
|
800d84a: 681a ldr r2, [r3, #0]
|
|
800d84c: 4b09 ldr r3, [pc, #36] ; (800d874 <udp_input_local_match+0xc4>)
|
|
800d84e: 695b ldr r3, [r3, #20]
|
|
800d850: 429a cmp r2, r3
|
|
800d852: d101 bne.n 800d858 <udp_input_local_match+0xa8>
|
|
return 1;
|
|
800d854: 2301 movs r3, #1
|
|
800d856: e000 b.n 800d85a <udp_input_local_match+0xaa>
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
800d858: 2300 movs r3, #0
|
|
}
|
|
800d85a: 4618 mov r0, r3
|
|
800d85c: 3710 adds r7, #16
|
|
800d85e: 46bd mov sp, r7
|
|
800d860: bd80 pop {r7, pc}
|
|
800d862: bf00 nop
|
|
800d864: 08013f78 .word 0x08013f78
|
|
800d868: 08013fa8 .word 0x08013fa8
|
|
800d86c: 08013fcc .word 0x08013fcc
|
|
800d870: 08013ff4 .word 0x08013ff4
|
|
800d874: 24004c10 .word 0x24004c10
|
|
|
|
0800d878 <udp_input>:
|
|
* @param inp network interface on which the datagram was received.
|
|
*
|
|
*/
|
|
void
|
|
udp_input(struct pbuf *p, struct netif *inp)
|
|
{
|
|
800d878: b590 push {r4, r7, lr}
|
|
800d87a: b08d sub sp, #52 ; 0x34
|
|
800d87c: af02 add r7, sp, #8
|
|
800d87e: 6078 str r0, [r7, #4]
|
|
800d880: 6039 str r1, [r7, #0]
|
|
struct udp_hdr *udphdr;
|
|
struct udp_pcb *pcb, *prev;
|
|
struct udp_pcb *uncon_pcb;
|
|
u16_t src, dest;
|
|
u8_t broadcast;
|
|
u8_t for_us = 0;
|
|
800d882: 2300 movs r3, #0
|
|
800d884: 77fb strb r3, [r7, #31]
|
|
|
|
LWIP_UNUSED_ARG(inp);
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ASSERT("udp_input: invalid pbuf", p != NULL);
|
|
800d886: 687b ldr r3, [r7, #4]
|
|
800d888: 2b00 cmp r3, #0
|
|
800d88a: d105 bne.n 800d898 <udp_input+0x20>
|
|
800d88c: 4b7c ldr r3, [pc, #496] ; (800da80 <udp_input+0x208>)
|
|
800d88e: 22cf movs r2, #207 ; 0xcf
|
|
800d890: 497c ldr r1, [pc, #496] ; (800da84 <udp_input+0x20c>)
|
|
800d892: 487d ldr r0, [pc, #500] ; (800da88 <udp_input+0x210>)
|
|
800d894: f003 f998 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("udp_input: invalid netif", inp != NULL);
|
|
800d898: 683b ldr r3, [r7, #0]
|
|
800d89a: 2b00 cmp r3, #0
|
|
800d89c: d105 bne.n 800d8aa <udp_input+0x32>
|
|
800d89e: 4b78 ldr r3, [pc, #480] ; (800da80 <udp_input+0x208>)
|
|
800d8a0: 22d0 movs r2, #208 ; 0xd0
|
|
800d8a2: 497a ldr r1, [pc, #488] ; (800da8c <udp_input+0x214>)
|
|
800d8a4: 4878 ldr r0, [pc, #480] ; (800da88 <udp_input+0x210>)
|
|
800d8a6: f003 f98f bl 8010bc8 <iprintf>
|
|
PERF_START;
|
|
|
|
UDP_STATS_INC(udp.recv);
|
|
|
|
/* Check minimum length (UDP header) */
|
|
if (p->len < UDP_HLEN) {
|
|
800d8aa: 687b ldr r3, [r7, #4]
|
|
800d8ac: 895b ldrh r3, [r3, #10]
|
|
800d8ae: 2b07 cmp r3, #7
|
|
800d8b0: d803 bhi.n 800d8ba <udp_input+0x42>
|
|
LWIP_DEBUGF(UDP_DEBUG,
|
|
("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len));
|
|
UDP_STATS_INC(udp.lenerr);
|
|
UDP_STATS_INC(udp.drop);
|
|
MIB2_STATS_INC(mib2.udpinerrors);
|
|
pbuf_free(p);
|
|
800d8b2: 6878 ldr r0, [r7, #4]
|
|
800d8b4: f7f9 fb8e bl 8006fd4 <pbuf_free>
|
|
goto end;
|
|
800d8b8: e0de b.n 800da78 <udp_input+0x200>
|
|
}
|
|
|
|
udphdr = (struct udp_hdr *)p->payload;
|
|
800d8ba: 687b ldr r3, [r7, #4]
|
|
800d8bc: 685b ldr r3, [r3, #4]
|
|
800d8be: 617b str r3, [r7, #20]
|
|
|
|
/* is broadcast packet ? */
|
|
broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif());
|
|
800d8c0: 4b73 ldr r3, [pc, #460] ; (800da90 <udp_input+0x218>)
|
|
800d8c2: 695b ldr r3, [r3, #20]
|
|
800d8c4: 4a72 ldr r2, [pc, #456] ; (800da90 <udp_input+0x218>)
|
|
800d8c6: 6812 ldr r2, [r2, #0]
|
|
800d8c8: 4611 mov r1, r2
|
|
800d8ca: 4618 mov r0, r3
|
|
800d8cc: f001 fd72 bl 800f3b4 <ip4_addr_isbroadcast_u32>
|
|
800d8d0: 4603 mov r3, r0
|
|
800d8d2: 74fb strb r3, [r7, #19]
|
|
|
|
LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len));
|
|
|
|
/* convert src and dest ports to host byte order */
|
|
src = lwip_ntohs(udphdr->src);
|
|
800d8d4: 697b ldr r3, [r7, #20]
|
|
800d8d6: 881b ldrh r3, [r3, #0]
|
|
800d8d8: b29b uxth r3, r3
|
|
800d8da: 4618 mov r0, r3
|
|
800d8dc: f7f7 fe36 bl 800554c <lwip_htons>
|
|
800d8e0: 4603 mov r3, r0
|
|
800d8e2: 823b strh r3, [r7, #16]
|
|
dest = lwip_ntohs(udphdr->dest);
|
|
800d8e4: 697b ldr r3, [r7, #20]
|
|
800d8e6: 885b ldrh r3, [r3, #2]
|
|
800d8e8: b29b uxth r3, r3
|
|
800d8ea: 4618 mov r0, r3
|
|
800d8ec: f7f7 fe2e bl 800554c <lwip_htons>
|
|
800d8f0: 4603 mov r3, r0
|
|
800d8f2: 81fb strh r3, [r7, #14]
|
|
ip_addr_debug_print_val(UDP_DEBUG, *ip_current_dest_addr());
|
|
LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", lwip_ntohs(udphdr->dest)));
|
|
ip_addr_debug_print_val(UDP_DEBUG, *ip_current_src_addr());
|
|
LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", lwip_ntohs(udphdr->src)));
|
|
|
|
pcb = NULL;
|
|
800d8f4: 2300 movs r3, #0
|
|
800d8f6: 623b str r3, [r7, #32]
|
|
prev = NULL;
|
|
800d8f8: 2300 movs r3, #0
|
|
800d8fa: 627b str r3, [r7, #36] ; 0x24
|
|
uncon_pcb = NULL;
|
|
800d8fc: 2300 movs r3, #0
|
|
800d8fe: 61bb str r3, [r7, #24]
|
|
/* Iterate through the UDP pcb list for a matching pcb.
|
|
* 'Perfect match' pcbs (connected to the remote port & ip address) are
|
|
* preferred. If no perfect match is found, the first unconnected pcb that
|
|
* matches the local port and ip address gets the datagram. */
|
|
for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
800d900: 4b64 ldr r3, [pc, #400] ; (800da94 <udp_input+0x21c>)
|
|
800d902: 681b ldr r3, [r3, #0]
|
|
800d904: 623b str r3, [r7, #32]
|
|
800d906: e054 b.n 800d9b2 <udp_input+0x13a>
|
|
LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", pcb->local_port));
|
|
ip_addr_debug_print_val(UDP_DEBUG, pcb->remote_ip);
|
|
LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", pcb->remote_port));
|
|
|
|
/* compare PCB local addr+port to UDP destination addr+port */
|
|
if ((pcb->local_port == dest) &&
|
|
800d908: 6a3b ldr r3, [r7, #32]
|
|
800d90a: 8a5b ldrh r3, [r3, #18]
|
|
800d90c: 89fa ldrh r2, [r7, #14]
|
|
800d90e: 429a cmp r2, r3
|
|
800d910: d14a bne.n 800d9a8 <udp_input+0x130>
|
|
(udp_input_local_match(pcb, inp, broadcast) != 0)) {
|
|
800d912: 7cfb ldrb r3, [r7, #19]
|
|
800d914: 461a mov r2, r3
|
|
800d916: 6839 ldr r1, [r7, #0]
|
|
800d918: 6a38 ldr r0, [r7, #32]
|
|
800d91a: f7ff ff49 bl 800d7b0 <udp_input_local_match>
|
|
800d91e: 4603 mov r3, r0
|
|
if ((pcb->local_port == dest) &&
|
|
800d920: 2b00 cmp r3, #0
|
|
800d922: d041 beq.n 800d9a8 <udp_input+0x130>
|
|
if ((pcb->flags & UDP_FLAGS_CONNECTED) == 0) {
|
|
800d924: 6a3b ldr r3, [r7, #32]
|
|
800d926: 7c1b ldrb r3, [r3, #16]
|
|
800d928: f003 0304 and.w r3, r3, #4
|
|
800d92c: 2b00 cmp r3, #0
|
|
800d92e: d11d bne.n 800d96c <udp_input+0xf4>
|
|
if (uncon_pcb == NULL) {
|
|
800d930: 69bb ldr r3, [r7, #24]
|
|
800d932: 2b00 cmp r3, #0
|
|
800d934: d102 bne.n 800d93c <udp_input+0xc4>
|
|
/* the first unconnected matching PCB */
|
|
uncon_pcb = pcb;
|
|
800d936: 6a3b ldr r3, [r7, #32]
|
|
800d938: 61bb str r3, [r7, #24]
|
|
800d93a: e017 b.n 800d96c <udp_input+0xf4>
|
|
#if LWIP_IPV4
|
|
} else if (broadcast && ip4_current_dest_addr()->addr == IPADDR_BROADCAST) {
|
|
800d93c: 7cfb ldrb r3, [r7, #19]
|
|
800d93e: 2b00 cmp r3, #0
|
|
800d940: d014 beq.n 800d96c <udp_input+0xf4>
|
|
800d942: 4b53 ldr r3, [pc, #332] ; (800da90 <udp_input+0x218>)
|
|
800d944: 695b ldr r3, [r3, #20]
|
|
800d946: f1b3 3fff cmp.w r3, #4294967295
|
|
800d94a: d10f bne.n 800d96c <udp_input+0xf4>
|
|
/* global broadcast address (only valid for IPv4; match was checked before) */
|
|
if (!IP_IS_V4_VAL(uncon_pcb->local_ip) || !ip4_addr_cmp(ip_2_ip4(&uncon_pcb->local_ip), netif_ip4_addr(inp))) {
|
|
800d94c: 69bb ldr r3, [r7, #24]
|
|
800d94e: 681a ldr r2, [r3, #0]
|
|
800d950: 683b ldr r3, [r7, #0]
|
|
800d952: 3304 adds r3, #4
|
|
800d954: 681b ldr r3, [r3, #0]
|
|
800d956: 429a cmp r2, r3
|
|
800d958: d008 beq.n 800d96c <udp_input+0xf4>
|
|
/* uncon_pcb does not match the input netif, check this pcb */
|
|
if (IP_IS_V4_VAL(pcb->local_ip) && ip4_addr_cmp(ip_2_ip4(&pcb->local_ip), netif_ip4_addr(inp))) {
|
|
800d95a: 6a3b ldr r3, [r7, #32]
|
|
800d95c: 681a ldr r2, [r3, #0]
|
|
800d95e: 683b ldr r3, [r7, #0]
|
|
800d960: 3304 adds r3, #4
|
|
800d962: 681b ldr r3, [r3, #0]
|
|
800d964: 429a cmp r2, r3
|
|
800d966: d101 bne.n 800d96c <udp_input+0xf4>
|
|
/* better match */
|
|
uncon_pcb = pcb;
|
|
800d968: 6a3b ldr r3, [r7, #32]
|
|
800d96a: 61bb str r3, [r7, #24]
|
|
}
|
|
#endif /* SO_REUSE */
|
|
}
|
|
|
|
/* compare PCB remote addr+port to UDP source addr+port */
|
|
if ((pcb->remote_port == src) &&
|
|
800d96c: 6a3b ldr r3, [r7, #32]
|
|
800d96e: 8a9b ldrh r3, [r3, #20]
|
|
800d970: 8a3a ldrh r2, [r7, #16]
|
|
800d972: 429a cmp r2, r3
|
|
800d974: d118 bne.n 800d9a8 <udp_input+0x130>
|
|
(ip_addr_isany_val(pcb->remote_ip) ||
|
|
800d976: 6a3b ldr r3, [r7, #32]
|
|
800d978: 685b ldr r3, [r3, #4]
|
|
if ((pcb->remote_port == src) &&
|
|
800d97a: 2b00 cmp r3, #0
|
|
800d97c: d005 beq.n 800d98a <udp_input+0x112>
|
|
ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()))) {
|
|
800d97e: 6a3b ldr r3, [r7, #32]
|
|
800d980: 685a ldr r2, [r3, #4]
|
|
800d982: 4b43 ldr r3, [pc, #268] ; (800da90 <udp_input+0x218>)
|
|
800d984: 691b ldr r3, [r3, #16]
|
|
(ip_addr_isany_val(pcb->remote_ip) ||
|
|
800d986: 429a cmp r2, r3
|
|
800d988: d10e bne.n 800d9a8 <udp_input+0x130>
|
|
/* the first fully matching PCB */
|
|
if (prev != NULL) {
|
|
800d98a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d98c: 2b00 cmp r3, #0
|
|
800d98e: d014 beq.n 800d9ba <udp_input+0x142>
|
|
/* move the pcb to the front of udp_pcbs so that is
|
|
found faster next time */
|
|
prev->next = pcb->next;
|
|
800d990: 6a3b ldr r3, [r7, #32]
|
|
800d992: 68da ldr r2, [r3, #12]
|
|
800d994: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800d996: 60da str r2, [r3, #12]
|
|
pcb->next = udp_pcbs;
|
|
800d998: 4b3e ldr r3, [pc, #248] ; (800da94 <udp_input+0x21c>)
|
|
800d99a: 681a ldr r2, [r3, #0]
|
|
800d99c: 6a3b ldr r3, [r7, #32]
|
|
800d99e: 60da str r2, [r3, #12]
|
|
udp_pcbs = pcb;
|
|
800d9a0: 4a3c ldr r2, [pc, #240] ; (800da94 <udp_input+0x21c>)
|
|
800d9a2: 6a3b ldr r3, [r7, #32]
|
|
800d9a4: 6013 str r3, [r2, #0]
|
|
} else {
|
|
UDP_STATS_INC(udp.cachehit);
|
|
}
|
|
break;
|
|
800d9a6: e008 b.n 800d9ba <udp_input+0x142>
|
|
}
|
|
}
|
|
|
|
prev = pcb;
|
|
800d9a8: 6a3b ldr r3, [r7, #32]
|
|
800d9aa: 627b str r3, [r7, #36] ; 0x24
|
|
for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
800d9ac: 6a3b ldr r3, [r7, #32]
|
|
800d9ae: 68db ldr r3, [r3, #12]
|
|
800d9b0: 623b str r3, [r7, #32]
|
|
800d9b2: 6a3b ldr r3, [r7, #32]
|
|
800d9b4: 2b00 cmp r3, #0
|
|
800d9b6: d1a7 bne.n 800d908 <udp_input+0x90>
|
|
800d9b8: e000 b.n 800d9bc <udp_input+0x144>
|
|
break;
|
|
800d9ba: bf00 nop
|
|
}
|
|
/* no fully matching pcb found? then look for an unconnected pcb */
|
|
if (pcb == NULL) {
|
|
800d9bc: 6a3b ldr r3, [r7, #32]
|
|
800d9be: 2b00 cmp r3, #0
|
|
800d9c0: d101 bne.n 800d9c6 <udp_input+0x14e>
|
|
pcb = uncon_pcb;
|
|
800d9c2: 69bb ldr r3, [r7, #24]
|
|
800d9c4: 623b str r3, [r7, #32]
|
|
}
|
|
|
|
/* Check checksum if this is a match or if it was directed at us. */
|
|
if (pcb != NULL) {
|
|
800d9c6: 6a3b ldr r3, [r7, #32]
|
|
800d9c8: 2b00 cmp r3, #0
|
|
800d9ca: d002 beq.n 800d9d2 <udp_input+0x15a>
|
|
for_us = 1;
|
|
800d9cc: 2301 movs r3, #1
|
|
800d9ce: 77fb strb r3, [r7, #31]
|
|
800d9d0: e00a b.n 800d9e8 <udp_input+0x170>
|
|
for_us = netif_get_ip6_addr_match(inp, ip6_current_dest_addr()) >= 0;
|
|
}
|
|
#endif /* LWIP_IPV6 */
|
|
#if LWIP_IPV4
|
|
if (!ip_current_is_v6()) {
|
|
for_us = ip4_addr_cmp(netif_ip4_addr(inp), ip4_current_dest_addr());
|
|
800d9d2: 683b ldr r3, [r7, #0]
|
|
800d9d4: 3304 adds r3, #4
|
|
800d9d6: 681a ldr r2, [r3, #0]
|
|
800d9d8: 4b2d ldr r3, [pc, #180] ; (800da90 <udp_input+0x218>)
|
|
800d9da: 695b ldr r3, [r3, #20]
|
|
800d9dc: 429a cmp r2, r3
|
|
800d9de: bf0c ite eq
|
|
800d9e0: 2301 moveq r3, #1
|
|
800d9e2: 2300 movne r3, #0
|
|
800d9e4: b2db uxtb r3, r3
|
|
800d9e6: 77fb strb r3, [r7, #31]
|
|
}
|
|
#endif /* LWIP_IPV4 */
|
|
}
|
|
|
|
if (for_us) {
|
|
800d9e8: 7ffb ldrb r3, [r7, #31]
|
|
800d9ea: 2b00 cmp r3, #0
|
|
800d9ec: d041 beq.n 800da72 <udp_input+0x1fa>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif /* CHECKSUM_CHECK_UDP */
|
|
if (pbuf_remove_header(p, UDP_HLEN)) {
|
|
800d9ee: 2108 movs r1, #8
|
|
800d9f0: 6878 ldr r0, [r7, #4]
|
|
800d9f2: f7f9 fa69 bl 8006ec8 <pbuf_remove_header>
|
|
800d9f6: 4603 mov r3, r0
|
|
800d9f8: 2b00 cmp r3, #0
|
|
800d9fa: d00a beq.n 800da12 <udp_input+0x19a>
|
|
/* Can we cope with this failing? Just assert for now */
|
|
LWIP_ASSERT("pbuf_remove_header failed\n", 0);
|
|
800d9fc: 4b20 ldr r3, [pc, #128] ; (800da80 <udp_input+0x208>)
|
|
800d9fe: f44f 72b8 mov.w r2, #368 ; 0x170
|
|
800da02: 4925 ldr r1, [pc, #148] ; (800da98 <udp_input+0x220>)
|
|
800da04: 4820 ldr r0, [pc, #128] ; (800da88 <udp_input+0x210>)
|
|
800da06: f003 f8df bl 8010bc8 <iprintf>
|
|
UDP_STATS_INC(udp.drop);
|
|
MIB2_STATS_INC(mib2.udpinerrors);
|
|
pbuf_free(p);
|
|
800da0a: 6878 ldr r0, [r7, #4]
|
|
800da0c: f7f9 fae2 bl 8006fd4 <pbuf_free>
|
|
goto end;
|
|
800da10: e032 b.n 800da78 <udp_input+0x200>
|
|
}
|
|
|
|
if (pcb != NULL) {
|
|
800da12: 6a3b ldr r3, [r7, #32]
|
|
800da14: 2b00 cmp r3, #0
|
|
800da16: d012 beq.n 800da3e <udp_input+0x1c6>
|
|
}
|
|
}
|
|
}
|
|
#endif /* SO_REUSE && SO_REUSE_RXTOALL */
|
|
/* callback */
|
|
if (pcb->recv != NULL) {
|
|
800da18: 6a3b ldr r3, [r7, #32]
|
|
800da1a: 699b ldr r3, [r3, #24]
|
|
800da1c: 2b00 cmp r3, #0
|
|
800da1e: d00a beq.n 800da36 <udp_input+0x1be>
|
|
/* now the recv function is responsible for freeing p */
|
|
pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
|
|
800da20: 6a3b ldr r3, [r7, #32]
|
|
800da22: 699c ldr r4, [r3, #24]
|
|
800da24: 6a3b ldr r3, [r7, #32]
|
|
800da26: 69d8 ldr r0, [r3, #28]
|
|
800da28: 8a3b ldrh r3, [r7, #16]
|
|
800da2a: 9300 str r3, [sp, #0]
|
|
800da2c: 4b1b ldr r3, [pc, #108] ; (800da9c <udp_input+0x224>)
|
|
800da2e: 687a ldr r2, [r7, #4]
|
|
800da30: 6a39 ldr r1, [r7, #32]
|
|
800da32: 47a0 blx r4
|
|
} else {
|
|
pbuf_free(p);
|
|
}
|
|
end:
|
|
PERF_STOP("udp_input");
|
|
return;
|
|
800da34: e021 b.n 800da7a <udp_input+0x202>
|
|
pbuf_free(p);
|
|
800da36: 6878 ldr r0, [r7, #4]
|
|
800da38: f7f9 facc bl 8006fd4 <pbuf_free>
|
|
goto end;
|
|
800da3c: e01c b.n 800da78 <udp_input+0x200>
|
|
if (!broadcast && !ip_addr_ismulticast(ip_current_dest_addr())) {
|
|
800da3e: 7cfb ldrb r3, [r7, #19]
|
|
800da40: 2b00 cmp r3, #0
|
|
800da42: d112 bne.n 800da6a <udp_input+0x1f2>
|
|
800da44: 4b12 ldr r3, [pc, #72] ; (800da90 <udp_input+0x218>)
|
|
800da46: 695b ldr r3, [r3, #20]
|
|
800da48: f003 03f0 and.w r3, r3, #240 ; 0xf0
|
|
800da4c: 2be0 cmp r3, #224 ; 0xe0
|
|
800da4e: d00c beq.n 800da6a <udp_input+0x1f2>
|
|
pbuf_header_force(p, (s16_t)(ip_current_header_tot_len() + UDP_HLEN));
|
|
800da50: 4b0f ldr r3, [pc, #60] ; (800da90 <udp_input+0x218>)
|
|
800da52: 899b ldrh r3, [r3, #12]
|
|
800da54: 3308 adds r3, #8
|
|
800da56: b29b uxth r3, r3
|
|
800da58: b21b sxth r3, r3
|
|
800da5a: 4619 mov r1, r3
|
|
800da5c: 6878 ldr r0, [r7, #4]
|
|
800da5e: f7f9 faa6 bl 8006fae <pbuf_header_force>
|
|
icmp_port_unreach(ip_current_is_v6(), p);
|
|
800da62: 2103 movs r1, #3
|
|
800da64: 6878 ldr r0, [r7, #4]
|
|
800da66: f001 f93b bl 800ece0 <icmp_dest_unreach>
|
|
pbuf_free(p);
|
|
800da6a: 6878 ldr r0, [r7, #4]
|
|
800da6c: f7f9 fab2 bl 8006fd4 <pbuf_free>
|
|
return;
|
|
800da70: e003 b.n 800da7a <udp_input+0x202>
|
|
pbuf_free(p);
|
|
800da72: 6878 ldr r0, [r7, #4]
|
|
800da74: f7f9 faae bl 8006fd4 <pbuf_free>
|
|
return;
|
|
800da78: bf00 nop
|
|
UDP_STATS_INC(udp.drop);
|
|
MIB2_STATS_INC(mib2.udpinerrors);
|
|
pbuf_free(p);
|
|
PERF_STOP("udp_input");
|
|
#endif /* CHECKSUM_CHECK_UDP */
|
|
}
|
|
800da7a: 372c adds r7, #44 ; 0x2c
|
|
800da7c: 46bd mov sp, r7
|
|
800da7e: bd90 pop {r4, r7, pc}
|
|
800da80: 08013f78 .word 0x08013f78
|
|
800da84: 0801401c .word 0x0801401c
|
|
800da88: 08013fcc .word 0x08013fcc
|
|
800da8c: 08014034 .word 0x08014034
|
|
800da90: 24004c10 .word 0x24004c10
|
|
800da94: 24007bcc .word 0x24007bcc
|
|
800da98: 08014050 .word 0x08014050
|
|
800da9c: 24004c20 .word 0x24004c20
|
|
|
|
0800daa0 <udp_netif_ip_addr_changed>:
|
|
*
|
|
* @param old_addr IP address of the netif before change
|
|
* @param new_addr IP address of the netif after change
|
|
*/
|
|
void udp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
|
|
{
|
|
800daa0: b480 push {r7}
|
|
800daa2: b085 sub sp, #20
|
|
800daa4: af00 add r7, sp, #0
|
|
800daa6: 6078 str r0, [r7, #4]
|
|
800daa8: 6039 str r1, [r7, #0]
|
|
struct udp_pcb *upcb;
|
|
|
|
if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) {
|
|
800daaa: 687b ldr r3, [r7, #4]
|
|
800daac: 2b00 cmp r3, #0
|
|
800daae: d01e beq.n 800daee <udp_netif_ip_addr_changed+0x4e>
|
|
800dab0: 687b ldr r3, [r7, #4]
|
|
800dab2: 681b ldr r3, [r3, #0]
|
|
800dab4: 2b00 cmp r3, #0
|
|
800dab6: d01a beq.n 800daee <udp_netif_ip_addr_changed+0x4e>
|
|
800dab8: 683b ldr r3, [r7, #0]
|
|
800daba: 2b00 cmp r3, #0
|
|
800dabc: d017 beq.n 800daee <udp_netif_ip_addr_changed+0x4e>
|
|
800dabe: 683b ldr r3, [r7, #0]
|
|
800dac0: 681b ldr r3, [r3, #0]
|
|
800dac2: 2b00 cmp r3, #0
|
|
800dac4: d013 beq.n 800daee <udp_netif_ip_addr_changed+0x4e>
|
|
for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) {
|
|
800dac6: 4b0d ldr r3, [pc, #52] ; (800dafc <udp_netif_ip_addr_changed+0x5c>)
|
|
800dac8: 681b ldr r3, [r3, #0]
|
|
800daca: 60fb str r3, [r7, #12]
|
|
800dacc: e00c b.n 800dae8 <udp_netif_ip_addr_changed+0x48>
|
|
/* PCB bound to current local interface address? */
|
|
if (ip_addr_cmp(&upcb->local_ip, old_addr)) {
|
|
800dace: 68fb ldr r3, [r7, #12]
|
|
800dad0: 681a ldr r2, [r3, #0]
|
|
800dad2: 687b ldr r3, [r7, #4]
|
|
800dad4: 681b ldr r3, [r3, #0]
|
|
800dad6: 429a cmp r2, r3
|
|
800dad8: d103 bne.n 800dae2 <udp_netif_ip_addr_changed+0x42>
|
|
/* The PCB is bound to the old ipaddr and
|
|
* is set to bound to the new one instead */
|
|
ip_addr_copy(upcb->local_ip, *new_addr);
|
|
800dada: 683b ldr r3, [r7, #0]
|
|
800dadc: 681a ldr r2, [r3, #0]
|
|
800dade: 68fb ldr r3, [r7, #12]
|
|
800dae0: 601a str r2, [r3, #0]
|
|
for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) {
|
|
800dae2: 68fb ldr r3, [r7, #12]
|
|
800dae4: 68db ldr r3, [r3, #12]
|
|
800dae6: 60fb str r3, [r7, #12]
|
|
800dae8: 68fb ldr r3, [r7, #12]
|
|
800daea: 2b00 cmp r3, #0
|
|
800daec: d1ef bne.n 800dace <udp_netif_ip_addr_changed+0x2e>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
800daee: bf00 nop
|
|
800daf0: 3714 adds r7, #20
|
|
800daf2: 46bd mov sp, r7
|
|
800daf4: f85d 7b04 ldr.w r7, [sp], #4
|
|
800daf8: 4770 bx lr
|
|
800dafa: bf00 nop
|
|
800dafc: 24007bcc .word 0x24007bcc
|
|
|
|
0800db00 <etharp_free_entry>:
|
|
#endif /* ARP_QUEUEING */
|
|
|
|
/** Clean up ARP table entries */
|
|
static void
|
|
etharp_free_entry(int i)
|
|
{
|
|
800db00: b580 push {r7, lr}
|
|
800db02: b082 sub sp, #8
|
|
800db04: af00 add r7, sp, #0
|
|
800db06: 6078 str r0, [r7, #4]
|
|
/* remove from SNMP ARP index tree */
|
|
mib2_remove_arp_entry(arp_table[i].netif, &arp_table[i].ipaddr);
|
|
/* and empty packet queue */
|
|
if (arp_table[i].q != NULL) {
|
|
800db08: 492b ldr r1, [pc, #172] ; (800dbb8 <etharp_free_entry+0xb8>)
|
|
800db0a: 687a ldr r2, [r7, #4]
|
|
800db0c: 4613 mov r3, r2
|
|
800db0e: 005b lsls r3, r3, #1
|
|
800db10: 4413 add r3, r2
|
|
800db12: 00db lsls r3, r3, #3
|
|
800db14: 440b add r3, r1
|
|
800db16: 681b ldr r3, [r3, #0]
|
|
800db18: 2b00 cmp r3, #0
|
|
800db1a: d013 beq.n 800db44 <etharp_free_entry+0x44>
|
|
/* remove all queued packets */
|
|
LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_free_entry: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q)));
|
|
free_etharp_q(arp_table[i].q);
|
|
800db1c: 4926 ldr r1, [pc, #152] ; (800dbb8 <etharp_free_entry+0xb8>)
|
|
800db1e: 687a ldr r2, [r7, #4]
|
|
800db20: 4613 mov r3, r2
|
|
800db22: 005b lsls r3, r3, #1
|
|
800db24: 4413 add r3, r2
|
|
800db26: 00db lsls r3, r3, #3
|
|
800db28: 440b add r3, r1
|
|
800db2a: 681b ldr r3, [r3, #0]
|
|
800db2c: 4618 mov r0, r3
|
|
800db2e: f7f9 fa51 bl 8006fd4 <pbuf_free>
|
|
arp_table[i].q = NULL;
|
|
800db32: 4921 ldr r1, [pc, #132] ; (800dbb8 <etharp_free_entry+0xb8>)
|
|
800db34: 687a ldr r2, [r7, #4]
|
|
800db36: 4613 mov r3, r2
|
|
800db38: 005b lsls r3, r3, #1
|
|
800db3a: 4413 add r3, r2
|
|
800db3c: 00db lsls r3, r3, #3
|
|
800db3e: 440b add r3, r1
|
|
800db40: 2200 movs r2, #0
|
|
800db42: 601a str r2, [r3, #0]
|
|
}
|
|
/* recycle entry for re-use */
|
|
arp_table[i].state = ETHARP_STATE_EMPTY;
|
|
800db44: 491c ldr r1, [pc, #112] ; (800dbb8 <etharp_free_entry+0xb8>)
|
|
800db46: 687a ldr r2, [r7, #4]
|
|
800db48: 4613 mov r3, r2
|
|
800db4a: 005b lsls r3, r3, #1
|
|
800db4c: 4413 add r3, r2
|
|
800db4e: 00db lsls r3, r3, #3
|
|
800db50: 440b add r3, r1
|
|
800db52: 3314 adds r3, #20
|
|
800db54: 2200 movs r2, #0
|
|
800db56: 701a strb r2, [r3, #0]
|
|
#ifdef LWIP_DEBUG
|
|
/* for debugging, clean out the complete entry */
|
|
arp_table[i].ctime = 0;
|
|
800db58: 4917 ldr r1, [pc, #92] ; (800dbb8 <etharp_free_entry+0xb8>)
|
|
800db5a: 687a ldr r2, [r7, #4]
|
|
800db5c: 4613 mov r3, r2
|
|
800db5e: 005b lsls r3, r3, #1
|
|
800db60: 4413 add r3, r2
|
|
800db62: 00db lsls r3, r3, #3
|
|
800db64: 440b add r3, r1
|
|
800db66: 3312 adds r3, #18
|
|
800db68: 2200 movs r2, #0
|
|
800db6a: 801a strh r2, [r3, #0]
|
|
arp_table[i].netif = NULL;
|
|
800db6c: 4912 ldr r1, [pc, #72] ; (800dbb8 <etharp_free_entry+0xb8>)
|
|
800db6e: 687a ldr r2, [r7, #4]
|
|
800db70: 4613 mov r3, r2
|
|
800db72: 005b lsls r3, r3, #1
|
|
800db74: 4413 add r3, r2
|
|
800db76: 00db lsls r3, r3, #3
|
|
800db78: 440b add r3, r1
|
|
800db7a: 3308 adds r3, #8
|
|
800db7c: 2200 movs r2, #0
|
|
800db7e: 601a str r2, [r3, #0]
|
|
ip4_addr_set_zero(&arp_table[i].ipaddr);
|
|
800db80: 490d ldr r1, [pc, #52] ; (800dbb8 <etharp_free_entry+0xb8>)
|
|
800db82: 687a ldr r2, [r7, #4]
|
|
800db84: 4613 mov r3, r2
|
|
800db86: 005b lsls r3, r3, #1
|
|
800db88: 4413 add r3, r2
|
|
800db8a: 00db lsls r3, r3, #3
|
|
800db8c: 440b add r3, r1
|
|
800db8e: 3304 adds r3, #4
|
|
800db90: 2200 movs r2, #0
|
|
800db92: 601a str r2, [r3, #0]
|
|
arp_table[i].ethaddr = ethzero;
|
|
800db94: 4908 ldr r1, [pc, #32] ; (800dbb8 <etharp_free_entry+0xb8>)
|
|
800db96: 687a ldr r2, [r7, #4]
|
|
800db98: 4613 mov r3, r2
|
|
800db9a: 005b lsls r3, r3, #1
|
|
800db9c: 4413 add r3, r2
|
|
800db9e: 00db lsls r3, r3, #3
|
|
800dba0: 440b add r3, r1
|
|
800dba2: 3308 adds r3, #8
|
|
800dba4: 4a05 ldr r2, [pc, #20] ; (800dbbc <etharp_free_entry+0xbc>)
|
|
800dba6: 3304 adds r3, #4
|
|
800dba8: 6810 ldr r0, [r2, #0]
|
|
800dbaa: 6018 str r0, [r3, #0]
|
|
800dbac: 8892 ldrh r2, [r2, #4]
|
|
800dbae: 809a strh r2, [r3, #4]
|
|
#endif /* LWIP_DEBUG */
|
|
}
|
|
800dbb0: bf00 nop
|
|
800dbb2: 3708 adds r7, #8
|
|
800dbb4: 46bd mov sp, r7
|
|
800dbb6: bd80 pop {r7, pc}
|
|
800dbb8: 24007bd0 .word 0x24007bd0
|
|
800dbbc: 08014da0 .word 0x08014da0
|
|
|
|
0800dbc0 <etharp_tmr>:
|
|
* This function should be called every ARP_TMR_INTERVAL milliseconds (1 second),
|
|
* in order to expire entries in the ARP table.
|
|
*/
|
|
void
|
|
etharp_tmr(void)
|
|
{
|
|
800dbc0: b580 push {r7, lr}
|
|
800dbc2: b082 sub sp, #8
|
|
800dbc4: af00 add r7, sp, #0
|
|
int i;
|
|
|
|
LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
|
|
/* remove expired entries from the ARP table */
|
|
for (i = 0; i < ARP_TABLE_SIZE; ++i) {
|
|
800dbc6: 2300 movs r3, #0
|
|
800dbc8: 607b str r3, [r7, #4]
|
|
800dbca: e096 b.n 800dcfa <etharp_tmr+0x13a>
|
|
u8_t state = arp_table[i].state;
|
|
800dbcc: 494f ldr r1, [pc, #316] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dbce: 687a ldr r2, [r7, #4]
|
|
800dbd0: 4613 mov r3, r2
|
|
800dbd2: 005b lsls r3, r3, #1
|
|
800dbd4: 4413 add r3, r2
|
|
800dbd6: 00db lsls r3, r3, #3
|
|
800dbd8: 440b add r3, r1
|
|
800dbda: 3314 adds r3, #20
|
|
800dbdc: 781b ldrb r3, [r3, #0]
|
|
800dbde: 70fb strb r3, [r7, #3]
|
|
if (state != ETHARP_STATE_EMPTY
|
|
800dbe0: 78fb ldrb r3, [r7, #3]
|
|
800dbe2: 2b00 cmp r3, #0
|
|
800dbe4: f000 8086 beq.w 800dcf4 <etharp_tmr+0x134>
|
|
#if ETHARP_SUPPORT_STATIC_ENTRIES
|
|
&& (state != ETHARP_STATE_STATIC)
|
|
#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
|
|
) {
|
|
arp_table[i].ctime++;
|
|
800dbe8: 4948 ldr r1, [pc, #288] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dbea: 687a ldr r2, [r7, #4]
|
|
800dbec: 4613 mov r3, r2
|
|
800dbee: 005b lsls r3, r3, #1
|
|
800dbf0: 4413 add r3, r2
|
|
800dbf2: 00db lsls r3, r3, #3
|
|
800dbf4: 440b add r3, r1
|
|
800dbf6: 3312 adds r3, #18
|
|
800dbf8: 881b ldrh r3, [r3, #0]
|
|
800dbfa: 3301 adds r3, #1
|
|
800dbfc: b298 uxth r0, r3
|
|
800dbfe: 4943 ldr r1, [pc, #268] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dc00: 687a ldr r2, [r7, #4]
|
|
800dc02: 4613 mov r3, r2
|
|
800dc04: 005b lsls r3, r3, #1
|
|
800dc06: 4413 add r3, r2
|
|
800dc08: 00db lsls r3, r3, #3
|
|
800dc0a: 440b add r3, r1
|
|
800dc0c: 3312 adds r3, #18
|
|
800dc0e: 4602 mov r2, r0
|
|
800dc10: 801a strh r2, [r3, #0]
|
|
if ((arp_table[i].ctime >= ARP_MAXAGE) ||
|
|
800dc12: 493e ldr r1, [pc, #248] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dc14: 687a ldr r2, [r7, #4]
|
|
800dc16: 4613 mov r3, r2
|
|
800dc18: 005b lsls r3, r3, #1
|
|
800dc1a: 4413 add r3, r2
|
|
800dc1c: 00db lsls r3, r3, #3
|
|
800dc1e: 440b add r3, r1
|
|
800dc20: 3312 adds r3, #18
|
|
800dc22: 881b ldrh r3, [r3, #0]
|
|
800dc24: f5b3 7f96 cmp.w r3, #300 ; 0x12c
|
|
800dc28: d215 bcs.n 800dc56 <etharp_tmr+0x96>
|
|
((arp_table[i].state == ETHARP_STATE_PENDING) &&
|
|
800dc2a: 4938 ldr r1, [pc, #224] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dc2c: 687a ldr r2, [r7, #4]
|
|
800dc2e: 4613 mov r3, r2
|
|
800dc30: 005b lsls r3, r3, #1
|
|
800dc32: 4413 add r3, r2
|
|
800dc34: 00db lsls r3, r3, #3
|
|
800dc36: 440b add r3, r1
|
|
800dc38: 3314 adds r3, #20
|
|
800dc3a: 781b ldrb r3, [r3, #0]
|
|
if ((arp_table[i].ctime >= ARP_MAXAGE) ||
|
|
800dc3c: 2b01 cmp r3, #1
|
|
800dc3e: d10e bne.n 800dc5e <etharp_tmr+0x9e>
|
|
(arp_table[i].ctime >= ARP_MAXPENDING))) {
|
|
800dc40: 4932 ldr r1, [pc, #200] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dc42: 687a ldr r2, [r7, #4]
|
|
800dc44: 4613 mov r3, r2
|
|
800dc46: 005b lsls r3, r3, #1
|
|
800dc48: 4413 add r3, r2
|
|
800dc4a: 00db lsls r3, r3, #3
|
|
800dc4c: 440b add r3, r1
|
|
800dc4e: 3312 adds r3, #18
|
|
800dc50: 881b ldrh r3, [r3, #0]
|
|
((arp_table[i].state == ETHARP_STATE_PENDING) &&
|
|
800dc52: 2b04 cmp r3, #4
|
|
800dc54: d903 bls.n 800dc5e <etharp_tmr+0x9e>
|
|
/* pending or stable entry has become old! */
|
|
LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %d.\n",
|
|
arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", i));
|
|
/* clean up entries that have just been expired */
|
|
etharp_free_entry(i);
|
|
800dc56: 6878 ldr r0, [r7, #4]
|
|
800dc58: f7ff ff52 bl 800db00 <etharp_free_entry>
|
|
800dc5c: e04a b.n 800dcf4 <etharp_tmr+0x134>
|
|
} else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_1) {
|
|
800dc5e: 492b ldr r1, [pc, #172] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dc60: 687a ldr r2, [r7, #4]
|
|
800dc62: 4613 mov r3, r2
|
|
800dc64: 005b lsls r3, r3, #1
|
|
800dc66: 4413 add r3, r2
|
|
800dc68: 00db lsls r3, r3, #3
|
|
800dc6a: 440b add r3, r1
|
|
800dc6c: 3314 adds r3, #20
|
|
800dc6e: 781b ldrb r3, [r3, #0]
|
|
800dc70: 2b03 cmp r3, #3
|
|
800dc72: d10a bne.n 800dc8a <etharp_tmr+0xca>
|
|
/* Don't send more than one request every 2 seconds. */
|
|
arp_table[i].state = ETHARP_STATE_STABLE_REREQUESTING_2;
|
|
800dc74: 4925 ldr r1, [pc, #148] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dc76: 687a ldr r2, [r7, #4]
|
|
800dc78: 4613 mov r3, r2
|
|
800dc7a: 005b lsls r3, r3, #1
|
|
800dc7c: 4413 add r3, r2
|
|
800dc7e: 00db lsls r3, r3, #3
|
|
800dc80: 440b add r3, r1
|
|
800dc82: 3314 adds r3, #20
|
|
800dc84: 2204 movs r2, #4
|
|
800dc86: 701a strb r2, [r3, #0]
|
|
800dc88: e034 b.n 800dcf4 <etharp_tmr+0x134>
|
|
} else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_2) {
|
|
800dc8a: 4920 ldr r1, [pc, #128] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dc8c: 687a ldr r2, [r7, #4]
|
|
800dc8e: 4613 mov r3, r2
|
|
800dc90: 005b lsls r3, r3, #1
|
|
800dc92: 4413 add r3, r2
|
|
800dc94: 00db lsls r3, r3, #3
|
|
800dc96: 440b add r3, r1
|
|
800dc98: 3314 adds r3, #20
|
|
800dc9a: 781b ldrb r3, [r3, #0]
|
|
800dc9c: 2b04 cmp r3, #4
|
|
800dc9e: d10a bne.n 800dcb6 <etharp_tmr+0xf6>
|
|
/* Reset state to stable, so that the next transmitted packet will
|
|
re-send an ARP request. */
|
|
arp_table[i].state = ETHARP_STATE_STABLE;
|
|
800dca0: 491a ldr r1, [pc, #104] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dca2: 687a ldr r2, [r7, #4]
|
|
800dca4: 4613 mov r3, r2
|
|
800dca6: 005b lsls r3, r3, #1
|
|
800dca8: 4413 add r3, r2
|
|
800dcaa: 00db lsls r3, r3, #3
|
|
800dcac: 440b add r3, r1
|
|
800dcae: 3314 adds r3, #20
|
|
800dcb0: 2202 movs r2, #2
|
|
800dcb2: 701a strb r2, [r3, #0]
|
|
800dcb4: e01e b.n 800dcf4 <etharp_tmr+0x134>
|
|
} else if (arp_table[i].state == ETHARP_STATE_PENDING) {
|
|
800dcb6: 4915 ldr r1, [pc, #84] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dcb8: 687a ldr r2, [r7, #4]
|
|
800dcba: 4613 mov r3, r2
|
|
800dcbc: 005b lsls r3, r3, #1
|
|
800dcbe: 4413 add r3, r2
|
|
800dcc0: 00db lsls r3, r3, #3
|
|
800dcc2: 440b add r3, r1
|
|
800dcc4: 3314 adds r3, #20
|
|
800dcc6: 781b ldrb r3, [r3, #0]
|
|
800dcc8: 2b01 cmp r3, #1
|
|
800dcca: d113 bne.n 800dcf4 <etharp_tmr+0x134>
|
|
/* still pending, resend an ARP query */
|
|
etharp_request(arp_table[i].netif, &arp_table[i].ipaddr);
|
|
800dccc: 490f ldr r1, [pc, #60] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dcce: 687a ldr r2, [r7, #4]
|
|
800dcd0: 4613 mov r3, r2
|
|
800dcd2: 005b lsls r3, r3, #1
|
|
800dcd4: 4413 add r3, r2
|
|
800dcd6: 00db lsls r3, r3, #3
|
|
800dcd8: 440b add r3, r1
|
|
800dcda: 3308 adds r3, #8
|
|
800dcdc: 6818 ldr r0, [r3, #0]
|
|
800dcde: 687a ldr r2, [r7, #4]
|
|
800dce0: 4613 mov r3, r2
|
|
800dce2: 005b lsls r3, r3, #1
|
|
800dce4: 4413 add r3, r2
|
|
800dce6: 00db lsls r3, r3, #3
|
|
800dce8: 4a08 ldr r2, [pc, #32] ; (800dd0c <etharp_tmr+0x14c>)
|
|
800dcea: 4413 add r3, r2
|
|
800dcec: 3304 adds r3, #4
|
|
800dcee: 4619 mov r1, r3
|
|
800dcf0: f000 fe6e bl 800e9d0 <etharp_request>
|
|
for (i = 0; i < ARP_TABLE_SIZE; ++i) {
|
|
800dcf4: 687b ldr r3, [r7, #4]
|
|
800dcf6: 3301 adds r3, #1
|
|
800dcf8: 607b str r3, [r7, #4]
|
|
800dcfa: 687b ldr r3, [r7, #4]
|
|
800dcfc: 2b09 cmp r3, #9
|
|
800dcfe: f77f af65 ble.w 800dbcc <etharp_tmr+0xc>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
800dd02: bf00 nop
|
|
800dd04: bf00 nop
|
|
800dd06: 3708 adds r7, #8
|
|
800dd08: 46bd mov sp, r7
|
|
800dd0a: bd80 pop {r7, pc}
|
|
800dd0c: 24007bd0 .word 0x24007bd0
|
|
|
|
0800dd10 <etharp_find_entry>:
|
|
* @return The ARP entry index that matched or is created, ERR_MEM if no
|
|
* entry is found or could be recycled.
|
|
*/
|
|
static s16_t
|
|
etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif *netif)
|
|
{
|
|
800dd10: b580 push {r7, lr}
|
|
800dd12: b08a sub sp, #40 ; 0x28
|
|
800dd14: af00 add r7, sp, #0
|
|
800dd16: 60f8 str r0, [r7, #12]
|
|
800dd18: 460b mov r3, r1
|
|
800dd1a: 607a str r2, [r7, #4]
|
|
800dd1c: 72fb strb r3, [r7, #11]
|
|
s16_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
|
|
800dd1e: 230a movs r3, #10
|
|
800dd20: 843b strh r3, [r7, #32]
|
|
800dd22: 230a movs r3, #10
|
|
800dd24: 847b strh r3, [r7, #34] ; 0x22
|
|
s16_t empty = ARP_TABLE_SIZE;
|
|
800dd26: 230a movs r3, #10
|
|
800dd28: 84bb strh r3, [r7, #36] ; 0x24
|
|
s16_t i = 0;
|
|
800dd2a: 2300 movs r3, #0
|
|
800dd2c: 84fb strh r3, [r7, #38] ; 0x26
|
|
/* oldest entry with packets on queue */
|
|
s16_t old_queue = ARP_TABLE_SIZE;
|
|
800dd2e: 230a movs r3, #10
|
|
800dd30: 83fb strh r3, [r7, #30]
|
|
/* its age */
|
|
u16_t age_queue = 0, age_pending = 0, age_stable = 0;
|
|
800dd32: 2300 movs r3, #0
|
|
800dd34: 83bb strh r3, [r7, #28]
|
|
800dd36: 2300 movs r3, #0
|
|
800dd38: 837b strh r3, [r7, #26]
|
|
800dd3a: 2300 movs r3, #0
|
|
800dd3c: 833b strh r3, [r7, #24]
|
|
* 4) remember the oldest pending entry with queued packets (if any)
|
|
* 5) search for a matching IP entry, either pending or stable
|
|
* until 5 matches, or all entries are searched for.
|
|
*/
|
|
|
|
for (i = 0; i < ARP_TABLE_SIZE; ++i) {
|
|
800dd3e: 2300 movs r3, #0
|
|
800dd40: 84fb strh r3, [r7, #38] ; 0x26
|
|
800dd42: e0ae b.n 800dea2 <etharp_find_entry+0x192>
|
|
u8_t state = arp_table[i].state;
|
|
800dd44: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800dd48: 49a6 ldr r1, [pc, #664] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800dd4a: 4613 mov r3, r2
|
|
800dd4c: 005b lsls r3, r3, #1
|
|
800dd4e: 4413 add r3, r2
|
|
800dd50: 00db lsls r3, r3, #3
|
|
800dd52: 440b add r3, r1
|
|
800dd54: 3314 adds r3, #20
|
|
800dd56: 781b ldrb r3, [r3, #0]
|
|
800dd58: 75fb strb r3, [r7, #23]
|
|
/* no empty entry found yet and now we do find one? */
|
|
if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {
|
|
800dd5a: f9b7 3024 ldrsh.w r3, [r7, #36] ; 0x24
|
|
800dd5e: 2b0a cmp r3, #10
|
|
800dd60: d105 bne.n 800dd6e <etharp_find_entry+0x5e>
|
|
800dd62: 7dfb ldrb r3, [r7, #23]
|
|
800dd64: 2b00 cmp r3, #0
|
|
800dd66: d102 bne.n 800dd6e <etharp_find_entry+0x5e>
|
|
LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %d\n", (int)i));
|
|
/* remember first empty entry */
|
|
empty = i;
|
|
800dd68: 8cfb ldrh r3, [r7, #38] ; 0x26
|
|
800dd6a: 84bb strh r3, [r7, #36] ; 0x24
|
|
800dd6c: e095 b.n 800de9a <etharp_find_entry+0x18a>
|
|
} else if (state != ETHARP_STATE_EMPTY) {
|
|
800dd6e: 7dfb ldrb r3, [r7, #23]
|
|
800dd70: 2b00 cmp r3, #0
|
|
800dd72: f000 8092 beq.w 800de9a <etharp_find_entry+0x18a>
|
|
LWIP_ASSERT("state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE",
|
|
800dd76: 7dfb ldrb r3, [r7, #23]
|
|
800dd78: 2b01 cmp r3, #1
|
|
800dd7a: d009 beq.n 800dd90 <etharp_find_entry+0x80>
|
|
800dd7c: 7dfb ldrb r3, [r7, #23]
|
|
800dd7e: 2b01 cmp r3, #1
|
|
800dd80: d806 bhi.n 800dd90 <etharp_find_entry+0x80>
|
|
800dd82: 4b99 ldr r3, [pc, #612] ; (800dfe8 <etharp_find_entry+0x2d8>)
|
|
800dd84: f240 1223 movw r2, #291 ; 0x123
|
|
800dd88: 4998 ldr r1, [pc, #608] ; (800dfec <etharp_find_entry+0x2dc>)
|
|
800dd8a: 4899 ldr r0, [pc, #612] ; (800dff0 <etharp_find_entry+0x2e0>)
|
|
800dd8c: f002 ff1c bl 8010bc8 <iprintf>
|
|
state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE);
|
|
/* if given, does IP address match IP address in ARP entry? */
|
|
if (ipaddr && ip4_addr_cmp(ipaddr, &arp_table[i].ipaddr)
|
|
800dd90: 68fb ldr r3, [r7, #12]
|
|
800dd92: 2b00 cmp r3, #0
|
|
800dd94: d020 beq.n 800ddd8 <etharp_find_entry+0xc8>
|
|
800dd96: 68fb ldr r3, [r7, #12]
|
|
800dd98: 6819 ldr r1, [r3, #0]
|
|
800dd9a: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800dd9e: 4891 ldr r0, [pc, #580] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800dda0: 4613 mov r3, r2
|
|
800dda2: 005b lsls r3, r3, #1
|
|
800dda4: 4413 add r3, r2
|
|
800dda6: 00db lsls r3, r3, #3
|
|
800dda8: 4403 add r3, r0
|
|
800ddaa: 3304 adds r3, #4
|
|
800ddac: 681b ldr r3, [r3, #0]
|
|
800ddae: 4299 cmp r1, r3
|
|
800ddb0: d112 bne.n 800ddd8 <etharp_find_entry+0xc8>
|
|
#if ETHARP_TABLE_MATCH_NETIF
|
|
&& ((netif == NULL) || (netif == arp_table[i].netif))
|
|
800ddb2: 687b ldr r3, [r7, #4]
|
|
800ddb4: 2b00 cmp r3, #0
|
|
800ddb6: d00c beq.n 800ddd2 <etharp_find_entry+0xc2>
|
|
800ddb8: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800ddbc: 4989 ldr r1, [pc, #548] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800ddbe: 4613 mov r3, r2
|
|
800ddc0: 005b lsls r3, r3, #1
|
|
800ddc2: 4413 add r3, r2
|
|
800ddc4: 00db lsls r3, r3, #3
|
|
800ddc6: 440b add r3, r1
|
|
800ddc8: 3308 adds r3, #8
|
|
800ddca: 681b ldr r3, [r3, #0]
|
|
800ddcc: 687a ldr r2, [r7, #4]
|
|
800ddce: 429a cmp r2, r3
|
|
800ddd0: d102 bne.n 800ddd8 <etharp_find_entry+0xc8>
|
|
#endif /* ETHARP_TABLE_MATCH_NETIF */
|
|
) {
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %d\n", (int)i));
|
|
/* found exact IP address match, simply bail out */
|
|
return i;
|
|
800ddd2: f9b7 3026 ldrsh.w r3, [r7, #38] ; 0x26
|
|
800ddd6: e100 b.n 800dfda <etharp_find_entry+0x2ca>
|
|
}
|
|
/* pending entry? */
|
|
if (state == ETHARP_STATE_PENDING) {
|
|
800ddd8: 7dfb ldrb r3, [r7, #23]
|
|
800ddda: 2b01 cmp r3, #1
|
|
800dddc: d140 bne.n 800de60 <etharp_find_entry+0x150>
|
|
/* pending with queued packets? */
|
|
if (arp_table[i].q != NULL) {
|
|
800ddde: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800dde2: 4980 ldr r1, [pc, #512] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800dde4: 4613 mov r3, r2
|
|
800dde6: 005b lsls r3, r3, #1
|
|
800dde8: 4413 add r3, r2
|
|
800ddea: 00db lsls r3, r3, #3
|
|
800ddec: 440b add r3, r1
|
|
800ddee: 681b ldr r3, [r3, #0]
|
|
800ddf0: 2b00 cmp r3, #0
|
|
800ddf2: d01a beq.n 800de2a <etharp_find_entry+0x11a>
|
|
if (arp_table[i].ctime >= age_queue) {
|
|
800ddf4: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800ddf8: 497a ldr r1, [pc, #488] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800ddfa: 4613 mov r3, r2
|
|
800ddfc: 005b lsls r3, r3, #1
|
|
800ddfe: 4413 add r3, r2
|
|
800de00: 00db lsls r3, r3, #3
|
|
800de02: 440b add r3, r1
|
|
800de04: 3312 adds r3, #18
|
|
800de06: 881b ldrh r3, [r3, #0]
|
|
800de08: 8bba ldrh r2, [r7, #28]
|
|
800de0a: 429a cmp r2, r3
|
|
800de0c: d845 bhi.n 800de9a <etharp_find_entry+0x18a>
|
|
old_queue = i;
|
|
800de0e: 8cfb ldrh r3, [r7, #38] ; 0x26
|
|
800de10: 83fb strh r3, [r7, #30]
|
|
age_queue = arp_table[i].ctime;
|
|
800de12: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800de16: 4973 ldr r1, [pc, #460] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800de18: 4613 mov r3, r2
|
|
800de1a: 005b lsls r3, r3, #1
|
|
800de1c: 4413 add r3, r2
|
|
800de1e: 00db lsls r3, r3, #3
|
|
800de20: 440b add r3, r1
|
|
800de22: 3312 adds r3, #18
|
|
800de24: 881b ldrh r3, [r3, #0]
|
|
800de26: 83bb strh r3, [r7, #28]
|
|
800de28: e037 b.n 800de9a <etharp_find_entry+0x18a>
|
|
}
|
|
} else
|
|
/* pending without queued packets? */
|
|
{
|
|
if (arp_table[i].ctime >= age_pending) {
|
|
800de2a: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800de2e: 496d ldr r1, [pc, #436] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800de30: 4613 mov r3, r2
|
|
800de32: 005b lsls r3, r3, #1
|
|
800de34: 4413 add r3, r2
|
|
800de36: 00db lsls r3, r3, #3
|
|
800de38: 440b add r3, r1
|
|
800de3a: 3312 adds r3, #18
|
|
800de3c: 881b ldrh r3, [r3, #0]
|
|
800de3e: 8b7a ldrh r2, [r7, #26]
|
|
800de40: 429a cmp r2, r3
|
|
800de42: d82a bhi.n 800de9a <etharp_find_entry+0x18a>
|
|
old_pending = i;
|
|
800de44: 8cfb ldrh r3, [r7, #38] ; 0x26
|
|
800de46: 843b strh r3, [r7, #32]
|
|
age_pending = arp_table[i].ctime;
|
|
800de48: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800de4c: 4965 ldr r1, [pc, #404] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800de4e: 4613 mov r3, r2
|
|
800de50: 005b lsls r3, r3, #1
|
|
800de52: 4413 add r3, r2
|
|
800de54: 00db lsls r3, r3, #3
|
|
800de56: 440b add r3, r1
|
|
800de58: 3312 adds r3, #18
|
|
800de5a: 881b ldrh r3, [r3, #0]
|
|
800de5c: 837b strh r3, [r7, #26]
|
|
800de5e: e01c b.n 800de9a <etharp_find_entry+0x18a>
|
|
}
|
|
}
|
|
/* stable entry? */
|
|
} else if (state >= ETHARP_STATE_STABLE) {
|
|
800de60: 7dfb ldrb r3, [r7, #23]
|
|
800de62: 2b01 cmp r3, #1
|
|
800de64: d919 bls.n 800de9a <etharp_find_entry+0x18a>
|
|
/* don't record old_stable for static entries since they never expire */
|
|
if (state < ETHARP_STATE_STATIC)
|
|
#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
|
|
{
|
|
/* remember entry with oldest stable entry in oldest, its age in maxtime */
|
|
if (arp_table[i].ctime >= age_stable) {
|
|
800de66: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800de6a: 495e ldr r1, [pc, #376] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800de6c: 4613 mov r3, r2
|
|
800de6e: 005b lsls r3, r3, #1
|
|
800de70: 4413 add r3, r2
|
|
800de72: 00db lsls r3, r3, #3
|
|
800de74: 440b add r3, r1
|
|
800de76: 3312 adds r3, #18
|
|
800de78: 881b ldrh r3, [r3, #0]
|
|
800de7a: 8b3a ldrh r2, [r7, #24]
|
|
800de7c: 429a cmp r2, r3
|
|
800de7e: d80c bhi.n 800de9a <etharp_find_entry+0x18a>
|
|
old_stable = i;
|
|
800de80: 8cfb ldrh r3, [r7, #38] ; 0x26
|
|
800de82: 847b strh r3, [r7, #34] ; 0x22
|
|
age_stable = arp_table[i].ctime;
|
|
800de84: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800de88: 4956 ldr r1, [pc, #344] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800de8a: 4613 mov r3, r2
|
|
800de8c: 005b lsls r3, r3, #1
|
|
800de8e: 4413 add r3, r2
|
|
800de90: 00db lsls r3, r3, #3
|
|
800de92: 440b add r3, r1
|
|
800de94: 3312 adds r3, #18
|
|
800de96: 881b ldrh r3, [r3, #0]
|
|
800de98: 833b strh r3, [r7, #24]
|
|
for (i = 0; i < ARP_TABLE_SIZE; ++i) {
|
|
800de9a: 8cfb ldrh r3, [r7, #38] ; 0x26
|
|
800de9c: 3301 adds r3, #1
|
|
800de9e: b29b uxth r3, r3
|
|
800dea0: 84fb strh r3, [r7, #38] ; 0x26
|
|
800dea2: f9b7 3026 ldrsh.w r3, [r7, #38] ; 0x26
|
|
800dea6: 2b09 cmp r3, #9
|
|
800dea8: f77f af4c ble.w 800dd44 <etharp_find_entry+0x34>
|
|
}
|
|
}
|
|
/* { we have no match } => try to create a new entry */
|
|
|
|
/* don't create new entry, only search? */
|
|
if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||
|
|
800deac: 7afb ldrb r3, [r7, #11]
|
|
800deae: f003 0302 and.w r3, r3, #2
|
|
800deb2: 2b00 cmp r3, #0
|
|
800deb4: d108 bne.n 800dec8 <etharp_find_entry+0x1b8>
|
|
800deb6: f9b7 3024 ldrsh.w r3, [r7, #36] ; 0x24
|
|
800deba: 2b0a cmp r3, #10
|
|
800debc: d107 bne.n 800dece <etharp_find_entry+0x1be>
|
|
/* or no empty entry found and not allowed to recycle? */
|
|
((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {
|
|
800debe: 7afb ldrb r3, [r7, #11]
|
|
800dec0: f003 0301 and.w r3, r3, #1
|
|
800dec4: 2b00 cmp r3, #0
|
|
800dec6: d102 bne.n 800dece <etharp_find_entry+0x1be>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty entry found and not allowed to recycle\n"));
|
|
return (s16_t)ERR_MEM;
|
|
800dec8: f04f 33ff mov.w r3, #4294967295
|
|
800decc: e085 b.n 800dfda <etharp_find_entry+0x2ca>
|
|
*
|
|
* { ETHARP_FLAG_TRY_HARD is set at this point }
|
|
*/
|
|
|
|
/* 1) empty entry available? */
|
|
if (empty < ARP_TABLE_SIZE) {
|
|
800dece: f9b7 3024 ldrsh.w r3, [r7, #36] ; 0x24
|
|
800ded2: 2b09 cmp r3, #9
|
|
800ded4: dc02 bgt.n 800dedc <etharp_find_entry+0x1cc>
|
|
i = empty;
|
|
800ded6: 8cbb ldrh r3, [r7, #36] ; 0x24
|
|
800ded8: 84fb strh r3, [r7, #38] ; 0x26
|
|
800deda: e039 b.n 800df50 <etharp_find_entry+0x240>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %d\n", (int)i));
|
|
} else {
|
|
/* 2) found recyclable stable entry? */
|
|
if (old_stable < ARP_TABLE_SIZE) {
|
|
800dedc: f9b7 3022 ldrsh.w r3, [r7, #34] ; 0x22
|
|
800dee0: 2b09 cmp r3, #9
|
|
800dee2: dc14 bgt.n 800df0e <etharp_find_entry+0x1fe>
|
|
/* recycle oldest stable*/
|
|
i = old_stable;
|
|
800dee4: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800dee6: 84fb strh r3, [r7, #38] ; 0x26
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %d\n", (int)i));
|
|
/* no queued packets should exist on stable entries */
|
|
LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL);
|
|
800dee8: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800deec: 493d ldr r1, [pc, #244] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800deee: 4613 mov r3, r2
|
|
800def0: 005b lsls r3, r3, #1
|
|
800def2: 4413 add r3, r2
|
|
800def4: 00db lsls r3, r3, #3
|
|
800def6: 440b add r3, r1
|
|
800def8: 681b ldr r3, [r3, #0]
|
|
800defa: 2b00 cmp r3, #0
|
|
800defc: d018 beq.n 800df30 <etharp_find_entry+0x220>
|
|
800defe: 4b3a ldr r3, [pc, #232] ; (800dfe8 <etharp_find_entry+0x2d8>)
|
|
800df00: f240 126d movw r2, #365 ; 0x16d
|
|
800df04: 493b ldr r1, [pc, #236] ; (800dff4 <etharp_find_entry+0x2e4>)
|
|
800df06: 483a ldr r0, [pc, #232] ; (800dff0 <etharp_find_entry+0x2e0>)
|
|
800df08: f002 fe5e bl 8010bc8 <iprintf>
|
|
800df0c: e010 b.n 800df30 <etharp_find_entry+0x220>
|
|
/* 3) found recyclable pending entry without queued packets? */
|
|
} else if (old_pending < ARP_TABLE_SIZE) {
|
|
800df0e: f9b7 3020 ldrsh.w r3, [r7, #32]
|
|
800df12: 2b09 cmp r3, #9
|
|
800df14: dc02 bgt.n 800df1c <etharp_find_entry+0x20c>
|
|
/* recycle oldest pending */
|
|
i = old_pending;
|
|
800df16: 8c3b ldrh r3, [r7, #32]
|
|
800df18: 84fb strh r3, [r7, #38] ; 0x26
|
|
800df1a: e009 b.n 800df30 <etharp_find_entry+0x220>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %d (without queue)\n", (int)i));
|
|
/* 4) found recyclable pending entry with queued packets? */
|
|
} else if (old_queue < ARP_TABLE_SIZE) {
|
|
800df1c: f9b7 301e ldrsh.w r3, [r7, #30]
|
|
800df20: 2b09 cmp r3, #9
|
|
800df22: dc02 bgt.n 800df2a <etharp_find_entry+0x21a>
|
|
/* recycle oldest pending (queued packets are free in etharp_free_entry) */
|
|
i = old_queue;
|
|
800df24: 8bfb ldrh r3, [r7, #30]
|
|
800df26: 84fb strh r3, [r7, #38] ; 0x26
|
|
800df28: e002 b.n 800df30 <etharp_find_entry+0x220>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %d, freeing packet queue %p\n", (int)i, (void *)(arp_table[i].q)));
|
|
/* no empty or recyclable entries found */
|
|
} else {
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty or recyclable entries found\n"));
|
|
return (s16_t)ERR_MEM;
|
|
800df2a: f04f 33ff mov.w r3, #4294967295
|
|
800df2e: e054 b.n 800dfda <etharp_find_entry+0x2ca>
|
|
}
|
|
|
|
/* { empty or recyclable entry found } */
|
|
LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
|
|
800df30: f9b7 3026 ldrsh.w r3, [r7, #38] ; 0x26
|
|
800df34: 2b09 cmp r3, #9
|
|
800df36: dd06 ble.n 800df46 <etharp_find_entry+0x236>
|
|
800df38: 4b2b ldr r3, [pc, #172] ; (800dfe8 <etharp_find_entry+0x2d8>)
|
|
800df3a: f240 127f movw r2, #383 ; 0x17f
|
|
800df3e: 492e ldr r1, [pc, #184] ; (800dff8 <etharp_find_entry+0x2e8>)
|
|
800df40: 482b ldr r0, [pc, #172] ; (800dff0 <etharp_find_entry+0x2e0>)
|
|
800df42: f002 fe41 bl 8010bc8 <iprintf>
|
|
etharp_free_entry(i);
|
|
800df46: f9b7 3026 ldrsh.w r3, [r7, #38] ; 0x26
|
|
800df4a: 4618 mov r0, r3
|
|
800df4c: f7ff fdd8 bl 800db00 <etharp_free_entry>
|
|
}
|
|
|
|
LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
|
|
800df50: f9b7 3026 ldrsh.w r3, [r7, #38] ; 0x26
|
|
800df54: 2b09 cmp r3, #9
|
|
800df56: dd06 ble.n 800df66 <etharp_find_entry+0x256>
|
|
800df58: 4b23 ldr r3, [pc, #140] ; (800dfe8 <etharp_find_entry+0x2d8>)
|
|
800df5a: f240 1283 movw r2, #387 ; 0x183
|
|
800df5e: 4926 ldr r1, [pc, #152] ; (800dff8 <etharp_find_entry+0x2e8>)
|
|
800df60: 4823 ldr r0, [pc, #140] ; (800dff0 <etharp_find_entry+0x2e0>)
|
|
800df62: f002 fe31 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("arp_table[i].state == ETHARP_STATE_EMPTY",
|
|
800df66: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800df6a: 491e ldr r1, [pc, #120] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800df6c: 4613 mov r3, r2
|
|
800df6e: 005b lsls r3, r3, #1
|
|
800df70: 4413 add r3, r2
|
|
800df72: 00db lsls r3, r3, #3
|
|
800df74: 440b add r3, r1
|
|
800df76: 3314 adds r3, #20
|
|
800df78: 781b ldrb r3, [r3, #0]
|
|
800df7a: 2b00 cmp r3, #0
|
|
800df7c: d006 beq.n 800df8c <etharp_find_entry+0x27c>
|
|
800df7e: 4b1a ldr r3, [pc, #104] ; (800dfe8 <etharp_find_entry+0x2d8>)
|
|
800df80: f44f 72c2 mov.w r2, #388 ; 0x184
|
|
800df84: 491d ldr r1, [pc, #116] ; (800dffc <etharp_find_entry+0x2ec>)
|
|
800df86: 481a ldr r0, [pc, #104] ; (800dff0 <etharp_find_entry+0x2e0>)
|
|
800df88: f002 fe1e bl 8010bc8 <iprintf>
|
|
arp_table[i].state == ETHARP_STATE_EMPTY);
|
|
|
|
/* IP address given? */
|
|
if (ipaddr != NULL) {
|
|
800df8c: 68fb ldr r3, [r7, #12]
|
|
800df8e: 2b00 cmp r3, #0
|
|
800df90: d00b beq.n 800dfaa <etharp_find_entry+0x29a>
|
|
/* set IP address */
|
|
ip4_addr_copy(arp_table[i].ipaddr, *ipaddr);
|
|
800df92: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800df96: 68fb ldr r3, [r7, #12]
|
|
800df98: 6819 ldr r1, [r3, #0]
|
|
800df9a: 4812 ldr r0, [pc, #72] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800df9c: 4613 mov r3, r2
|
|
800df9e: 005b lsls r3, r3, #1
|
|
800dfa0: 4413 add r3, r2
|
|
800dfa2: 00db lsls r3, r3, #3
|
|
800dfa4: 4403 add r3, r0
|
|
800dfa6: 3304 adds r3, #4
|
|
800dfa8: 6019 str r1, [r3, #0]
|
|
}
|
|
arp_table[i].ctime = 0;
|
|
800dfaa: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800dfae: 490d ldr r1, [pc, #52] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800dfb0: 4613 mov r3, r2
|
|
800dfb2: 005b lsls r3, r3, #1
|
|
800dfb4: 4413 add r3, r2
|
|
800dfb6: 00db lsls r3, r3, #3
|
|
800dfb8: 440b add r3, r1
|
|
800dfba: 3312 adds r3, #18
|
|
800dfbc: 2200 movs r2, #0
|
|
800dfbe: 801a strh r2, [r3, #0]
|
|
#if ETHARP_TABLE_MATCH_NETIF
|
|
arp_table[i].netif = netif;
|
|
800dfc0: f9b7 2026 ldrsh.w r2, [r7, #38] ; 0x26
|
|
800dfc4: 4907 ldr r1, [pc, #28] ; (800dfe4 <etharp_find_entry+0x2d4>)
|
|
800dfc6: 4613 mov r3, r2
|
|
800dfc8: 005b lsls r3, r3, #1
|
|
800dfca: 4413 add r3, r2
|
|
800dfcc: 00db lsls r3, r3, #3
|
|
800dfce: 440b add r3, r1
|
|
800dfd0: 3308 adds r3, #8
|
|
800dfd2: 687a ldr r2, [r7, #4]
|
|
800dfd4: 601a str r2, [r3, #0]
|
|
#endif /* ETHARP_TABLE_MATCH_NETIF */
|
|
return (s16_t)i;
|
|
800dfd6: f9b7 3026 ldrsh.w r3, [r7, #38] ; 0x26
|
|
}
|
|
800dfda: 4618 mov r0, r3
|
|
800dfdc: 3728 adds r7, #40 ; 0x28
|
|
800dfde: 46bd mov sp, r7
|
|
800dfe0: bd80 pop {r7, pc}
|
|
800dfe2: bf00 nop
|
|
800dfe4: 24007bd0 .word 0x24007bd0
|
|
800dfe8: 080142dc .word 0x080142dc
|
|
800dfec: 08014314 .word 0x08014314
|
|
800dff0: 08014354 .word 0x08014354
|
|
800dff4: 0801437c .word 0x0801437c
|
|
800dff8: 08014394 .word 0x08014394
|
|
800dffc: 080143a8 .word 0x080143a8
|
|
|
|
0800e000 <etharp_update_arp_entry>:
|
|
*
|
|
* @see pbuf_free()
|
|
*/
|
|
static err_t
|
|
etharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags)
|
|
{
|
|
800e000: b580 push {r7, lr}
|
|
800e002: b088 sub sp, #32
|
|
800e004: af02 add r7, sp, #8
|
|
800e006: 60f8 str r0, [r7, #12]
|
|
800e008: 60b9 str r1, [r7, #8]
|
|
800e00a: 607a str r2, [r7, #4]
|
|
800e00c: 70fb strb r3, [r7, #3]
|
|
s16_t i;
|
|
LWIP_ASSERT("netif->hwaddr_len == ETH_HWADDR_LEN", netif->hwaddr_len == ETH_HWADDR_LEN);
|
|
800e00e: 68fb ldr r3, [r7, #12]
|
|
800e010: f893 302c ldrb.w r3, [r3, #44] ; 0x2c
|
|
800e014: 2b06 cmp r3, #6
|
|
800e016: d006 beq.n 800e026 <etharp_update_arp_entry+0x26>
|
|
800e018: 4b48 ldr r3, [pc, #288] ; (800e13c <etharp_update_arp_entry+0x13c>)
|
|
800e01a: f240 12a9 movw r2, #425 ; 0x1a9
|
|
800e01e: 4948 ldr r1, [pc, #288] ; (800e140 <etharp_update_arp_entry+0x140>)
|
|
800e020: 4848 ldr r0, [pc, #288] ; (800e144 <etharp_update_arp_entry+0x144>)
|
|
800e022: f002 fdd1 bl 8010bc8 <iprintf>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n",
|
|
ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
|
|
(u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2],
|
|
(u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5]));
|
|
/* non-unicast address? */
|
|
if (ip4_addr_isany(ipaddr) ||
|
|
800e026: 68bb ldr r3, [r7, #8]
|
|
800e028: 2b00 cmp r3, #0
|
|
800e02a: d012 beq.n 800e052 <etharp_update_arp_entry+0x52>
|
|
800e02c: 68bb ldr r3, [r7, #8]
|
|
800e02e: 681b ldr r3, [r3, #0]
|
|
800e030: 2b00 cmp r3, #0
|
|
800e032: d00e beq.n 800e052 <etharp_update_arp_entry+0x52>
|
|
ip4_addr_isbroadcast(ipaddr, netif) ||
|
|
800e034: 68bb ldr r3, [r7, #8]
|
|
800e036: 681b ldr r3, [r3, #0]
|
|
800e038: 68f9 ldr r1, [r7, #12]
|
|
800e03a: 4618 mov r0, r3
|
|
800e03c: f001 f9ba bl 800f3b4 <ip4_addr_isbroadcast_u32>
|
|
800e040: 4603 mov r3, r0
|
|
if (ip4_addr_isany(ipaddr) ||
|
|
800e042: 2b00 cmp r3, #0
|
|
800e044: d105 bne.n 800e052 <etharp_update_arp_entry+0x52>
|
|
ip4_addr_ismulticast(ipaddr)) {
|
|
800e046: 68bb ldr r3, [r7, #8]
|
|
800e048: 681b ldr r3, [r3, #0]
|
|
800e04a: f003 03f0 and.w r3, r3, #240 ; 0xf0
|
|
ip4_addr_isbroadcast(ipaddr, netif) ||
|
|
800e04e: 2be0 cmp r3, #224 ; 0xe0
|
|
800e050: d102 bne.n 800e058 <etharp_update_arp_entry+0x58>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: will not add non-unicast IP address to ARP cache\n"));
|
|
return ERR_ARG;
|
|
800e052: f06f 030f mvn.w r3, #15
|
|
800e056: e06c b.n 800e132 <etharp_update_arp_entry+0x132>
|
|
}
|
|
/* find or create ARP entry */
|
|
i = etharp_find_entry(ipaddr, flags, netif);
|
|
800e058: 78fb ldrb r3, [r7, #3]
|
|
800e05a: 68fa ldr r2, [r7, #12]
|
|
800e05c: 4619 mov r1, r3
|
|
800e05e: 68b8 ldr r0, [r7, #8]
|
|
800e060: f7ff fe56 bl 800dd10 <etharp_find_entry>
|
|
800e064: 4603 mov r3, r0
|
|
800e066: 82fb strh r3, [r7, #22]
|
|
/* bail out if no entry could be found */
|
|
if (i < 0) {
|
|
800e068: f9b7 3016 ldrsh.w r3, [r7, #22]
|
|
800e06c: 2b00 cmp r3, #0
|
|
800e06e: da02 bge.n 800e076 <etharp_update_arp_entry+0x76>
|
|
return (err_t)i;
|
|
800e070: 8afb ldrh r3, [r7, #22]
|
|
800e072: b25b sxtb r3, r3
|
|
800e074: e05d b.n 800e132 <etharp_update_arp_entry+0x132>
|
|
return ERR_VAL;
|
|
} else
|
|
#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
|
|
{
|
|
/* mark it stable */
|
|
arp_table[i].state = ETHARP_STATE_STABLE;
|
|
800e076: f9b7 2016 ldrsh.w r2, [r7, #22]
|
|
800e07a: 4933 ldr r1, [pc, #204] ; (800e148 <etharp_update_arp_entry+0x148>)
|
|
800e07c: 4613 mov r3, r2
|
|
800e07e: 005b lsls r3, r3, #1
|
|
800e080: 4413 add r3, r2
|
|
800e082: 00db lsls r3, r3, #3
|
|
800e084: 440b add r3, r1
|
|
800e086: 3314 adds r3, #20
|
|
800e088: 2202 movs r2, #2
|
|
800e08a: 701a strb r2, [r3, #0]
|
|
}
|
|
|
|
/* record network interface */
|
|
arp_table[i].netif = netif;
|
|
800e08c: f9b7 2016 ldrsh.w r2, [r7, #22]
|
|
800e090: 492d ldr r1, [pc, #180] ; (800e148 <etharp_update_arp_entry+0x148>)
|
|
800e092: 4613 mov r3, r2
|
|
800e094: 005b lsls r3, r3, #1
|
|
800e096: 4413 add r3, r2
|
|
800e098: 00db lsls r3, r3, #3
|
|
800e09a: 440b add r3, r1
|
|
800e09c: 3308 adds r3, #8
|
|
800e09e: 68fa ldr r2, [r7, #12]
|
|
800e0a0: 601a str r2, [r3, #0]
|
|
/* insert in SNMP ARP index tree */
|
|
mib2_add_arp_entry(netif, &arp_table[i].ipaddr);
|
|
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", i));
|
|
/* update address */
|
|
SMEMCPY(&arp_table[i].ethaddr, ethaddr, ETH_HWADDR_LEN);
|
|
800e0a2: f9b7 2016 ldrsh.w r2, [r7, #22]
|
|
800e0a6: 4613 mov r3, r2
|
|
800e0a8: 005b lsls r3, r3, #1
|
|
800e0aa: 4413 add r3, r2
|
|
800e0ac: 00db lsls r3, r3, #3
|
|
800e0ae: 3308 adds r3, #8
|
|
800e0b0: 4a25 ldr r2, [pc, #148] ; (800e148 <etharp_update_arp_entry+0x148>)
|
|
800e0b2: 4413 add r3, r2
|
|
800e0b4: 3304 adds r3, #4
|
|
800e0b6: 2206 movs r2, #6
|
|
800e0b8: 6879 ldr r1, [r7, #4]
|
|
800e0ba: 4618 mov r0, r3
|
|
800e0bc: f002 ff65 bl 8010f8a <memcpy>
|
|
/* reset time stamp */
|
|
arp_table[i].ctime = 0;
|
|
800e0c0: f9b7 2016 ldrsh.w r2, [r7, #22]
|
|
800e0c4: 4920 ldr r1, [pc, #128] ; (800e148 <etharp_update_arp_entry+0x148>)
|
|
800e0c6: 4613 mov r3, r2
|
|
800e0c8: 005b lsls r3, r3, #1
|
|
800e0ca: 4413 add r3, r2
|
|
800e0cc: 00db lsls r3, r3, #3
|
|
800e0ce: 440b add r3, r1
|
|
800e0d0: 3312 adds r3, #18
|
|
800e0d2: 2200 movs r2, #0
|
|
800e0d4: 801a strh r2, [r3, #0]
|
|
/* get the packet pointer */
|
|
p = q->p;
|
|
/* now queue entry can be freed */
|
|
memp_free(MEMP_ARP_QUEUE, q);
|
|
#else /* ARP_QUEUEING */
|
|
if (arp_table[i].q != NULL) {
|
|
800e0d6: f9b7 2016 ldrsh.w r2, [r7, #22]
|
|
800e0da: 491b ldr r1, [pc, #108] ; (800e148 <etharp_update_arp_entry+0x148>)
|
|
800e0dc: 4613 mov r3, r2
|
|
800e0de: 005b lsls r3, r3, #1
|
|
800e0e0: 4413 add r3, r2
|
|
800e0e2: 00db lsls r3, r3, #3
|
|
800e0e4: 440b add r3, r1
|
|
800e0e6: 681b ldr r3, [r3, #0]
|
|
800e0e8: 2b00 cmp r3, #0
|
|
800e0ea: d021 beq.n 800e130 <etharp_update_arp_entry+0x130>
|
|
struct pbuf *p = arp_table[i].q;
|
|
800e0ec: f9b7 2016 ldrsh.w r2, [r7, #22]
|
|
800e0f0: 4915 ldr r1, [pc, #84] ; (800e148 <etharp_update_arp_entry+0x148>)
|
|
800e0f2: 4613 mov r3, r2
|
|
800e0f4: 005b lsls r3, r3, #1
|
|
800e0f6: 4413 add r3, r2
|
|
800e0f8: 00db lsls r3, r3, #3
|
|
800e0fa: 440b add r3, r1
|
|
800e0fc: 681b ldr r3, [r3, #0]
|
|
800e0fe: 613b str r3, [r7, #16]
|
|
arp_table[i].q = NULL;
|
|
800e100: f9b7 2016 ldrsh.w r2, [r7, #22]
|
|
800e104: 4910 ldr r1, [pc, #64] ; (800e148 <etharp_update_arp_entry+0x148>)
|
|
800e106: 4613 mov r3, r2
|
|
800e108: 005b lsls r3, r3, #1
|
|
800e10a: 4413 add r3, r2
|
|
800e10c: 00db lsls r3, r3, #3
|
|
800e10e: 440b add r3, r1
|
|
800e110: 2200 movs r2, #0
|
|
800e112: 601a str r2, [r3, #0]
|
|
#endif /* ARP_QUEUEING */
|
|
/* send the queued IP packet */
|
|
ethernet_output(netif, p, (struct eth_addr *)(netif->hwaddr), ethaddr, ETHTYPE_IP);
|
|
800e114: 68fb ldr r3, [r7, #12]
|
|
800e116: f103 0226 add.w r2, r3, #38 ; 0x26
|
|
800e11a: f44f 6300 mov.w r3, #2048 ; 0x800
|
|
800e11e: 9300 str r3, [sp, #0]
|
|
800e120: 687b ldr r3, [r7, #4]
|
|
800e122: 6939 ldr r1, [r7, #16]
|
|
800e124: 68f8 ldr r0, [r7, #12]
|
|
800e126: f002 f853 bl 80101d0 <ethernet_output>
|
|
/* free the queued IP packet */
|
|
pbuf_free(p);
|
|
800e12a: 6938 ldr r0, [r7, #16]
|
|
800e12c: f7f8 ff52 bl 8006fd4 <pbuf_free>
|
|
}
|
|
return ERR_OK;
|
|
800e130: 2300 movs r3, #0
|
|
}
|
|
800e132: 4618 mov r0, r3
|
|
800e134: 3718 adds r7, #24
|
|
800e136: 46bd mov sp, r7
|
|
800e138: bd80 pop {r7, pc}
|
|
800e13a: bf00 nop
|
|
800e13c: 080142dc .word 0x080142dc
|
|
800e140: 080143d4 .word 0x080143d4
|
|
800e144: 08014354 .word 0x08014354
|
|
800e148: 24007bd0 .word 0x24007bd0
|
|
|
|
0800e14c <etharp_cleanup_netif>:
|
|
*
|
|
* @param netif points to a network interface
|
|
*/
|
|
void
|
|
etharp_cleanup_netif(struct netif *netif)
|
|
{
|
|
800e14c: b580 push {r7, lr}
|
|
800e14e: b084 sub sp, #16
|
|
800e150: af00 add r7, sp, #0
|
|
800e152: 6078 str r0, [r7, #4]
|
|
int i;
|
|
|
|
for (i = 0; i < ARP_TABLE_SIZE; ++i) {
|
|
800e154: 2300 movs r3, #0
|
|
800e156: 60fb str r3, [r7, #12]
|
|
800e158: e01e b.n 800e198 <etharp_cleanup_netif+0x4c>
|
|
u8_t state = arp_table[i].state;
|
|
800e15a: 4913 ldr r1, [pc, #76] ; (800e1a8 <etharp_cleanup_netif+0x5c>)
|
|
800e15c: 68fa ldr r2, [r7, #12]
|
|
800e15e: 4613 mov r3, r2
|
|
800e160: 005b lsls r3, r3, #1
|
|
800e162: 4413 add r3, r2
|
|
800e164: 00db lsls r3, r3, #3
|
|
800e166: 440b add r3, r1
|
|
800e168: 3314 adds r3, #20
|
|
800e16a: 781b ldrb r3, [r3, #0]
|
|
800e16c: 72fb strb r3, [r7, #11]
|
|
if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {
|
|
800e16e: 7afb ldrb r3, [r7, #11]
|
|
800e170: 2b00 cmp r3, #0
|
|
800e172: d00e beq.n 800e192 <etharp_cleanup_netif+0x46>
|
|
800e174: 490c ldr r1, [pc, #48] ; (800e1a8 <etharp_cleanup_netif+0x5c>)
|
|
800e176: 68fa ldr r2, [r7, #12]
|
|
800e178: 4613 mov r3, r2
|
|
800e17a: 005b lsls r3, r3, #1
|
|
800e17c: 4413 add r3, r2
|
|
800e17e: 00db lsls r3, r3, #3
|
|
800e180: 440b add r3, r1
|
|
800e182: 3308 adds r3, #8
|
|
800e184: 681b ldr r3, [r3, #0]
|
|
800e186: 687a ldr r2, [r7, #4]
|
|
800e188: 429a cmp r2, r3
|
|
800e18a: d102 bne.n 800e192 <etharp_cleanup_netif+0x46>
|
|
etharp_free_entry(i);
|
|
800e18c: 68f8 ldr r0, [r7, #12]
|
|
800e18e: f7ff fcb7 bl 800db00 <etharp_free_entry>
|
|
for (i = 0; i < ARP_TABLE_SIZE; ++i) {
|
|
800e192: 68fb ldr r3, [r7, #12]
|
|
800e194: 3301 adds r3, #1
|
|
800e196: 60fb str r3, [r7, #12]
|
|
800e198: 68fb ldr r3, [r7, #12]
|
|
800e19a: 2b09 cmp r3, #9
|
|
800e19c: dddd ble.n 800e15a <etharp_cleanup_netif+0xe>
|
|
}
|
|
}
|
|
}
|
|
800e19e: bf00 nop
|
|
800e1a0: bf00 nop
|
|
800e1a2: 3710 adds r7, #16
|
|
800e1a4: 46bd mov sp, r7
|
|
800e1a6: bd80 pop {r7, pc}
|
|
800e1a8: 24007bd0 .word 0x24007bd0
|
|
|
|
0800e1ac <etharp_input>:
|
|
*
|
|
* @see pbuf_free()
|
|
*/
|
|
void
|
|
etharp_input(struct pbuf *p, struct netif *netif)
|
|
{
|
|
800e1ac: b5b0 push {r4, r5, r7, lr}
|
|
800e1ae: b08a sub sp, #40 ; 0x28
|
|
800e1b0: af04 add r7, sp, #16
|
|
800e1b2: 6078 str r0, [r7, #4]
|
|
800e1b4: 6039 str r1, [r7, #0]
|
|
ip4_addr_t sipaddr, dipaddr;
|
|
u8_t for_us;
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
LWIP_ERROR("netif != NULL", (netif != NULL), return;);
|
|
800e1b6: 683b ldr r3, [r7, #0]
|
|
800e1b8: 2b00 cmp r3, #0
|
|
800e1ba: d107 bne.n 800e1cc <etharp_input+0x20>
|
|
800e1bc: 4b3d ldr r3, [pc, #244] ; (800e2b4 <etharp_input+0x108>)
|
|
800e1be: f240 228a movw r2, #650 ; 0x28a
|
|
800e1c2: 493d ldr r1, [pc, #244] ; (800e2b8 <etharp_input+0x10c>)
|
|
800e1c4: 483d ldr r0, [pc, #244] ; (800e2bc <etharp_input+0x110>)
|
|
800e1c6: f002 fcff bl 8010bc8 <iprintf>
|
|
800e1ca: e06f b.n 800e2ac <etharp_input+0x100>
|
|
|
|
hdr = (struct etharp_hdr *)p->payload;
|
|
800e1cc: 687b ldr r3, [r7, #4]
|
|
800e1ce: 685b ldr r3, [r3, #4]
|
|
800e1d0: 617b str r3, [r7, #20]
|
|
|
|
/* RFC 826 "Packet Reception": */
|
|
if ((hdr->hwtype != PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET)) ||
|
|
800e1d2: 697b ldr r3, [r7, #20]
|
|
800e1d4: 881b ldrh r3, [r3, #0]
|
|
800e1d6: b29b uxth r3, r3
|
|
800e1d8: f5b3 7f80 cmp.w r3, #256 ; 0x100
|
|
800e1dc: d10c bne.n 800e1f8 <etharp_input+0x4c>
|
|
(hdr->hwlen != ETH_HWADDR_LEN) ||
|
|
800e1de: 697b ldr r3, [r7, #20]
|
|
800e1e0: 791b ldrb r3, [r3, #4]
|
|
if ((hdr->hwtype != PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET)) ||
|
|
800e1e2: 2b06 cmp r3, #6
|
|
800e1e4: d108 bne.n 800e1f8 <etharp_input+0x4c>
|
|
(hdr->protolen != sizeof(ip4_addr_t)) ||
|
|
800e1e6: 697b ldr r3, [r7, #20]
|
|
800e1e8: 795b ldrb r3, [r3, #5]
|
|
(hdr->hwlen != ETH_HWADDR_LEN) ||
|
|
800e1ea: 2b04 cmp r3, #4
|
|
800e1ec: d104 bne.n 800e1f8 <etharp_input+0x4c>
|
|
(hdr->proto != PP_HTONS(ETHTYPE_IP))) {
|
|
800e1ee: 697b ldr r3, [r7, #20]
|
|
800e1f0: 885b ldrh r3, [r3, #2]
|
|
800e1f2: b29b uxth r3, r3
|
|
(hdr->protolen != sizeof(ip4_addr_t)) ||
|
|
800e1f4: 2b08 cmp r3, #8
|
|
800e1f6: d003 beq.n 800e200 <etharp_input+0x54>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
|
|
("etharp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n",
|
|
hdr->hwtype, (u16_t)hdr->hwlen, hdr->proto, (u16_t)hdr->protolen));
|
|
ETHARP_STATS_INC(etharp.proterr);
|
|
ETHARP_STATS_INC(etharp.drop);
|
|
pbuf_free(p);
|
|
800e1f8: 6878 ldr r0, [r7, #4]
|
|
800e1fa: f7f8 feeb bl 8006fd4 <pbuf_free>
|
|
return;
|
|
800e1fe: e055 b.n 800e2ac <etharp_input+0x100>
|
|
autoip_arp_reply(netif, hdr);
|
|
#endif /* LWIP_AUTOIP */
|
|
|
|
/* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
|
|
* structure packing (not using structure copy which breaks strict-aliasing rules). */
|
|
IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr);
|
|
800e200: 697b ldr r3, [r7, #20]
|
|
800e202: 330e adds r3, #14
|
|
800e204: 681b ldr r3, [r3, #0]
|
|
800e206: 60fb str r3, [r7, #12]
|
|
IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr);
|
|
800e208: 697b ldr r3, [r7, #20]
|
|
800e20a: 3318 adds r3, #24
|
|
800e20c: 681b ldr r3, [r3, #0]
|
|
800e20e: 60bb str r3, [r7, #8]
|
|
|
|
/* this interface is not configured? */
|
|
if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {
|
|
800e210: 683b ldr r3, [r7, #0]
|
|
800e212: 3304 adds r3, #4
|
|
800e214: 681b ldr r3, [r3, #0]
|
|
800e216: 2b00 cmp r3, #0
|
|
800e218: d102 bne.n 800e220 <etharp_input+0x74>
|
|
for_us = 0;
|
|
800e21a: 2300 movs r3, #0
|
|
800e21c: 74fb strb r3, [r7, #19]
|
|
800e21e: e009 b.n 800e234 <etharp_input+0x88>
|
|
} else {
|
|
/* ARP packet directed to us? */
|
|
for_us = (u8_t)ip4_addr_cmp(&dipaddr, netif_ip4_addr(netif));
|
|
800e220: 68ba ldr r2, [r7, #8]
|
|
800e222: 683b ldr r3, [r7, #0]
|
|
800e224: 3304 adds r3, #4
|
|
800e226: 681b ldr r3, [r3, #0]
|
|
800e228: 429a cmp r2, r3
|
|
800e22a: bf0c ite eq
|
|
800e22c: 2301 moveq r3, #1
|
|
800e22e: 2300 movne r3, #0
|
|
800e230: b2db uxtb r3, r3
|
|
800e232: 74fb strb r3, [r7, #19]
|
|
/* ARP message directed to us?
|
|
-> add IP address in ARP cache; assume requester wants to talk to us,
|
|
can result in directly sending the queued packets for this host.
|
|
ARP message not directed to us?
|
|
-> update the source IP address in the cache, if present */
|
|
etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
|
|
800e234: 697b ldr r3, [r7, #20]
|
|
800e236: f103 0208 add.w r2, r3, #8
|
|
800e23a: 7cfb ldrb r3, [r7, #19]
|
|
800e23c: 2b00 cmp r3, #0
|
|
800e23e: d001 beq.n 800e244 <etharp_input+0x98>
|
|
800e240: 2301 movs r3, #1
|
|
800e242: e000 b.n 800e246 <etharp_input+0x9a>
|
|
800e244: 2302 movs r3, #2
|
|
800e246: f107 010c add.w r1, r7, #12
|
|
800e24a: 6838 ldr r0, [r7, #0]
|
|
800e24c: f7ff fed8 bl 800e000 <etharp_update_arp_entry>
|
|
for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY);
|
|
|
|
/* now act on the message itself */
|
|
switch (hdr->opcode) {
|
|
800e250: 697b ldr r3, [r7, #20]
|
|
800e252: 88db ldrh r3, [r3, #6]
|
|
800e254: b29b uxth r3, r3
|
|
800e256: f5b3 7f80 cmp.w r3, #256 ; 0x100
|
|
800e25a: d003 beq.n 800e264 <etharp_input+0xb8>
|
|
800e25c: f5b3 7f00 cmp.w r3, #512 ; 0x200
|
|
800e260: d01e beq.n 800e2a0 <etharp_input+0xf4>
|
|
#endif /* (LWIP_DHCP && DHCP_DOES_ARP_CHECK) */
|
|
break;
|
|
default:
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP unknown opcode type %"S16_F"\n", lwip_htons(hdr->opcode)));
|
|
ETHARP_STATS_INC(etharp.err);
|
|
break;
|
|
800e262: e020 b.n 800e2a6 <etharp_input+0xfa>
|
|
if (for_us) {
|
|
800e264: 7cfb ldrb r3, [r7, #19]
|
|
800e266: 2b00 cmp r3, #0
|
|
800e268: d01c beq.n 800e2a4 <etharp_input+0xf8>
|
|
(struct eth_addr *)netif->hwaddr, &hdr->shwaddr,
|
|
800e26a: 683b ldr r3, [r7, #0]
|
|
800e26c: f103 0026 add.w r0, r3, #38 ; 0x26
|
|
800e270: 697b ldr r3, [r7, #20]
|
|
800e272: f103 0408 add.w r4, r3, #8
|
|
(struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif),
|
|
800e276: 683b ldr r3, [r7, #0]
|
|
800e278: f103 0526 add.w r5, r3, #38 ; 0x26
|
|
800e27c: 683b ldr r3, [r7, #0]
|
|
800e27e: 3304 adds r3, #4
|
|
&hdr->shwaddr, &sipaddr,
|
|
800e280: 697a ldr r2, [r7, #20]
|
|
800e282: 3208 adds r2, #8
|
|
etharp_raw(netif,
|
|
800e284: 2102 movs r1, #2
|
|
800e286: 9103 str r1, [sp, #12]
|
|
800e288: f107 010c add.w r1, r7, #12
|
|
800e28c: 9102 str r1, [sp, #8]
|
|
800e28e: 9201 str r2, [sp, #4]
|
|
800e290: 9300 str r3, [sp, #0]
|
|
800e292: 462b mov r3, r5
|
|
800e294: 4622 mov r2, r4
|
|
800e296: 4601 mov r1, r0
|
|
800e298: 6838 ldr r0, [r7, #0]
|
|
800e29a: f000 faeb bl 800e874 <etharp_raw>
|
|
break;
|
|
800e29e: e001 b.n 800e2a4 <etharp_input+0xf8>
|
|
break;
|
|
800e2a0: bf00 nop
|
|
800e2a2: e000 b.n 800e2a6 <etharp_input+0xfa>
|
|
break;
|
|
800e2a4: bf00 nop
|
|
}
|
|
/* free ARP packet */
|
|
pbuf_free(p);
|
|
800e2a6: 6878 ldr r0, [r7, #4]
|
|
800e2a8: f7f8 fe94 bl 8006fd4 <pbuf_free>
|
|
}
|
|
800e2ac: 3718 adds r7, #24
|
|
800e2ae: 46bd mov sp, r7
|
|
800e2b0: bdb0 pop {r4, r5, r7, pc}
|
|
800e2b2: bf00 nop
|
|
800e2b4: 080142dc .word 0x080142dc
|
|
800e2b8: 0801442c .word 0x0801442c
|
|
800e2bc: 08014354 .word 0x08014354
|
|
|
|
0800e2c0 <etharp_output_to_arp_index>:
|
|
/** Just a small helper function that sends a pbuf to an ethernet address
|
|
* in the arp_table specified by the index 'arp_idx'.
|
|
*/
|
|
static err_t
|
|
etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, netif_addr_idx_t arp_idx)
|
|
{
|
|
800e2c0: b580 push {r7, lr}
|
|
800e2c2: b086 sub sp, #24
|
|
800e2c4: af02 add r7, sp, #8
|
|
800e2c6: 60f8 str r0, [r7, #12]
|
|
800e2c8: 60b9 str r1, [r7, #8]
|
|
800e2ca: 4613 mov r3, r2
|
|
800e2cc: 71fb strb r3, [r7, #7]
|
|
LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
|
|
800e2ce: 79fa ldrb r2, [r7, #7]
|
|
800e2d0: 4944 ldr r1, [pc, #272] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e2d2: 4613 mov r3, r2
|
|
800e2d4: 005b lsls r3, r3, #1
|
|
800e2d6: 4413 add r3, r2
|
|
800e2d8: 00db lsls r3, r3, #3
|
|
800e2da: 440b add r3, r1
|
|
800e2dc: 3314 adds r3, #20
|
|
800e2de: 781b ldrb r3, [r3, #0]
|
|
800e2e0: 2b01 cmp r3, #1
|
|
800e2e2: d806 bhi.n 800e2f2 <etharp_output_to_arp_index+0x32>
|
|
800e2e4: 4b40 ldr r3, [pc, #256] ; (800e3e8 <etharp_output_to_arp_index+0x128>)
|
|
800e2e6: f240 22ee movw r2, #750 ; 0x2ee
|
|
800e2ea: 4940 ldr r1, [pc, #256] ; (800e3ec <etharp_output_to_arp_index+0x12c>)
|
|
800e2ec: 4840 ldr r0, [pc, #256] ; (800e3f0 <etharp_output_to_arp_index+0x130>)
|
|
800e2ee: f002 fc6b bl 8010bc8 <iprintf>
|
|
arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
|
|
/* if arp table entry is about to expire: re-request it,
|
|
but only if its state is ETHARP_STATE_STABLE to prevent flooding the
|
|
network with ARP requests if this address is used frequently. */
|
|
if (arp_table[arp_idx].state == ETHARP_STATE_STABLE) {
|
|
800e2f2: 79fa ldrb r2, [r7, #7]
|
|
800e2f4: 493b ldr r1, [pc, #236] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e2f6: 4613 mov r3, r2
|
|
800e2f8: 005b lsls r3, r3, #1
|
|
800e2fa: 4413 add r3, r2
|
|
800e2fc: 00db lsls r3, r3, #3
|
|
800e2fe: 440b add r3, r1
|
|
800e300: 3314 adds r3, #20
|
|
800e302: 781b ldrb r3, [r3, #0]
|
|
800e304: 2b02 cmp r3, #2
|
|
800e306: d153 bne.n 800e3b0 <etharp_output_to_arp_index+0xf0>
|
|
if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_BROADCAST) {
|
|
800e308: 79fa ldrb r2, [r7, #7]
|
|
800e30a: 4936 ldr r1, [pc, #216] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e30c: 4613 mov r3, r2
|
|
800e30e: 005b lsls r3, r3, #1
|
|
800e310: 4413 add r3, r2
|
|
800e312: 00db lsls r3, r3, #3
|
|
800e314: 440b add r3, r1
|
|
800e316: 3312 adds r3, #18
|
|
800e318: 881b ldrh r3, [r3, #0]
|
|
800e31a: f5b3 7f8e cmp.w r3, #284 ; 0x11c
|
|
800e31e: d919 bls.n 800e354 <etharp_output_to_arp_index+0x94>
|
|
/* issue a standard request using broadcast */
|
|
if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {
|
|
800e320: 79fa ldrb r2, [r7, #7]
|
|
800e322: 4613 mov r3, r2
|
|
800e324: 005b lsls r3, r3, #1
|
|
800e326: 4413 add r3, r2
|
|
800e328: 00db lsls r3, r3, #3
|
|
800e32a: 4a2e ldr r2, [pc, #184] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e32c: 4413 add r3, r2
|
|
800e32e: 3304 adds r3, #4
|
|
800e330: 4619 mov r1, r3
|
|
800e332: 68f8 ldr r0, [r7, #12]
|
|
800e334: f000 fb4c bl 800e9d0 <etharp_request>
|
|
800e338: 4603 mov r3, r0
|
|
800e33a: 2b00 cmp r3, #0
|
|
800e33c: d138 bne.n 800e3b0 <etharp_output_to_arp_index+0xf0>
|
|
arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1;
|
|
800e33e: 79fa ldrb r2, [r7, #7]
|
|
800e340: 4928 ldr r1, [pc, #160] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e342: 4613 mov r3, r2
|
|
800e344: 005b lsls r3, r3, #1
|
|
800e346: 4413 add r3, r2
|
|
800e348: 00db lsls r3, r3, #3
|
|
800e34a: 440b add r3, r1
|
|
800e34c: 3314 adds r3, #20
|
|
800e34e: 2203 movs r2, #3
|
|
800e350: 701a strb r2, [r3, #0]
|
|
800e352: e02d b.n 800e3b0 <etharp_output_to_arp_index+0xf0>
|
|
}
|
|
} else if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_UNICAST) {
|
|
800e354: 79fa ldrb r2, [r7, #7]
|
|
800e356: 4923 ldr r1, [pc, #140] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e358: 4613 mov r3, r2
|
|
800e35a: 005b lsls r3, r3, #1
|
|
800e35c: 4413 add r3, r2
|
|
800e35e: 00db lsls r3, r3, #3
|
|
800e360: 440b add r3, r1
|
|
800e362: 3312 adds r3, #18
|
|
800e364: 881b ldrh r3, [r3, #0]
|
|
800e366: f5b3 7f87 cmp.w r3, #270 ; 0x10e
|
|
800e36a: d321 bcc.n 800e3b0 <etharp_output_to_arp_index+0xf0>
|
|
/* issue a unicast request (for 15 seconds) to prevent unnecessary broadcast */
|
|
if (etharp_request_dst(netif, &arp_table[arp_idx].ipaddr, &arp_table[arp_idx].ethaddr) == ERR_OK) {
|
|
800e36c: 79fa ldrb r2, [r7, #7]
|
|
800e36e: 4613 mov r3, r2
|
|
800e370: 005b lsls r3, r3, #1
|
|
800e372: 4413 add r3, r2
|
|
800e374: 00db lsls r3, r3, #3
|
|
800e376: 4a1b ldr r2, [pc, #108] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e378: 4413 add r3, r2
|
|
800e37a: 1d19 adds r1, r3, #4
|
|
800e37c: 79fa ldrb r2, [r7, #7]
|
|
800e37e: 4613 mov r3, r2
|
|
800e380: 005b lsls r3, r3, #1
|
|
800e382: 4413 add r3, r2
|
|
800e384: 00db lsls r3, r3, #3
|
|
800e386: 3308 adds r3, #8
|
|
800e388: 4a16 ldr r2, [pc, #88] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e38a: 4413 add r3, r2
|
|
800e38c: 3304 adds r3, #4
|
|
800e38e: 461a mov r2, r3
|
|
800e390: 68f8 ldr r0, [r7, #12]
|
|
800e392: f000 fafb bl 800e98c <etharp_request_dst>
|
|
800e396: 4603 mov r3, r0
|
|
800e398: 2b00 cmp r3, #0
|
|
800e39a: d109 bne.n 800e3b0 <etharp_output_to_arp_index+0xf0>
|
|
arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1;
|
|
800e39c: 79fa ldrb r2, [r7, #7]
|
|
800e39e: 4911 ldr r1, [pc, #68] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e3a0: 4613 mov r3, r2
|
|
800e3a2: 005b lsls r3, r3, #1
|
|
800e3a4: 4413 add r3, r2
|
|
800e3a6: 00db lsls r3, r3, #3
|
|
800e3a8: 440b add r3, r1
|
|
800e3aa: 3314 adds r3, #20
|
|
800e3ac: 2203 movs r2, #3
|
|
800e3ae: 701a strb r2, [r3, #0]
|
|
}
|
|
}
|
|
}
|
|
|
|
return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), &arp_table[arp_idx].ethaddr, ETHTYPE_IP);
|
|
800e3b0: 68fb ldr r3, [r7, #12]
|
|
800e3b2: f103 0126 add.w r1, r3, #38 ; 0x26
|
|
800e3b6: 79fa ldrb r2, [r7, #7]
|
|
800e3b8: 4613 mov r3, r2
|
|
800e3ba: 005b lsls r3, r3, #1
|
|
800e3bc: 4413 add r3, r2
|
|
800e3be: 00db lsls r3, r3, #3
|
|
800e3c0: 3308 adds r3, #8
|
|
800e3c2: 4a08 ldr r2, [pc, #32] ; (800e3e4 <etharp_output_to_arp_index+0x124>)
|
|
800e3c4: 4413 add r3, r2
|
|
800e3c6: 3304 adds r3, #4
|
|
800e3c8: f44f 6200 mov.w r2, #2048 ; 0x800
|
|
800e3cc: 9200 str r2, [sp, #0]
|
|
800e3ce: 460a mov r2, r1
|
|
800e3d0: 68b9 ldr r1, [r7, #8]
|
|
800e3d2: 68f8 ldr r0, [r7, #12]
|
|
800e3d4: f001 fefc bl 80101d0 <ethernet_output>
|
|
800e3d8: 4603 mov r3, r0
|
|
}
|
|
800e3da: 4618 mov r0, r3
|
|
800e3dc: 3710 adds r7, #16
|
|
800e3de: 46bd mov sp, r7
|
|
800e3e0: bd80 pop {r7, pc}
|
|
800e3e2: bf00 nop
|
|
800e3e4: 24007bd0 .word 0x24007bd0
|
|
800e3e8: 080142dc .word 0x080142dc
|
|
800e3ec: 0801444c .word 0x0801444c
|
|
800e3f0: 08014354 .word 0x08014354
|
|
|
|
0800e3f4 <etharp_output>:
|
|
* - ERR_RTE No route to destination (no gateway to external networks),
|
|
* or the return type of either etharp_query() or ethernet_output().
|
|
*/
|
|
err_t
|
|
etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr)
|
|
{
|
|
800e3f4: b580 push {r7, lr}
|
|
800e3f6: b08a sub sp, #40 ; 0x28
|
|
800e3f8: af02 add r7, sp, #8
|
|
800e3fa: 60f8 str r0, [r7, #12]
|
|
800e3fc: 60b9 str r1, [r7, #8]
|
|
800e3fe: 607a str r2, [r7, #4]
|
|
const struct eth_addr *dest;
|
|
struct eth_addr mcastaddr;
|
|
const ip4_addr_t *dst_addr = ipaddr;
|
|
800e400: 687b ldr r3, [r7, #4]
|
|
800e402: 61bb str r3, [r7, #24]
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
LWIP_ASSERT("netif != NULL", netif != NULL);
|
|
800e404: 68fb ldr r3, [r7, #12]
|
|
800e406: 2b00 cmp r3, #0
|
|
800e408: d106 bne.n 800e418 <etharp_output+0x24>
|
|
800e40a: 4b73 ldr r3, [pc, #460] ; (800e5d8 <etharp_output+0x1e4>)
|
|
800e40c: f240 321e movw r2, #798 ; 0x31e
|
|
800e410: 4972 ldr r1, [pc, #456] ; (800e5dc <etharp_output+0x1e8>)
|
|
800e412: 4873 ldr r0, [pc, #460] ; (800e5e0 <etharp_output+0x1ec>)
|
|
800e414: f002 fbd8 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("q != NULL", q != NULL);
|
|
800e418: 68bb ldr r3, [r7, #8]
|
|
800e41a: 2b00 cmp r3, #0
|
|
800e41c: d106 bne.n 800e42c <etharp_output+0x38>
|
|
800e41e: 4b6e ldr r3, [pc, #440] ; (800e5d8 <etharp_output+0x1e4>)
|
|
800e420: f240 321f movw r2, #799 ; 0x31f
|
|
800e424: 496f ldr r1, [pc, #444] ; (800e5e4 <etharp_output+0x1f0>)
|
|
800e426: 486e ldr r0, [pc, #440] ; (800e5e0 <etharp_output+0x1ec>)
|
|
800e428: f002 fbce bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
|
|
800e42c: 687b ldr r3, [r7, #4]
|
|
800e42e: 2b00 cmp r3, #0
|
|
800e430: d106 bne.n 800e440 <etharp_output+0x4c>
|
|
800e432: 4b69 ldr r3, [pc, #420] ; (800e5d8 <etharp_output+0x1e4>)
|
|
800e434: f44f 7248 mov.w r2, #800 ; 0x320
|
|
800e438: 496b ldr r1, [pc, #428] ; (800e5e8 <etharp_output+0x1f4>)
|
|
800e43a: 4869 ldr r0, [pc, #420] ; (800e5e0 <etharp_output+0x1ec>)
|
|
800e43c: f002 fbc4 bl 8010bc8 <iprintf>
|
|
|
|
/* Determine on destination hardware address. Broadcasts and multicasts
|
|
* are special, other IP addresses are looked up in the ARP table. */
|
|
|
|
/* broadcast destination IP address? */
|
|
if (ip4_addr_isbroadcast(ipaddr, netif)) {
|
|
800e440: 687b ldr r3, [r7, #4]
|
|
800e442: 681b ldr r3, [r3, #0]
|
|
800e444: 68f9 ldr r1, [r7, #12]
|
|
800e446: 4618 mov r0, r3
|
|
800e448: f000 ffb4 bl 800f3b4 <ip4_addr_isbroadcast_u32>
|
|
800e44c: 4603 mov r3, r0
|
|
800e44e: 2b00 cmp r3, #0
|
|
800e450: d002 beq.n 800e458 <etharp_output+0x64>
|
|
/* broadcast on Ethernet also */
|
|
dest = (const struct eth_addr *)ðbroadcast;
|
|
800e452: 4b66 ldr r3, [pc, #408] ; (800e5ec <etharp_output+0x1f8>)
|
|
800e454: 61fb str r3, [r7, #28]
|
|
800e456: e0af b.n 800e5b8 <etharp_output+0x1c4>
|
|
/* multicast destination IP address? */
|
|
} else if (ip4_addr_ismulticast(ipaddr)) {
|
|
800e458: 687b ldr r3, [r7, #4]
|
|
800e45a: 681b ldr r3, [r3, #0]
|
|
800e45c: f003 03f0 and.w r3, r3, #240 ; 0xf0
|
|
800e460: 2be0 cmp r3, #224 ; 0xe0
|
|
800e462: d118 bne.n 800e496 <etharp_output+0xa2>
|
|
/* Hash IP multicast address to MAC address.*/
|
|
mcastaddr.addr[0] = LL_IP4_MULTICAST_ADDR_0;
|
|
800e464: 2301 movs r3, #1
|
|
800e466: 743b strb r3, [r7, #16]
|
|
mcastaddr.addr[1] = LL_IP4_MULTICAST_ADDR_1;
|
|
800e468: 2300 movs r3, #0
|
|
800e46a: 747b strb r3, [r7, #17]
|
|
mcastaddr.addr[2] = LL_IP4_MULTICAST_ADDR_2;
|
|
800e46c: 235e movs r3, #94 ; 0x5e
|
|
800e46e: 74bb strb r3, [r7, #18]
|
|
mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
|
|
800e470: 687b ldr r3, [r7, #4]
|
|
800e472: 3301 adds r3, #1
|
|
800e474: 781b ldrb r3, [r3, #0]
|
|
800e476: f003 037f and.w r3, r3, #127 ; 0x7f
|
|
800e47a: b2db uxtb r3, r3
|
|
800e47c: 74fb strb r3, [r7, #19]
|
|
mcastaddr.addr[4] = ip4_addr3(ipaddr);
|
|
800e47e: 687b ldr r3, [r7, #4]
|
|
800e480: 3302 adds r3, #2
|
|
800e482: 781b ldrb r3, [r3, #0]
|
|
800e484: 753b strb r3, [r7, #20]
|
|
mcastaddr.addr[5] = ip4_addr4(ipaddr);
|
|
800e486: 687b ldr r3, [r7, #4]
|
|
800e488: 3303 adds r3, #3
|
|
800e48a: 781b ldrb r3, [r3, #0]
|
|
800e48c: 757b strb r3, [r7, #21]
|
|
/* destination Ethernet address is multicast */
|
|
dest = &mcastaddr;
|
|
800e48e: f107 0310 add.w r3, r7, #16
|
|
800e492: 61fb str r3, [r7, #28]
|
|
800e494: e090 b.n 800e5b8 <etharp_output+0x1c4>
|
|
/* unicast destination IP address? */
|
|
} else {
|
|
netif_addr_idx_t i;
|
|
/* outside local network? if so, this can neither be a global broadcast nor
|
|
a subnet broadcast. */
|
|
if (!ip4_addr_netcmp(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) &&
|
|
800e496: 687b ldr r3, [r7, #4]
|
|
800e498: 681a ldr r2, [r3, #0]
|
|
800e49a: 68fb ldr r3, [r7, #12]
|
|
800e49c: 3304 adds r3, #4
|
|
800e49e: 681b ldr r3, [r3, #0]
|
|
800e4a0: 405a eors r2, r3
|
|
800e4a2: 68fb ldr r3, [r7, #12]
|
|
800e4a4: 3308 adds r3, #8
|
|
800e4a6: 681b ldr r3, [r3, #0]
|
|
800e4a8: 4013 ands r3, r2
|
|
800e4aa: 2b00 cmp r3, #0
|
|
800e4ac: d012 beq.n 800e4d4 <etharp_output+0xe0>
|
|
!ip4_addr_islinklocal(ipaddr)) {
|
|
800e4ae: 687b ldr r3, [r7, #4]
|
|
800e4b0: 681b ldr r3, [r3, #0]
|
|
800e4b2: b29b uxth r3, r3
|
|
if (!ip4_addr_netcmp(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) &&
|
|
800e4b4: f64f 62a9 movw r2, #65193 ; 0xfea9
|
|
800e4b8: 4293 cmp r3, r2
|
|
800e4ba: d00b beq.n 800e4d4 <etharp_output+0xe0>
|
|
dst_addr = LWIP_HOOK_ETHARP_GET_GW(netif, ipaddr);
|
|
if (dst_addr == NULL)
|
|
#endif /* LWIP_HOOK_ETHARP_GET_GW */
|
|
{
|
|
/* interface has default gateway? */
|
|
if (!ip4_addr_isany_val(*netif_ip4_gw(netif))) {
|
|
800e4bc: 68fb ldr r3, [r7, #12]
|
|
800e4be: 330c adds r3, #12
|
|
800e4c0: 681b ldr r3, [r3, #0]
|
|
800e4c2: 2b00 cmp r3, #0
|
|
800e4c4: d003 beq.n 800e4ce <etharp_output+0xda>
|
|
/* send to hardware address of default gateway IP address */
|
|
dst_addr = netif_ip4_gw(netif);
|
|
800e4c6: 68fb ldr r3, [r7, #12]
|
|
800e4c8: 330c adds r3, #12
|
|
800e4ca: 61bb str r3, [r7, #24]
|
|
800e4cc: e002 b.n 800e4d4 <etharp_output+0xe0>
|
|
/* no default gateway available */
|
|
} else {
|
|
/* no route to destination error (default gateway missing) */
|
|
return ERR_RTE;
|
|
800e4ce: f06f 0303 mvn.w r3, #3
|
|
800e4d2: e07d b.n 800e5d0 <etharp_output+0x1dc>
|
|
if (netif->hints != NULL) {
|
|
/* per-pcb cached entry was given */
|
|
netif_addr_idx_t etharp_cached_entry = netif->hints->addr_hint;
|
|
if (etharp_cached_entry < ARP_TABLE_SIZE) {
|
|
#endif /* LWIP_NETIF_HWADDRHINT */
|
|
if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
|
|
800e4d4: 4b46 ldr r3, [pc, #280] ; (800e5f0 <etharp_output+0x1fc>)
|
|
800e4d6: 781b ldrb r3, [r3, #0]
|
|
800e4d8: 4619 mov r1, r3
|
|
800e4da: 4a46 ldr r2, [pc, #280] ; (800e5f4 <etharp_output+0x200>)
|
|
800e4dc: 460b mov r3, r1
|
|
800e4de: 005b lsls r3, r3, #1
|
|
800e4e0: 440b add r3, r1
|
|
800e4e2: 00db lsls r3, r3, #3
|
|
800e4e4: 4413 add r3, r2
|
|
800e4e6: 3314 adds r3, #20
|
|
800e4e8: 781b ldrb r3, [r3, #0]
|
|
800e4ea: 2b01 cmp r3, #1
|
|
800e4ec: d925 bls.n 800e53a <etharp_output+0x146>
|
|
#if ETHARP_TABLE_MATCH_NETIF
|
|
(arp_table[etharp_cached_entry].netif == netif) &&
|
|
800e4ee: 4b40 ldr r3, [pc, #256] ; (800e5f0 <etharp_output+0x1fc>)
|
|
800e4f0: 781b ldrb r3, [r3, #0]
|
|
800e4f2: 4619 mov r1, r3
|
|
800e4f4: 4a3f ldr r2, [pc, #252] ; (800e5f4 <etharp_output+0x200>)
|
|
800e4f6: 460b mov r3, r1
|
|
800e4f8: 005b lsls r3, r3, #1
|
|
800e4fa: 440b add r3, r1
|
|
800e4fc: 00db lsls r3, r3, #3
|
|
800e4fe: 4413 add r3, r2
|
|
800e500: 3308 adds r3, #8
|
|
800e502: 681b ldr r3, [r3, #0]
|
|
if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
|
|
800e504: 68fa ldr r2, [r7, #12]
|
|
800e506: 429a cmp r2, r3
|
|
800e508: d117 bne.n 800e53a <etharp_output+0x146>
|
|
#endif
|
|
(ip4_addr_cmp(dst_addr, &arp_table[etharp_cached_entry].ipaddr))) {
|
|
800e50a: 69bb ldr r3, [r7, #24]
|
|
800e50c: 681a ldr r2, [r3, #0]
|
|
800e50e: 4b38 ldr r3, [pc, #224] ; (800e5f0 <etharp_output+0x1fc>)
|
|
800e510: 781b ldrb r3, [r3, #0]
|
|
800e512: 4618 mov r0, r3
|
|
800e514: 4937 ldr r1, [pc, #220] ; (800e5f4 <etharp_output+0x200>)
|
|
800e516: 4603 mov r3, r0
|
|
800e518: 005b lsls r3, r3, #1
|
|
800e51a: 4403 add r3, r0
|
|
800e51c: 00db lsls r3, r3, #3
|
|
800e51e: 440b add r3, r1
|
|
800e520: 3304 adds r3, #4
|
|
800e522: 681b ldr r3, [r3, #0]
|
|
(arp_table[etharp_cached_entry].netif == netif) &&
|
|
800e524: 429a cmp r2, r3
|
|
800e526: d108 bne.n 800e53a <etharp_output+0x146>
|
|
/* the per-pcb-cached entry is stable and the right one! */
|
|
ETHARP_STATS_INC(etharp.cachehit);
|
|
return etharp_output_to_arp_index(netif, q, etharp_cached_entry);
|
|
800e528: 4b31 ldr r3, [pc, #196] ; (800e5f0 <etharp_output+0x1fc>)
|
|
800e52a: 781b ldrb r3, [r3, #0]
|
|
800e52c: 461a mov r2, r3
|
|
800e52e: 68b9 ldr r1, [r7, #8]
|
|
800e530: 68f8 ldr r0, [r7, #12]
|
|
800e532: f7ff fec5 bl 800e2c0 <etharp_output_to_arp_index>
|
|
800e536: 4603 mov r3, r0
|
|
800e538: e04a b.n 800e5d0 <etharp_output+0x1dc>
|
|
}
|
|
#endif /* LWIP_NETIF_HWADDRHINT */
|
|
|
|
/* find stable entry: do this here since this is a critical path for
|
|
throughput and etharp_find_entry() is kind of slow */
|
|
for (i = 0; i < ARP_TABLE_SIZE; i++) {
|
|
800e53a: 2300 movs r3, #0
|
|
800e53c: 75fb strb r3, [r7, #23]
|
|
800e53e: e031 b.n 800e5a4 <etharp_output+0x1b0>
|
|
if ((arp_table[i].state >= ETHARP_STATE_STABLE) &&
|
|
800e540: 7dfa ldrb r2, [r7, #23]
|
|
800e542: 492c ldr r1, [pc, #176] ; (800e5f4 <etharp_output+0x200>)
|
|
800e544: 4613 mov r3, r2
|
|
800e546: 005b lsls r3, r3, #1
|
|
800e548: 4413 add r3, r2
|
|
800e54a: 00db lsls r3, r3, #3
|
|
800e54c: 440b add r3, r1
|
|
800e54e: 3314 adds r3, #20
|
|
800e550: 781b ldrb r3, [r3, #0]
|
|
800e552: 2b01 cmp r3, #1
|
|
800e554: d923 bls.n 800e59e <etharp_output+0x1aa>
|
|
#if ETHARP_TABLE_MATCH_NETIF
|
|
(arp_table[i].netif == netif) &&
|
|
800e556: 7dfa ldrb r2, [r7, #23]
|
|
800e558: 4926 ldr r1, [pc, #152] ; (800e5f4 <etharp_output+0x200>)
|
|
800e55a: 4613 mov r3, r2
|
|
800e55c: 005b lsls r3, r3, #1
|
|
800e55e: 4413 add r3, r2
|
|
800e560: 00db lsls r3, r3, #3
|
|
800e562: 440b add r3, r1
|
|
800e564: 3308 adds r3, #8
|
|
800e566: 681b ldr r3, [r3, #0]
|
|
if ((arp_table[i].state >= ETHARP_STATE_STABLE) &&
|
|
800e568: 68fa ldr r2, [r7, #12]
|
|
800e56a: 429a cmp r2, r3
|
|
800e56c: d117 bne.n 800e59e <etharp_output+0x1aa>
|
|
#endif
|
|
(ip4_addr_cmp(dst_addr, &arp_table[i].ipaddr))) {
|
|
800e56e: 69bb ldr r3, [r7, #24]
|
|
800e570: 6819 ldr r1, [r3, #0]
|
|
800e572: 7dfa ldrb r2, [r7, #23]
|
|
800e574: 481f ldr r0, [pc, #124] ; (800e5f4 <etharp_output+0x200>)
|
|
800e576: 4613 mov r3, r2
|
|
800e578: 005b lsls r3, r3, #1
|
|
800e57a: 4413 add r3, r2
|
|
800e57c: 00db lsls r3, r3, #3
|
|
800e57e: 4403 add r3, r0
|
|
800e580: 3304 adds r3, #4
|
|
800e582: 681b ldr r3, [r3, #0]
|
|
(arp_table[i].netif == netif) &&
|
|
800e584: 4299 cmp r1, r3
|
|
800e586: d10a bne.n 800e59e <etharp_output+0x1aa>
|
|
/* found an existing, stable entry */
|
|
ETHARP_SET_ADDRHINT(netif, i);
|
|
800e588: 4a19 ldr r2, [pc, #100] ; (800e5f0 <etharp_output+0x1fc>)
|
|
800e58a: 7dfb ldrb r3, [r7, #23]
|
|
800e58c: 7013 strb r3, [r2, #0]
|
|
return etharp_output_to_arp_index(netif, q, i);
|
|
800e58e: 7dfb ldrb r3, [r7, #23]
|
|
800e590: 461a mov r2, r3
|
|
800e592: 68b9 ldr r1, [r7, #8]
|
|
800e594: 68f8 ldr r0, [r7, #12]
|
|
800e596: f7ff fe93 bl 800e2c0 <etharp_output_to_arp_index>
|
|
800e59a: 4603 mov r3, r0
|
|
800e59c: e018 b.n 800e5d0 <etharp_output+0x1dc>
|
|
for (i = 0; i < ARP_TABLE_SIZE; i++) {
|
|
800e59e: 7dfb ldrb r3, [r7, #23]
|
|
800e5a0: 3301 adds r3, #1
|
|
800e5a2: 75fb strb r3, [r7, #23]
|
|
800e5a4: 7dfb ldrb r3, [r7, #23]
|
|
800e5a6: 2b09 cmp r3, #9
|
|
800e5a8: d9ca bls.n 800e540 <etharp_output+0x14c>
|
|
}
|
|
}
|
|
/* no stable entry found, use the (slower) query function:
|
|
queue on destination Ethernet address belonging to ipaddr */
|
|
return etharp_query(netif, dst_addr, q);
|
|
800e5aa: 68ba ldr r2, [r7, #8]
|
|
800e5ac: 69b9 ldr r1, [r7, #24]
|
|
800e5ae: 68f8 ldr r0, [r7, #12]
|
|
800e5b0: f000 f822 bl 800e5f8 <etharp_query>
|
|
800e5b4: 4603 mov r3, r0
|
|
800e5b6: e00b b.n 800e5d0 <etharp_output+0x1dc>
|
|
}
|
|
|
|
/* continuation for multicast/broadcast destinations */
|
|
/* obtain source Ethernet address of the given interface */
|
|
/* send packet directly on the link */
|
|
return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), dest, ETHTYPE_IP);
|
|
800e5b8: 68fb ldr r3, [r7, #12]
|
|
800e5ba: f103 0226 add.w r2, r3, #38 ; 0x26
|
|
800e5be: f44f 6300 mov.w r3, #2048 ; 0x800
|
|
800e5c2: 9300 str r3, [sp, #0]
|
|
800e5c4: 69fb ldr r3, [r7, #28]
|
|
800e5c6: 68b9 ldr r1, [r7, #8]
|
|
800e5c8: 68f8 ldr r0, [r7, #12]
|
|
800e5ca: f001 fe01 bl 80101d0 <ethernet_output>
|
|
800e5ce: 4603 mov r3, r0
|
|
}
|
|
800e5d0: 4618 mov r0, r3
|
|
800e5d2: 3720 adds r7, #32
|
|
800e5d4: 46bd mov sp, r7
|
|
800e5d6: bd80 pop {r7, pc}
|
|
800e5d8: 080142dc .word 0x080142dc
|
|
800e5dc: 0801442c .word 0x0801442c
|
|
800e5e0: 08014354 .word 0x08014354
|
|
800e5e4: 0801447c .word 0x0801447c
|
|
800e5e8: 0801441c .word 0x0801441c
|
|
800e5ec: 08014d98 .word 0x08014d98
|
|
800e5f0: 24007cc0 .word 0x24007cc0
|
|
800e5f4: 24007bd0 .word 0x24007bd0
|
|
|
|
0800e5f8 <etharp_query>:
|
|
* - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
|
|
*
|
|
*/
|
|
err_t
|
|
etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q)
|
|
{
|
|
800e5f8: b580 push {r7, lr}
|
|
800e5fa: b08c sub sp, #48 ; 0x30
|
|
800e5fc: af02 add r7, sp, #8
|
|
800e5fe: 60f8 str r0, [r7, #12]
|
|
800e600: 60b9 str r1, [r7, #8]
|
|
800e602: 607a str r2, [r7, #4]
|
|
struct eth_addr *srcaddr = (struct eth_addr *)netif->hwaddr;
|
|
800e604: 68fb ldr r3, [r7, #12]
|
|
800e606: 3326 adds r3, #38 ; 0x26
|
|
800e608: 617b str r3, [r7, #20]
|
|
err_t result = ERR_MEM;
|
|
800e60a: 23ff movs r3, #255 ; 0xff
|
|
800e60c: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
int is_new_entry = 0;
|
|
800e610: 2300 movs r3, #0
|
|
800e612: 623b str r3, [r7, #32]
|
|
s16_t i_err;
|
|
netif_addr_idx_t i;
|
|
|
|
/* non-unicast address? */
|
|
if (ip4_addr_isbroadcast(ipaddr, netif) ||
|
|
800e614: 68bb ldr r3, [r7, #8]
|
|
800e616: 681b ldr r3, [r3, #0]
|
|
800e618: 68f9 ldr r1, [r7, #12]
|
|
800e61a: 4618 mov r0, r3
|
|
800e61c: f000 feca bl 800f3b4 <ip4_addr_isbroadcast_u32>
|
|
800e620: 4603 mov r3, r0
|
|
800e622: 2b00 cmp r3, #0
|
|
800e624: d10c bne.n 800e640 <etharp_query+0x48>
|
|
ip4_addr_ismulticast(ipaddr) ||
|
|
800e626: 68bb ldr r3, [r7, #8]
|
|
800e628: 681b ldr r3, [r3, #0]
|
|
800e62a: f003 03f0 and.w r3, r3, #240 ; 0xf0
|
|
if (ip4_addr_isbroadcast(ipaddr, netif) ||
|
|
800e62e: 2be0 cmp r3, #224 ; 0xe0
|
|
800e630: d006 beq.n 800e640 <etharp_query+0x48>
|
|
ip4_addr_ismulticast(ipaddr) ||
|
|
800e632: 68bb ldr r3, [r7, #8]
|
|
800e634: 2b00 cmp r3, #0
|
|
800e636: d003 beq.n 800e640 <etharp_query+0x48>
|
|
ip4_addr_isany(ipaddr)) {
|
|
800e638: 68bb ldr r3, [r7, #8]
|
|
800e63a: 681b ldr r3, [r3, #0]
|
|
800e63c: 2b00 cmp r3, #0
|
|
800e63e: d102 bne.n 800e646 <etharp_query+0x4e>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
|
|
return ERR_ARG;
|
|
800e640: f06f 030f mvn.w r3, #15
|
|
800e644: e101 b.n 800e84a <etharp_query+0x252>
|
|
}
|
|
|
|
/* find entry in ARP cache, ask to create entry if queueing packet */
|
|
i_err = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD, netif);
|
|
800e646: 68fa ldr r2, [r7, #12]
|
|
800e648: 2101 movs r1, #1
|
|
800e64a: 68b8 ldr r0, [r7, #8]
|
|
800e64c: f7ff fb60 bl 800dd10 <etharp_find_entry>
|
|
800e650: 4603 mov r3, r0
|
|
800e652: 827b strh r3, [r7, #18]
|
|
|
|
/* could not find or create entry? */
|
|
if (i_err < 0) {
|
|
800e654: f9b7 3012 ldrsh.w r3, [r7, #18]
|
|
800e658: 2b00 cmp r3, #0
|
|
800e65a: da02 bge.n 800e662 <etharp_query+0x6a>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not create ARP entry\n"));
|
|
if (q) {
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: packet dropped\n"));
|
|
ETHARP_STATS_INC(etharp.memerr);
|
|
}
|
|
return (err_t)i_err;
|
|
800e65c: 8a7b ldrh r3, [r7, #18]
|
|
800e65e: b25b sxtb r3, r3
|
|
800e660: e0f3 b.n 800e84a <etharp_query+0x252>
|
|
}
|
|
LWIP_ASSERT("type overflow", (size_t)i_err < NETIF_ADDR_IDX_MAX);
|
|
800e662: 8a7b ldrh r3, [r7, #18]
|
|
800e664: 2b7e cmp r3, #126 ; 0x7e
|
|
800e666: d906 bls.n 800e676 <etharp_query+0x7e>
|
|
800e668: 4b7a ldr r3, [pc, #488] ; (800e854 <etharp_query+0x25c>)
|
|
800e66a: f240 32c1 movw r2, #961 ; 0x3c1
|
|
800e66e: 497a ldr r1, [pc, #488] ; (800e858 <etharp_query+0x260>)
|
|
800e670: 487a ldr r0, [pc, #488] ; (800e85c <etharp_query+0x264>)
|
|
800e672: f002 faa9 bl 8010bc8 <iprintf>
|
|
i = (netif_addr_idx_t)i_err;
|
|
800e676: 8a7b ldrh r3, [r7, #18]
|
|
800e678: 747b strb r3, [r7, #17]
|
|
|
|
/* mark a fresh entry as pending (we just sent a request) */
|
|
if (arp_table[i].state == ETHARP_STATE_EMPTY) {
|
|
800e67a: 7c7a ldrb r2, [r7, #17]
|
|
800e67c: 4978 ldr r1, [pc, #480] ; (800e860 <etharp_query+0x268>)
|
|
800e67e: 4613 mov r3, r2
|
|
800e680: 005b lsls r3, r3, #1
|
|
800e682: 4413 add r3, r2
|
|
800e684: 00db lsls r3, r3, #3
|
|
800e686: 440b add r3, r1
|
|
800e688: 3314 adds r3, #20
|
|
800e68a: 781b ldrb r3, [r3, #0]
|
|
800e68c: 2b00 cmp r3, #0
|
|
800e68e: d115 bne.n 800e6bc <etharp_query+0xc4>
|
|
is_new_entry = 1;
|
|
800e690: 2301 movs r3, #1
|
|
800e692: 623b str r3, [r7, #32]
|
|
arp_table[i].state = ETHARP_STATE_PENDING;
|
|
800e694: 7c7a ldrb r2, [r7, #17]
|
|
800e696: 4972 ldr r1, [pc, #456] ; (800e860 <etharp_query+0x268>)
|
|
800e698: 4613 mov r3, r2
|
|
800e69a: 005b lsls r3, r3, #1
|
|
800e69c: 4413 add r3, r2
|
|
800e69e: 00db lsls r3, r3, #3
|
|
800e6a0: 440b add r3, r1
|
|
800e6a2: 3314 adds r3, #20
|
|
800e6a4: 2201 movs r2, #1
|
|
800e6a6: 701a strb r2, [r3, #0]
|
|
/* record network interface for re-sending arp request in etharp_tmr */
|
|
arp_table[i].netif = netif;
|
|
800e6a8: 7c7a ldrb r2, [r7, #17]
|
|
800e6aa: 496d ldr r1, [pc, #436] ; (800e860 <etharp_query+0x268>)
|
|
800e6ac: 4613 mov r3, r2
|
|
800e6ae: 005b lsls r3, r3, #1
|
|
800e6b0: 4413 add r3, r2
|
|
800e6b2: 00db lsls r3, r3, #3
|
|
800e6b4: 440b add r3, r1
|
|
800e6b6: 3308 adds r3, #8
|
|
800e6b8: 68fa ldr r2, [r7, #12]
|
|
800e6ba: 601a str r2, [r3, #0]
|
|
}
|
|
|
|
/* { i is either a STABLE or (new or existing) PENDING entry } */
|
|
LWIP_ASSERT("arp_table[i].state == PENDING or STABLE",
|
|
800e6bc: 7c7a ldrb r2, [r7, #17]
|
|
800e6be: 4968 ldr r1, [pc, #416] ; (800e860 <etharp_query+0x268>)
|
|
800e6c0: 4613 mov r3, r2
|
|
800e6c2: 005b lsls r3, r3, #1
|
|
800e6c4: 4413 add r3, r2
|
|
800e6c6: 00db lsls r3, r3, #3
|
|
800e6c8: 440b add r3, r1
|
|
800e6ca: 3314 adds r3, #20
|
|
800e6cc: 781b ldrb r3, [r3, #0]
|
|
800e6ce: 2b01 cmp r3, #1
|
|
800e6d0: d011 beq.n 800e6f6 <etharp_query+0xfe>
|
|
800e6d2: 7c7a ldrb r2, [r7, #17]
|
|
800e6d4: 4962 ldr r1, [pc, #392] ; (800e860 <etharp_query+0x268>)
|
|
800e6d6: 4613 mov r3, r2
|
|
800e6d8: 005b lsls r3, r3, #1
|
|
800e6da: 4413 add r3, r2
|
|
800e6dc: 00db lsls r3, r3, #3
|
|
800e6de: 440b add r3, r1
|
|
800e6e0: 3314 adds r3, #20
|
|
800e6e2: 781b ldrb r3, [r3, #0]
|
|
800e6e4: 2b01 cmp r3, #1
|
|
800e6e6: d806 bhi.n 800e6f6 <etharp_query+0xfe>
|
|
800e6e8: 4b5a ldr r3, [pc, #360] ; (800e854 <etharp_query+0x25c>)
|
|
800e6ea: f240 32cd movw r2, #973 ; 0x3cd
|
|
800e6ee: 495d ldr r1, [pc, #372] ; (800e864 <etharp_query+0x26c>)
|
|
800e6f0: 485a ldr r0, [pc, #360] ; (800e85c <etharp_query+0x264>)
|
|
800e6f2: f002 fa69 bl 8010bc8 <iprintf>
|
|
((arp_table[i].state == ETHARP_STATE_PENDING) ||
|
|
(arp_table[i].state >= ETHARP_STATE_STABLE)));
|
|
|
|
/* do we have a new entry? or an implicit query request? */
|
|
if (is_new_entry || (q == NULL)) {
|
|
800e6f6: 6a3b ldr r3, [r7, #32]
|
|
800e6f8: 2b00 cmp r3, #0
|
|
800e6fa: d102 bne.n 800e702 <etharp_query+0x10a>
|
|
800e6fc: 687b ldr r3, [r7, #4]
|
|
800e6fe: 2b00 cmp r3, #0
|
|
800e700: d10c bne.n 800e71c <etharp_query+0x124>
|
|
/* try to resolve it; send out ARP request */
|
|
result = etharp_request(netif, ipaddr);
|
|
800e702: 68b9 ldr r1, [r7, #8]
|
|
800e704: 68f8 ldr r0, [r7, #12]
|
|
800e706: f000 f963 bl 800e9d0 <etharp_request>
|
|
800e70a: 4603 mov r3, r0
|
|
800e70c: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
/* ARP request couldn't be sent */
|
|
/* We don't re-send arp request in etharp_tmr, but we still queue packets,
|
|
since this failure could be temporary, and the next packet calling
|
|
etharp_query again could lead to sending the queued packets. */
|
|
}
|
|
if (q == NULL) {
|
|
800e710: 687b ldr r3, [r7, #4]
|
|
800e712: 2b00 cmp r3, #0
|
|
800e714: d102 bne.n 800e71c <etharp_query+0x124>
|
|
return result;
|
|
800e716: f997 3027 ldrsb.w r3, [r7, #39] ; 0x27
|
|
800e71a: e096 b.n 800e84a <etharp_query+0x252>
|
|
}
|
|
}
|
|
|
|
/* packet given? */
|
|
LWIP_ASSERT("q != NULL", q != NULL);
|
|
800e71c: 687b ldr r3, [r7, #4]
|
|
800e71e: 2b00 cmp r3, #0
|
|
800e720: d106 bne.n 800e730 <etharp_query+0x138>
|
|
800e722: 4b4c ldr r3, [pc, #304] ; (800e854 <etharp_query+0x25c>)
|
|
800e724: f240 32e1 movw r2, #993 ; 0x3e1
|
|
800e728: 494f ldr r1, [pc, #316] ; (800e868 <etharp_query+0x270>)
|
|
800e72a: 484c ldr r0, [pc, #304] ; (800e85c <etharp_query+0x264>)
|
|
800e72c: f002 fa4c bl 8010bc8 <iprintf>
|
|
/* stable entry? */
|
|
if (arp_table[i].state >= ETHARP_STATE_STABLE) {
|
|
800e730: 7c7a ldrb r2, [r7, #17]
|
|
800e732: 494b ldr r1, [pc, #300] ; (800e860 <etharp_query+0x268>)
|
|
800e734: 4613 mov r3, r2
|
|
800e736: 005b lsls r3, r3, #1
|
|
800e738: 4413 add r3, r2
|
|
800e73a: 00db lsls r3, r3, #3
|
|
800e73c: 440b add r3, r1
|
|
800e73e: 3314 adds r3, #20
|
|
800e740: 781b ldrb r3, [r3, #0]
|
|
800e742: 2b01 cmp r3, #1
|
|
800e744: d917 bls.n 800e776 <etharp_query+0x17e>
|
|
/* we have a valid IP->Ethernet address mapping */
|
|
ETHARP_SET_ADDRHINT(netif, i);
|
|
800e746: 4a49 ldr r2, [pc, #292] ; (800e86c <etharp_query+0x274>)
|
|
800e748: 7c7b ldrb r3, [r7, #17]
|
|
800e74a: 7013 strb r3, [r2, #0]
|
|
/* send the packet */
|
|
result = ethernet_output(netif, q, srcaddr, &(arp_table[i].ethaddr), ETHTYPE_IP);
|
|
800e74c: 7c7a ldrb r2, [r7, #17]
|
|
800e74e: 4613 mov r3, r2
|
|
800e750: 005b lsls r3, r3, #1
|
|
800e752: 4413 add r3, r2
|
|
800e754: 00db lsls r3, r3, #3
|
|
800e756: 3308 adds r3, #8
|
|
800e758: 4a41 ldr r2, [pc, #260] ; (800e860 <etharp_query+0x268>)
|
|
800e75a: 4413 add r3, r2
|
|
800e75c: 3304 adds r3, #4
|
|
800e75e: f44f 6200 mov.w r2, #2048 ; 0x800
|
|
800e762: 9200 str r2, [sp, #0]
|
|
800e764: 697a ldr r2, [r7, #20]
|
|
800e766: 6879 ldr r1, [r7, #4]
|
|
800e768: 68f8 ldr r0, [r7, #12]
|
|
800e76a: f001 fd31 bl 80101d0 <ethernet_output>
|
|
800e76e: 4603 mov r3, r0
|
|
800e770: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
800e774: e067 b.n 800e846 <etharp_query+0x24e>
|
|
/* pending entry? (either just created or already pending */
|
|
} else if (arp_table[i].state == ETHARP_STATE_PENDING) {
|
|
800e776: 7c7a ldrb r2, [r7, #17]
|
|
800e778: 4939 ldr r1, [pc, #228] ; (800e860 <etharp_query+0x268>)
|
|
800e77a: 4613 mov r3, r2
|
|
800e77c: 005b lsls r3, r3, #1
|
|
800e77e: 4413 add r3, r2
|
|
800e780: 00db lsls r3, r3, #3
|
|
800e782: 440b add r3, r1
|
|
800e784: 3314 adds r3, #20
|
|
800e786: 781b ldrb r3, [r3, #0]
|
|
800e788: 2b01 cmp r3, #1
|
|
800e78a: d15c bne.n 800e846 <etharp_query+0x24e>
|
|
/* entry is still pending, queue the given packet 'q' */
|
|
struct pbuf *p;
|
|
int copy_needed = 0;
|
|
800e78c: 2300 movs r3, #0
|
|
800e78e: 61bb str r3, [r7, #24]
|
|
/* IF q includes a pbuf that must be copied, copy the whole chain into a
|
|
* new PBUF_RAM. See the definition of PBUF_NEEDS_COPY for details. */
|
|
p = q;
|
|
800e790: 687b ldr r3, [r7, #4]
|
|
800e792: 61fb str r3, [r7, #28]
|
|
while (p) {
|
|
800e794: e01c b.n 800e7d0 <etharp_query+0x1d8>
|
|
LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0));
|
|
800e796: 69fb ldr r3, [r7, #28]
|
|
800e798: 895a ldrh r2, [r3, #10]
|
|
800e79a: 69fb ldr r3, [r7, #28]
|
|
800e79c: 891b ldrh r3, [r3, #8]
|
|
800e79e: 429a cmp r2, r3
|
|
800e7a0: d10a bne.n 800e7b8 <etharp_query+0x1c0>
|
|
800e7a2: 69fb ldr r3, [r7, #28]
|
|
800e7a4: 681b ldr r3, [r3, #0]
|
|
800e7a6: 2b00 cmp r3, #0
|
|
800e7a8: d006 beq.n 800e7b8 <etharp_query+0x1c0>
|
|
800e7aa: 4b2a ldr r3, [pc, #168] ; (800e854 <etharp_query+0x25c>)
|
|
800e7ac: f240 32f1 movw r2, #1009 ; 0x3f1
|
|
800e7b0: 492f ldr r1, [pc, #188] ; (800e870 <etharp_query+0x278>)
|
|
800e7b2: 482a ldr r0, [pc, #168] ; (800e85c <etharp_query+0x264>)
|
|
800e7b4: f002 fa08 bl 8010bc8 <iprintf>
|
|
if (PBUF_NEEDS_COPY(p)) {
|
|
800e7b8: 69fb ldr r3, [r7, #28]
|
|
800e7ba: 7b1b ldrb r3, [r3, #12]
|
|
800e7bc: f003 0340 and.w r3, r3, #64 ; 0x40
|
|
800e7c0: 2b00 cmp r3, #0
|
|
800e7c2: d002 beq.n 800e7ca <etharp_query+0x1d2>
|
|
copy_needed = 1;
|
|
800e7c4: 2301 movs r3, #1
|
|
800e7c6: 61bb str r3, [r7, #24]
|
|
break;
|
|
800e7c8: e005 b.n 800e7d6 <etharp_query+0x1de>
|
|
}
|
|
p = p->next;
|
|
800e7ca: 69fb ldr r3, [r7, #28]
|
|
800e7cc: 681b ldr r3, [r3, #0]
|
|
800e7ce: 61fb str r3, [r7, #28]
|
|
while (p) {
|
|
800e7d0: 69fb ldr r3, [r7, #28]
|
|
800e7d2: 2b00 cmp r3, #0
|
|
800e7d4: d1df bne.n 800e796 <etharp_query+0x19e>
|
|
}
|
|
if (copy_needed) {
|
|
800e7d6: 69bb ldr r3, [r7, #24]
|
|
800e7d8: 2b00 cmp r3, #0
|
|
800e7da: d007 beq.n 800e7ec <etharp_query+0x1f4>
|
|
/* copy the whole packet into new pbufs */
|
|
p = pbuf_clone(PBUF_LINK, PBUF_RAM, q);
|
|
800e7dc: 687a ldr r2, [r7, #4]
|
|
800e7de: f44f 7120 mov.w r1, #640 ; 0x280
|
|
800e7e2: 200e movs r0, #14
|
|
800e7e4: f7f8 fe52 bl 800748c <pbuf_clone>
|
|
800e7e8: 61f8 str r0, [r7, #28]
|
|
800e7ea: e004 b.n 800e7f6 <etharp_query+0x1fe>
|
|
} else {
|
|
/* referencing the old pbuf is enough */
|
|
p = q;
|
|
800e7ec: 687b ldr r3, [r7, #4]
|
|
800e7ee: 61fb str r3, [r7, #28]
|
|
pbuf_ref(p);
|
|
800e7f0: 69f8 ldr r0, [r7, #28]
|
|
800e7f2: f7f8 fc8f bl 8007114 <pbuf_ref>
|
|
}
|
|
/* packet could be taken over? */
|
|
if (p != NULL) {
|
|
800e7f6: 69fb ldr r3, [r7, #28]
|
|
800e7f8: 2b00 cmp r3, #0
|
|
800e7fa: d021 beq.n 800e840 <etharp_query+0x248>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q));
|
|
result = ERR_MEM;
|
|
}
|
|
#else /* ARP_QUEUEING */
|
|
/* always queue one packet per ARP request only, freeing a previously queued packet */
|
|
if (arp_table[i].q != NULL) {
|
|
800e7fc: 7c7a ldrb r2, [r7, #17]
|
|
800e7fe: 4918 ldr r1, [pc, #96] ; (800e860 <etharp_query+0x268>)
|
|
800e800: 4613 mov r3, r2
|
|
800e802: 005b lsls r3, r3, #1
|
|
800e804: 4413 add r3, r2
|
|
800e806: 00db lsls r3, r3, #3
|
|
800e808: 440b add r3, r1
|
|
800e80a: 681b ldr r3, [r3, #0]
|
|
800e80c: 2b00 cmp r3, #0
|
|
800e80e: d00a beq.n 800e826 <etharp_query+0x22e>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: dropped previously queued packet %p for ARP entry %"U16_F"\n", (void *)q, (u16_t)i));
|
|
pbuf_free(arp_table[i].q);
|
|
800e810: 7c7a ldrb r2, [r7, #17]
|
|
800e812: 4913 ldr r1, [pc, #76] ; (800e860 <etharp_query+0x268>)
|
|
800e814: 4613 mov r3, r2
|
|
800e816: 005b lsls r3, r3, #1
|
|
800e818: 4413 add r3, r2
|
|
800e81a: 00db lsls r3, r3, #3
|
|
800e81c: 440b add r3, r1
|
|
800e81e: 681b ldr r3, [r3, #0]
|
|
800e820: 4618 mov r0, r3
|
|
800e822: f7f8 fbd7 bl 8006fd4 <pbuf_free>
|
|
}
|
|
arp_table[i].q = p;
|
|
800e826: 7c7a ldrb r2, [r7, #17]
|
|
800e828: 490d ldr r1, [pc, #52] ; (800e860 <etharp_query+0x268>)
|
|
800e82a: 4613 mov r3, r2
|
|
800e82c: 005b lsls r3, r3, #1
|
|
800e82e: 4413 add r3, r2
|
|
800e830: 00db lsls r3, r3, #3
|
|
800e832: 440b add r3, r1
|
|
800e834: 69fa ldr r2, [r7, #28]
|
|
800e836: 601a str r2, [r3, #0]
|
|
result = ERR_OK;
|
|
800e838: 2300 movs r3, #0
|
|
800e83a: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
800e83e: e002 b.n 800e846 <etharp_query+0x24e>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"U16_F"\n", (void *)q, (u16_t)i));
|
|
#endif /* ARP_QUEUEING */
|
|
} else {
|
|
ETHARP_STATS_INC(etharp.memerr);
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q));
|
|
result = ERR_MEM;
|
|
800e840: 23ff movs r3, #255 ; 0xff
|
|
800e842: f887 3027 strb.w r3, [r7, #39] ; 0x27
|
|
}
|
|
}
|
|
return result;
|
|
800e846: f997 3027 ldrsb.w r3, [r7, #39] ; 0x27
|
|
}
|
|
800e84a: 4618 mov r0, r3
|
|
800e84c: 3728 adds r7, #40 ; 0x28
|
|
800e84e: 46bd mov sp, r7
|
|
800e850: bd80 pop {r7, pc}
|
|
800e852: bf00 nop
|
|
800e854: 080142dc .word 0x080142dc
|
|
800e858: 08014488 .word 0x08014488
|
|
800e85c: 08014354 .word 0x08014354
|
|
800e860: 24007bd0 .word 0x24007bd0
|
|
800e864: 08014498 .word 0x08014498
|
|
800e868: 0801447c .word 0x0801447c
|
|
800e86c: 24007cc0 .word 0x24007cc0
|
|
800e870: 080144c0 .word 0x080144c0
|
|
|
|
0800e874 <etharp_raw>:
|
|
etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr,
|
|
const struct eth_addr *ethdst_addr,
|
|
const struct eth_addr *hwsrc_addr, const ip4_addr_t *ipsrc_addr,
|
|
const struct eth_addr *hwdst_addr, const ip4_addr_t *ipdst_addr,
|
|
const u16_t opcode)
|
|
{
|
|
800e874: b580 push {r7, lr}
|
|
800e876: b08a sub sp, #40 ; 0x28
|
|
800e878: af02 add r7, sp, #8
|
|
800e87a: 60f8 str r0, [r7, #12]
|
|
800e87c: 60b9 str r1, [r7, #8]
|
|
800e87e: 607a str r2, [r7, #4]
|
|
800e880: 603b str r3, [r7, #0]
|
|
struct pbuf *p;
|
|
err_t result = ERR_OK;
|
|
800e882: 2300 movs r3, #0
|
|
800e884: 77fb strb r3, [r7, #31]
|
|
struct etharp_hdr *hdr;
|
|
|
|
LWIP_ASSERT("netif != NULL", netif != NULL);
|
|
800e886: 68fb ldr r3, [r7, #12]
|
|
800e888: 2b00 cmp r3, #0
|
|
800e88a: d106 bne.n 800e89a <etharp_raw+0x26>
|
|
800e88c: 4b3a ldr r3, [pc, #232] ; (800e978 <etharp_raw+0x104>)
|
|
800e88e: f240 4257 movw r2, #1111 ; 0x457
|
|
800e892: 493a ldr r1, [pc, #232] ; (800e97c <etharp_raw+0x108>)
|
|
800e894: 483a ldr r0, [pc, #232] ; (800e980 <etharp_raw+0x10c>)
|
|
800e896: f002 f997 bl 8010bc8 <iprintf>
|
|
|
|
/* allocate a pbuf for the outgoing ARP request packet */
|
|
p = pbuf_alloc(PBUF_LINK, SIZEOF_ETHARP_HDR, PBUF_RAM);
|
|
800e89a: f44f 7220 mov.w r2, #640 ; 0x280
|
|
800e89e: 211c movs r1, #28
|
|
800e8a0: 200e movs r0, #14
|
|
800e8a2: f7f8 f8b3 bl 8006a0c <pbuf_alloc>
|
|
800e8a6: 61b8 str r0, [r7, #24]
|
|
/* could allocate a pbuf for an ARP request? */
|
|
if (p == NULL) {
|
|
800e8a8: 69bb ldr r3, [r7, #24]
|
|
800e8aa: 2b00 cmp r3, #0
|
|
800e8ac: d102 bne.n 800e8b4 <etharp_raw+0x40>
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
|
|
("etharp_raw: could not allocate pbuf for ARP request.\n"));
|
|
ETHARP_STATS_INC(etharp.memerr);
|
|
return ERR_MEM;
|
|
800e8ae: f04f 33ff mov.w r3, #4294967295
|
|
800e8b2: e05d b.n 800e970 <etharp_raw+0xfc>
|
|
}
|
|
LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr",
|
|
800e8b4: 69bb ldr r3, [r7, #24]
|
|
800e8b6: 895b ldrh r3, [r3, #10]
|
|
800e8b8: 2b1b cmp r3, #27
|
|
800e8ba: d806 bhi.n 800e8ca <etharp_raw+0x56>
|
|
800e8bc: 4b2e ldr r3, [pc, #184] ; (800e978 <etharp_raw+0x104>)
|
|
800e8be: f240 4262 movw r2, #1122 ; 0x462
|
|
800e8c2: 4930 ldr r1, [pc, #192] ; (800e984 <etharp_raw+0x110>)
|
|
800e8c4: 482e ldr r0, [pc, #184] ; (800e980 <etharp_raw+0x10c>)
|
|
800e8c6: f002 f97f bl 8010bc8 <iprintf>
|
|
(p->len >= SIZEOF_ETHARP_HDR));
|
|
|
|
hdr = (struct etharp_hdr *)p->payload;
|
|
800e8ca: 69bb ldr r3, [r7, #24]
|
|
800e8cc: 685b ldr r3, [r3, #4]
|
|
800e8ce: 617b str r3, [r7, #20]
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n"));
|
|
hdr->opcode = lwip_htons(opcode);
|
|
800e8d0: 8ebb ldrh r3, [r7, #52] ; 0x34
|
|
800e8d2: 4618 mov r0, r3
|
|
800e8d4: f7f6 fe3a bl 800554c <lwip_htons>
|
|
800e8d8: 4603 mov r3, r0
|
|
800e8da: 461a mov r2, r3
|
|
800e8dc: 697b ldr r3, [r7, #20]
|
|
800e8de: 80da strh r2, [r3, #6]
|
|
|
|
LWIP_ASSERT("netif->hwaddr_len must be the same as ETH_HWADDR_LEN for etharp!",
|
|
800e8e0: 68fb ldr r3, [r7, #12]
|
|
800e8e2: f893 302c ldrb.w r3, [r3, #44] ; 0x2c
|
|
800e8e6: 2b06 cmp r3, #6
|
|
800e8e8: d006 beq.n 800e8f8 <etharp_raw+0x84>
|
|
800e8ea: 4b23 ldr r3, [pc, #140] ; (800e978 <etharp_raw+0x104>)
|
|
800e8ec: f240 4269 movw r2, #1129 ; 0x469
|
|
800e8f0: 4925 ldr r1, [pc, #148] ; (800e988 <etharp_raw+0x114>)
|
|
800e8f2: 4823 ldr r0, [pc, #140] ; (800e980 <etharp_raw+0x10c>)
|
|
800e8f4: f002 f968 bl 8010bc8 <iprintf>
|
|
(netif->hwaddr_len == ETH_HWADDR_LEN));
|
|
|
|
/* Write the ARP MAC-Addresses */
|
|
SMEMCPY(&hdr->shwaddr, hwsrc_addr, ETH_HWADDR_LEN);
|
|
800e8f8: 697b ldr r3, [r7, #20]
|
|
800e8fa: 3308 adds r3, #8
|
|
800e8fc: 2206 movs r2, #6
|
|
800e8fe: 6839 ldr r1, [r7, #0]
|
|
800e900: 4618 mov r0, r3
|
|
800e902: f002 fb42 bl 8010f8a <memcpy>
|
|
SMEMCPY(&hdr->dhwaddr, hwdst_addr, ETH_HWADDR_LEN);
|
|
800e906: 697b ldr r3, [r7, #20]
|
|
800e908: 3312 adds r3, #18
|
|
800e90a: 2206 movs r2, #6
|
|
800e90c: 6af9 ldr r1, [r7, #44] ; 0x2c
|
|
800e90e: 4618 mov r0, r3
|
|
800e910: f002 fb3b bl 8010f8a <memcpy>
|
|
/* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
|
|
* structure packing. */
|
|
IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->sipaddr, ipsrc_addr);
|
|
800e914: 697b ldr r3, [r7, #20]
|
|
800e916: 330e adds r3, #14
|
|
800e918: 6aba ldr r2, [r7, #40] ; 0x28
|
|
800e91a: 6812 ldr r2, [r2, #0]
|
|
800e91c: 601a str r2, [r3, #0]
|
|
IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->dipaddr, ipdst_addr);
|
|
800e91e: 697b ldr r3, [r7, #20]
|
|
800e920: 3318 adds r3, #24
|
|
800e922: 6b3a ldr r2, [r7, #48] ; 0x30
|
|
800e924: 6812 ldr r2, [r2, #0]
|
|
800e926: 601a str r2, [r3, #0]
|
|
|
|
hdr->hwtype = PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET);
|
|
800e928: 697b ldr r3, [r7, #20]
|
|
800e92a: 2200 movs r2, #0
|
|
800e92c: 701a strb r2, [r3, #0]
|
|
800e92e: 2200 movs r2, #0
|
|
800e930: f042 0201 orr.w r2, r2, #1
|
|
800e934: 705a strb r2, [r3, #1]
|
|
hdr->proto = PP_HTONS(ETHTYPE_IP);
|
|
800e936: 697b ldr r3, [r7, #20]
|
|
800e938: 2200 movs r2, #0
|
|
800e93a: f042 0208 orr.w r2, r2, #8
|
|
800e93e: 709a strb r2, [r3, #2]
|
|
800e940: 2200 movs r2, #0
|
|
800e942: 70da strb r2, [r3, #3]
|
|
/* set hwlen and protolen */
|
|
hdr->hwlen = ETH_HWADDR_LEN;
|
|
800e944: 697b ldr r3, [r7, #20]
|
|
800e946: 2206 movs r2, #6
|
|
800e948: 711a strb r2, [r3, #4]
|
|
hdr->protolen = sizeof(ip4_addr_t);
|
|
800e94a: 697b ldr r3, [r7, #20]
|
|
800e94c: 2204 movs r2, #4
|
|
800e94e: 715a strb r2, [r3, #5]
|
|
if (ip4_addr_islinklocal(ipsrc_addr)) {
|
|
ethernet_output(netif, p, ethsrc_addr, ðbroadcast, ETHTYPE_ARP);
|
|
} else
|
|
#endif /* LWIP_AUTOIP */
|
|
{
|
|
ethernet_output(netif, p, ethsrc_addr, ethdst_addr, ETHTYPE_ARP);
|
|
800e950: f640 0306 movw r3, #2054 ; 0x806
|
|
800e954: 9300 str r3, [sp, #0]
|
|
800e956: 687b ldr r3, [r7, #4]
|
|
800e958: 68ba ldr r2, [r7, #8]
|
|
800e95a: 69b9 ldr r1, [r7, #24]
|
|
800e95c: 68f8 ldr r0, [r7, #12]
|
|
800e95e: f001 fc37 bl 80101d0 <ethernet_output>
|
|
}
|
|
|
|
ETHARP_STATS_INC(etharp.xmit);
|
|
/* free ARP query packet */
|
|
pbuf_free(p);
|
|
800e962: 69b8 ldr r0, [r7, #24]
|
|
800e964: f7f8 fb36 bl 8006fd4 <pbuf_free>
|
|
p = NULL;
|
|
800e968: 2300 movs r3, #0
|
|
800e96a: 61bb str r3, [r7, #24]
|
|
/* could not allocate pbuf for ARP request */
|
|
|
|
return result;
|
|
800e96c: f997 301f ldrsb.w r3, [r7, #31]
|
|
}
|
|
800e970: 4618 mov r0, r3
|
|
800e972: 3720 adds r7, #32
|
|
800e974: 46bd mov sp, r7
|
|
800e976: bd80 pop {r7, pc}
|
|
800e978: 080142dc .word 0x080142dc
|
|
800e97c: 0801442c .word 0x0801442c
|
|
800e980: 08014354 .word 0x08014354
|
|
800e984: 080144dc .word 0x080144dc
|
|
800e988: 08014510 .word 0x08014510
|
|
|
|
0800e98c <etharp_request_dst>:
|
|
* ERR_MEM if the ARP packet couldn't be allocated
|
|
* any other err_t on failure
|
|
*/
|
|
static err_t
|
|
etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr *hw_dst_addr)
|
|
{
|
|
800e98c: b580 push {r7, lr}
|
|
800e98e: b088 sub sp, #32
|
|
800e990: af04 add r7, sp, #16
|
|
800e992: 60f8 str r0, [r7, #12]
|
|
800e994: 60b9 str r1, [r7, #8]
|
|
800e996: 607a str r2, [r7, #4]
|
|
return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, hw_dst_addr,
|
|
800e998: 68fb ldr r3, [r7, #12]
|
|
800e99a: f103 0126 add.w r1, r3, #38 ; 0x26
|
|
(struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif), ðzero,
|
|
800e99e: 68fb ldr r3, [r7, #12]
|
|
800e9a0: f103 0026 add.w r0, r3, #38 ; 0x26
|
|
800e9a4: 68fb ldr r3, [r7, #12]
|
|
800e9a6: 3304 adds r3, #4
|
|
return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, hw_dst_addr,
|
|
800e9a8: 2201 movs r2, #1
|
|
800e9aa: 9203 str r2, [sp, #12]
|
|
800e9ac: 68ba ldr r2, [r7, #8]
|
|
800e9ae: 9202 str r2, [sp, #8]
|
|
800e9b0: 4a06 ldr r2, [pc, #24] ; (800e9cc <etharp_request_dst+0x40>)
|
|
800e9b2: 9201 str r2, [sp, #4]
|
|
800e9b4: 9300 str r3, [sp, #0]
|
|
800e9b6: 4603 mov r3, r0
|
|
800e9b8: 687a ldr r2, [r7, #4]
|
|
800e9ba: 68f8 ldr r0, [r7, #12]
|
|
800e9bc: f7ff ff5a bl 800e874 <etharp_raw>
|
|
800e9c0: 4603 mov r3, r0
|
|
ipaddr, ARP_REQUEST);
|
|
}
|
|
800e9c2: 4618 mov r0, r3
|
|
800e9c4: 3710 adds r7, #16
|
|
800e9c6: 46bd mov sp, r7
|
|
800e9c8: bd80 pop {r7, pc}
|
|
800e9ca: bf00 nop
|
|
800e9cc: 08014da0 .word 0x08014da0
|
|
|
|
0800e9d0 <etharp_request>:
|
|
* ERR_MEM if the ARP packet couldn't be allocated
|
|
* any other err_t on failure
|
|
*/
|
|
err_t
|
|
etharp_request(struct netif *netif, const ip4_addr_t *ipaddr)
|
|
{
|
|
800e9d0: b580 push {r7, lr}
|
|
800e9d2: b082 sub sp, #8
|
|
800e9d4: af00 add r7, sp, #0
|
|
800e9d6: 6078 str r0, [r7, #4]
|
|
800e9d8: 6039 str r1, [r7, #0]
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n"));
|
|
return etharp_request_dst(netif, ipaddr, ðbroadcast);
|
|
800e9da: 4a05 ldr r2, [pc, #20] ; (800e9f0 <etharp_request+0x20>)
|
|
800e9dc: 6839 ldr r1, [r7, #0]
|
|
800e9de: 6878 ldr r0, [r7, #4]
|
|
800e9e0: f7ff ffd4 bl 800e98c <etharp_request_dst>
|
|
800e9e4: 4603 mov r3, r0
|
|
}
|
|
800e9e6: 4618 mov r0, r3
|
|
800e9e8: 3708 adds r7, #8
|
|
800e9ea: 46bd mov sp, r7
|
|
800e9ec: bd80 pop {r7, pc}
|
|
800e9ee: bf00 nop
|
|
800e9f0: 08014d98 .word 0x08014d98
|
|
|
|
0800e9f4 <icmp_input>:
|
|
* @param p the icmp echo request packet, p->payload pointing to the icmp header
|
|
* @param inp the netif on which this packet was received
|
|
*/
|
|
void
|
|
icmp_input(struct pbuf *p, struct netif *inp)
|
|
{
|
|
800e9f4: b580 push {r7, lr}
|
|
800e9f6: b08e sub sp, #56 ; 0x38
|
|
800e9f8: af04 add r7, sp, #16
|
|
800e9fa: 6078 str r0, [r7, #4]
|
|
800e9fc: 6039 str r1, [r7, #0]
|
|
const ip4_addr_t *src;
|
|
|
|
ICMP_STATS_INC(icmp.recv);
|
|
MIB2_STATS_INC(mib2.icmpinmsgs);
|
|
|
|
iphdr_in = ip4_current_header();
|
|
800e9fe: 4ba4 ldr r3, [pc, #656] ; (800ec90 <icmp_input+0x29c>)
|
|
800ea00: 689b ldr r3, [r3, #8]
|
|
800ea02: 627b str r3, [r7, #36] ; 0x24
|
|
hlen = IPH_HL_BYTES(iphdr_in);
|
|
800ea04: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800ea06: 781b ldrb r3, [r3, #0]
|
|
800ea08: f003 030f and.w r3, r3, #15
|
|
800ea0c: b2db uxtb r3, r3
|
|
800ea0e: 009b lsls r3, r3, #2
|
|
800ea10: b2db uxtb r3, r3
|
|
800ea12: 847b strh r3, [r7, #34] ; 0x22
|
|
if (hlen < IP_HLEN) {
|
|
800ea14: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800ea16: 2b13 cmp r3, #19
|
|
800ea18: d805 bhi.n 800ea26 <icmp_input+0x32>
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short IP header (%"S16_F" bytes) received\n", hlen));
|
|
800ea1a: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800ea1c: 4619 mov r1, r3
|
|
800ea1e: 489d ldr r0, [pc, #628] ; (800ec94 <icmp_input+0x2a0>)
|
|
800ea20: f002 f8d2 bl 8010bc8 <iprintf>
|
|
goto lenerr;
|
|
800ea24: e128 b.n 800ec78 <icmp_input+0x284>
|
|
}
|
|
if (p->len < sizeof(u16_t) * 2) {
|
|
800ea26: 687b ldr r3, [r7, #4]
|
|
800ea28: 895b ldrh r3, [r3, #10]
|
|
800ea2a: 2b03 cmp r3, #3
|
|
800ea2c: d806 bhi.n 800ea3c <icmp_input+0x48>
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len));
|
|
800ea2e: 687b ldr r3, [r7, #4]
|
|
800ea30: 891b ldrh r3, [r3, #8]
|
|
800ea32: 4619 mov r1, r3
|
|
800ea34: 4898 ldr r0, [pc, #608] ; (800ec98 <icmp_input+0x2a4>)
|
|
800ea36: f002 f8c7 bl 8010bc8 <iprintf>
|
|
goto lenerr;
|
|
800ea3a: e11d b.n 800ec78 <icmp_input+0x284>
|
|
}
|
|
|
|
type = *((u8_t *)p->payload);
|
|
800ea3c: 687b ldr r3, [r7, #4]
|
|
800ea3e: 685b ldr r3, [r3, #4]
|
|
800ea40: 781b ldrb r3, [r3, #0]
|
|
800ea42: f887 3021 strb.w r3, [r7, #33] ; 0x21
|
|
#ifdef LWIP_DEBUG
|
|
code = *(((u8_t *)p->payload) + 1);
|
|
800ea46: 687b ldr r3, [r7, #4]
|
|
800ea48: 685b ldr r3, [r3, #4]
|
|
800ea4a: 785b ldrb r3, [r3, #1]
|
|
800ea4c: f887 3020 strb.w r3, [r7, #32]
|
|
/* if debug is enabled but debug statement below is somehow disabled: */
|
|
LWIP_UNUSED_ARG(code);
|
|
#endif /* LWIP_DEBUG */
|
|
switch (type) {
|
|
800ea50: f897 3021 ldrb.w r3, [r7, #33] ; 0x21
|
|
800ea54: 2b00 cmp r3, #0
|
|
800ea56: f000 8108 beq.w 800ec6a <icmp_input+0x276>
|
|
800ea5a: 2b08 cmp r3, #8
|
|
800ea5c: f040 80fc bne.w 800ec58 <icmp_input+0x264>
|
|
(as obviously, an echo request has been sent, too). */
|
|
MIB2_STATS_INC(mib2.icmpinechoreps);
|
|
break;
|
|
case ICMP_ECHO:
|
|
MIB2_STATS_INC(mib2.icmpinechos);
|
|
src = ip4_current_dest_addr();
|
|
800ea60: 4b8e ldr r3, [pc, #568] ; (800ec9c <icmp_input+0x2a8>)
|
|
800ea62: 61fb str r3, [r7, #28]
|
|
/* multicast destination address? */
|
|
if (ip4_addr_ismulticast(ip4_current_dest_addr())) {
|
|
800ea64: 4b8a ldr r3, [pc, #552] ; (800ec90 <icmp_input+0x29c>)
|
|
800ea66: 695b ldr r3, [r3, #20]
|
|
800ea68: f003 03f0 and.w r3, r3, #240 ; 0xf0
|
|
800ea6c: 2be0 cmp r3, #224 ; 0xe0
|
|
800ea6e: d103 bne.n 800ea78 <icmp_input+0x84>
|
|
#if LWIP_MULTICAST_PING
|
|
/* For multicast, use address of receiving interface as source address */
|
|
src = netif_ip4_addr(inp);
|
|
#else /* LWIP_MULTICAST_PING */
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast pings\n"));
|
|
800ea70: 488b ldr r0, [pc, #556] ; (800eca0 <icmp_input+0x2ac>)
|
|
800ea72: f002 f917 bl 8010ca4 <puts>
|
|
goto icmperr;
|
|
800ea76: e103 b.n 800ec80 <icmp_input+0x28c>
|
|
#endif /* LWIP_MULTICAST_PING */
|
|
}
|
|
/* broadcast destination address? */
|
|
if (ip4_addr_isbroadcast(ip4_current_dest_addr(), ip_current_netif())) {
|
|
800ea78: 4b85 ldr r3, [pc, #532] ; (800ec90 <icmp_input+0x29c>)
|
|
800ea7a: 695b ldr r3, [r3, #20]
|
|
800ea7c: 4a84 ldr r2, [pc, #528] ; (800ec90 <icmp_input+0x29c>)
|
|
800ea7e: 6812 ldr r2, [r2, #0]
|
|
800ea80: 4611 mov r1, r2
|
|
800ea82: 4618 mov r0, r3
|
|
800ea84: f000 fc96 bl 800f3b4 <ip4_addr_isbroadcast_u32>
|
|
800ea88: 4603 mov r3, r0
|
|
800ea8a: 2b00 cmp r3, #0
|
|
800ea8c: d003 beq.n 800ea96 <icmp_input+0xa2>
|
|
#if LWIP_BROADCAST_PING
|
|
/* For broadcast, use address of receiving interface as source address */
|
|
src = netif_ip4_addr(inp);
|
|
#else /* LWIP_BROADCAST_PING */
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to broadcast pings\n"));
|
|
800ea8e: 4885 ldr r0, [pc, #532] ; (800eca4 <icmp_input+0x2b0>)
|
|
800ea90: f002 f908 bl 8010ca4 <puts>
|
|
goto icmperr;
|
|
800ea94: e0f4 b.n 800ec80 <icmp_input+0x28c>
|
|
#endif /* LWIP_BROADCAST_PING */
|
|
}
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n"));
|
|
800ea96: 4884 ldr r0, [pc, #528] ; (800eca8 <icmp_input+0x2b4>)
|
|
800ea98: f002 f904 bl 8010ca4 <puts>
|
|
if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
|
|
800ea9c: 687b ldr r3, [r7, #4]
|
|
800ea9e: 891b ldrh r3, [r3, #8]
|
|
800eaa0: 2b07 cmp r3, #7
|
|
800eaa2: d803 bhi.n 800eaac <icmp_input+0xb8>
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
|
|
800eaa4: 4881 ldr r0, [pc, #516] ; (800ecac <icmp_input+0x2b8>)
|
|
800eaa6: f002 f8fd bl 8010ca4 <puts>
|
|
goto lenerr;
|
|
800eaaa: e0e5 b.n 800ec78 <icmp_input+0x284>
|
|
}
|
|
#if CHECKSUM_CHECK_ICMP
|
|
IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_ICMP) {
|
|
if (inet_chksum_pbuf(p) != 0) {
|
|
800eaac: 6878 ldr r0, [r7, #4]
|
|
800eaae: f7f6 fdea bl 8005686 <inet_chksum_pbuf>
|
|
800eab2: 4603 mov r3, r0
|
|
800eab4: 2b00 cmp r3, #0
|
|
800eab6: d006 beq.n 800eac6 <icmp_input+0xd2>
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n"));
|
|
800eab8: 487d ldr r0, [pc, #500] ; (800ecb0 <icmp_input+0x2bc>)
|
|
800eaba: f002 f8f3 bl 8010ca4 <puts>
|
|
pbuf_free(p);
|
|
800eabe: 6878 ldr r0, [r7, #4]
|
|
800eac0: f7f8 fa88 bl 8006fd4 <pbuf_free>
|
|
ICMP_STATS_INC(icmp.chkerr);
|
|
MIB2_STATS_INC(mib2.icmpinerrors);
|
|
return;
|
|
800eac4: e0e0 b.n 800ec88 <icmp_input+0x294>
|
|
}
|
|
}
|
|
#endif
|
|
#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
|
|
if (pbuf_add_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) {
|
|
800eac6: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800eac8: 330e adds r3, #14
|
|
800eaca: 4619 mov r1, r3
|
|
800eacc: 6878 ldr r0, [r7, #4]
|
|
800eace: f7f8 f9eb bl 8006ea8 <pbuf_add_header>
|
|
800ead2: 4603 mov r3, r0
|
|
800ead4: 2b00 cmp r3, #0
|
|
800ead6: d057 beq.n 800eb88 <icmp_input+0x194>
|
|
/* p is not big enough to contain link headers
|
|
* allocate a new one and copy p into it
|
|
*/
|
|
struct pbuf *r;
|
|
u16_t alloc_len = (u16_t)(p->tot_len + hlen);
|
|
800ead8: 687b ldr r3, [r7, #4]
|
|
800eada: 891a ldrh r2, [r3, #8]
|
|
800eadc: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800eade: 4413 add r3, r2
|
|
800eae0: 837b strh r3, [r7, #26]
|
|
if (alloc_len < p->tot_len) {
|
|
800eae2: 687b ldr r3, [r7, #4]
|
|
800eae4: 891b ldrh r3, [r3, #8]
|
|
800eae6: 8b7a ldrh r2, [r7, #26]
|
|
800eae8: 429a cmp r2, r3
|
|
800eaea: d203 bcs.n 800eaf4 <icmp_input+0x100>
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed (tot_len overflow)\n"));
|
|
800eaec: 4871 ldr r0, [pc, #452] ; (800ecb4 <icmp_input+0x2c0>)
|
|
800eaee: f002 f8d9 bl 8010ca4 <puts>
|
|
goto icmperr;
|
|
800eaf2: e0c5 b.n 800ec80 <icmp_input+0x28c>
|
|
}
|
|
/* allocate new packet buffer with space for link headers */
|
|
r = pbuf_alloc(PBUF_LINK, alloc_len, PBUF_RAM);
|
|
800eaf4: 8b7b ldrh r3, [r7, #26]
|
|
800eaf6: f44f 7220 mov.w r2, #640 ; 0x280
|
|
800eafa: 4619 mov r1, r3
|
|
800eafc: 200e movs r0, #14
|
|
800eafe: f7f7 ff85 bl 8006a0c <pbuf_alloc>
|
|
800eb02: 6178 str r0, [r7, #20]
|
|
if (r == NULL) {
|
|
800eb04: 697b ldr r3, [r7, #20]
|
|
800eb06: 2b00 cmp r3, #0
|
|
800eb08: d103 bne.n 800eb12 <icmp_input+0x11e>
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n"));
|
|
800eb0a: 486b ldr r0, [pc, #428] ; (800ecb8 <icmp_input+0x2c4>)
|
|
800eb0c: f002 f8ca bl 8010ca4 <puts>
|
|
goto icmperr;
|
|
800eb10: e0b6 b.n 800ec80 <icmp_input+0x28c>
|
|
}
|
|
if (r->len < hlen + sizeof(struct icmp_echo_hdr)) {
|
|
800eb12: 697b ldr r3, [r7, #20]
|
|
800eb14: 895b ldrh r3, [r3, #10]
|
|
800eb16: 461a mov r2, r3
|
|
800eb18: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800eb1a: 3308 adds r3, #8
|
|
800eb1c: 429a cmp r2, r3
|
|
800eb1e: d206 bcs.n 800eb2e <icmp_input+0x13a>
|
|
LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("first pbuf cannot hold the ICMP header"));
|
|
800eb20: 4866 ldr r0, [pc, #408] ; (800ecbc <icmp_input+0x2c8>)
|
|
800eb22: f002 f851 bl 8010bc8 <iprintf>
|
|
pbuf_free(r);
|
|
800eb26: 6978 ldr r0, [r7, #20]
|
|
800eb28: f7f8 fa54 bl 8006fd4 <pbuf_free>
|
|
goto icmperr;
|
|
800eb2c: e0a8 b.n 800ec80 <icmp_input+0x28c>
|
|
}
|
|
/* copy the ip header */
|
|
MEMCPY(r->payload, iphdr_in, hlen);
|
|
800eb2e: 697b ldr r3, [r7, #20]
|
|
800eb30: 685b ldr r3, [r3, #4]
|
|
800eb32: 8c7a ldrh r2, [r7, #34] ; 0x22
|
|
800eb34: 6a79 ldr r1, [r7, #36] ; 0x24
|
|
800eb36: 4618 mov r0, r3
|
|
800eb38: f002 fa27 bl 8010f8a <memcpy>
|
|
/* switch r->payload back to icmp header (cannot fail) */
|
|
if (pbuf_remove_header(r, hlen)) {
|
|
800eb3c: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800eb3e: 4619 mov r1, r3
|
|
800eb40: 6978 ldr r0, [r7, #20]
|
|
800eb42: f7f8 f9c1 bl 8006ec8 <pbuf_remove_header>
|
|
800eb46: 4603 mov r3, r0
|
|
800eb48: 2b00 cmp r3, #0
|
|
800eb4a: d009 beq.n 800eb60 <icmp_input+0x16c>
|
|
LWIP_ASSERT("icmp_input: moving r->payload to icmp header failed\n", 0);
|
|
800eb4c: 4b5c ldr r3, [pc, #368] ; (800ecc0 <icmp_input+0x2cc>)
|
|
800eb4e: 22b6 movs r2, #182 ; 0xb6
|
|
800eb50: 495c ldr r1, [pc, #368] ; (800ecc4 <icmp_input+0x2d0>)
|
|
800eb52: 485d ldr r0, [pc, #372] ; (800ecc8 <icmp_input+0x2d4>)
|
|
800eb54: f002 f838 bl 8010bc8 <iprintf>
|
|
pbuf_free(r);
|
|
800eb58: 6978 ldr r0, [r7, #20]
|
|
800eb5a: f7f8 fa3b bl 8006fd4 <pbuf_free>
|
|
goto icmperr;
|
|
800eb5e: e08f b.n 800ec80 <icmp_input+0x28c>
|
|
}
|
|
/* copy the rest of the packet without ip header */
|
|
if (pbuf_copy(r, p) != ERR_OK) {
|
|
800eb60: 6879 ldr r1, [r7, #4]
|
|
800eb62: 6978 ldr r0, [r7, #20]
|
|
800eb64: f7f8 fb4e bl 8007204 <pbuf_copy>
|
|
800eb68: 4603 mov r3, r0
|
|
800eb6a: 2b00 cmp r3, #0
|
|
800eb6c: d006 beq.n 800eb7c <icmp_input+0x188>
|
|
LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("icmp_input: copying to new pbuf failed"));
|
|
800eb6e: 4857 ldr r0, [pc, #348] ; (800eccc <icmp_input+0x2d8>)
|
|
800eb70: f002 f82a bl 8010bc8 <iprintf>
|
|
pbuf_free(r);
|
|
800eb74: 6978 ldr r0, [r7, #20]
|
|
800eb76: f7f8 fa2d bl 8006fd4 <pbuf_free>
|
|
goto icmperr;
|
|
800eb7a: e081 b.n 800ec80 <icmp_input+0x28c>
|
|
}
|
|
/* free the original p */
|
|
pbuf_free(p);
|
|
800eb7c: 6878 ldr r0, [r7, #4]
|
|
800eb7e: f7f8 fa29 bl 8006fd4 <pbuf_free>
|
|
/* we now have an identical copy of p that has room for link headers */
|
|
p = r;
|
|
800eb82: 697b ldr r3, [r7, #20]
|
|
800eb84: 607b str r3, [r7, #4]
|
|
800eb86: e00f b.n 800eba8 <icmp_input+0x1b4>
|
|
} else {
|
|
/* restore p->payload to point to icmp header (cannot fail) */
|
|
if (pbuf_remove_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) {
|
|
800eb88: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800eb8a: 330e adds r3, #14
|
|
800eb8c: 4619 mov r1, r3
|
|
800eb8e: 6878 ldr r0, [r7, #4]
|
|
800eb90: f7f8 f99a bl 8006ec8 <pbuf_remove_header>
|
|
800eb94: 4603 mov r3, r0
|
|
800eb96: 2b00 cmp r3, #0
|
|
800eb98: d006 beq.n 800eba8 <icmp_input+0x1b4>
|
|
LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0);
|
|
800eb9a: 4b49 ldr r3, [pc, #292] ; (800ecc0 <icmp_input+0x2cc>)
|
|
800eb9c: 22c7 movs r2, #199 ; 0xc7
|
|
800eb9e: 494c ldr r1, [pc, #304] ; (800ecd0 <icmp_input+0x2dc>)
|
|
800eba0: 4849 ldr r0, [pc, #292] ; (800ecc8 <icmp_input+0x2d4>)
|
|
800eba2: f002 f811 bl 8010bc8 <iprintf>
|
|
goto icmperr;
|
|
800eba6: e06b b.n 800ec80 <icmp_input+0x28c>
|
|
}
|
|
#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
|
|
/* At this point, all checks are OK. */
|
|
/* We generate an answer by switching the dest and src ip addresses,
|
|
* setting the icmp type to ECHO_RESPONSE and updating the checksum. */
|
|
iecho = (struct icmp_echo_hdr *)p->payload;
|
|
800eba8: 687b ldr r3, [r7, #4]
|
|
800ebaa: 685b ldr r3, [r3, #4]
|
|
800ebac: 613b str r3, [r7, #16]
|
|
if (pbuf_add_header(p, hlen)) {
|
|
800ebae: 8c7b ldrh r3, [r7, #34] ; 0x22
|
|
800ebb0: 4619 mov r1, r3
|
|
800ebb2: 6878 ldr r0, [r7, #4]
|
|
800ebb4: f7f8 f978 bl 8006ea8 <pbuf_add_header>
|
|
800ebb8: 4603 mov r3, r0
|
|
800ebba: 2b00 cmp r3, #0
|
|
800ebbc: d003 beq.n 800ebc6 <icmp_input+0x1d2>
|
|
LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Can't move over header in packet"));
|
|
800ebbe: 4845 ldr r0, [pc, #276] ; (800ecd4 <icmp_input+0x2e0>)
|
|
800ebc0: f002 f802 bl 8010bc8 <iprintf>
|
|
ICMP_TTL, 0, IP_PROTO_ICMP, inp);
|
|
if (ret != ERR_OK) {
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %s\n", lwip_strerr(ret)));
|
|
}
|
|
}
|
|
break;
|
|
800ebc4: e053 b.n 800ec6e <icmp_input+0x27a>
|
|
struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;
|
|
800ebc6: 687b ldr r3, [r7, #4]
|
|
800ebc8: 685b ldr r3, [r3, #4]
|
|
800ebca: 60fb str r3, [r7, #12]
|
|
ip4_addr_copy(iphdr->src, *src);
|
|
800ebcc: 69fb ldr r3, [r7, #28]
|
|
800ebce: 681a ldr r2, [r3, #0]
|
|
800ebd0: 68fb ldr r3, [r7, #12]
|
|
800ebd2: 60da str r2, [r3, #12]
|
|
ip4_addr_copy(iphdr->dest, *ip4_current_src_addr());
|
|
800ebd4: 4b2e ldr r3, [pc, #184] ; (800ec90 <icmp_input+0x29c>)
|
|
800ebd6: 691a ldr r2, [r3, #16]
|
|
800ebd8: 68fb ldr r3, [r7, #12]
|
|
800ebda: 611a str r2, [r3, #16]
|
|
ICMPH_TYPE_SET(iecho, ICMP_ER);
|
|
800ebdc: 693b ldr r3, [r7, #16]
|
|
800ebde: 2200 movs r2, #0
|
|
800ebe0: 701a strb r2, [r3, #0]
|
|
if (iecho->chksum > PP_HTONS(0xffffU - (ICMP_ECHO << 8))) {
|
|
800ebe2: 693b ldr r3, [r7, #16]
|
|
800ebe4: 885b ldrh r3, [r3, #2]
|
|
800ebe6: b29b uxth r3, r3
|
|
800ebe8: f64f 72f7 movw r2, #65527 ; 0xfff7
|
|
800ebec: 4293 cmp r3, r2
|
|
800ebee: d907 bls.n 800ec00 <icmp_input+0x20c>
|
|
iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS((u16_t)(ICMP_ECHO << 8)) + 1);
|
|
800ebf0: 693b ldr r3, [r7, #16]
|
|
800ebf2: 885b ldrh r3, [r3, #2]
|
|
800ebf4: b29b uxth r3, r3
|
|
800ebf6: 3309 adds r3, #9
|
|
800ebf8: b29a uxth r2, r3
|
|
800ebfa: 693b ldr r3, [r7, #16]
|
|
800ebfc: 805a strh r2, [r3, #2]
|
|
800ebfe: e006 b.n 800ec0e <icmp_input+0x21a>
|
|
iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS(ICMP_ECHO << 8));
|
|
800ec00: 693b ldr r3, [r7, #16]
|
|
800ec02: 885b ldrh r3, [r3, #2]
|
|
800ec04: b29b uxth r3, r3
|
|
800ec06: 3308 adds r3, #8
|
|
800ec08: b29a uxth r2, r3
|
|
800ec0a: 693b ldr r3, [r7, #16]
|
|
800ec0c: 805a strh r2, [r3, #2]
|
|
IPH_TTL_SET(iphdr, ICMP_TTL);
|
|
800ec0e: 68fb ldr r3, [r7, #12]
|
|
800ec10: 22ff movs r2, #255 ; 0xff
|
|
800ec12: 721a strb r2, [r3, #8]
|
|
IPH_CHKSUM_SET(iphdr, 0);
|
|
800ec14: 68fb ldr r3, [r7, #12]
|
|
800ec16: 2200 movs r2, #0
|
|
800ec18: 729a strb r2, [r3, #10]
|
|
800ec1a: 2200 movs r2, #0
|
|
800ec1c: 72da strb r2, [r3, #11]
|
|
ret = ip4_output_if(p, src, LWIP_IP_HDRINCL,
|
|
800ec1e: 683b ldr r3, [r7, #0]
|
|
800ec20: 9302 str r3, [sp, #8]
|
|
800ec22: 2301 movs r3, #1
|
|
800ec24: 9301 str r3, [sp, #4]
|
|
800ec26: 2300 movs r3, #0
|
|
800ec28: 9300 str r3, [sp, #0]
|
|
800ec2a: 23ff movs r3, #255 ; 0xff
|
|
800ec2c: 2200 movs r2, #0
|
|
800ec2e: 69f9 ldr r1, [r7, #28]
|
|
800ec30: 6878 ldr r0, [r7, #4]
|
|
800ec32: f000 fae7 bl 800f204 <ip4_output_if>
|
|
800ec36: 4603 mov r3, r0
|
|
800ec38: 72fb strb r3, [r7, #11]
|
|
if (ret != ERR_OK) {
|
|
800ec3a: f997 300b ldrsb.w r3, [r7, #11]
|
|
800ec3e: 2b00 cmp r3, #0
|
|
800ec40: d015 beq.n 800ec6e <icmp_input+0x27a>
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %s\n", lwip_strerr(ret)));
|
|
800ec42: f997 300b ldrsb.w r3, [r7, #11]
|
|
800ec46: 4618 mov r0, r3
|
|
800ec48: f7f6 fc60 bl 800550c <lwip_strerr>
|
|
800ec4c: 4603 mov r3, r0
|
|
800ec4e: 4619 mov r1, r3
|
|
800ec50: 4821 ldr r0, [pc, #132] ; (800ecd8 <icmp_input+0x2e4>)
|
|
800ec52: f001 ffb9 bl 8010bc8 <iprintf>
|
|
break;
|
|
800ec56: e00a b.n 800ec6e <icmp_input+0x27a>
|
|
} else if (type == ICMP_AM) {
|
|
MIB2_STATS_INC(mib2.icmpinaddrmasks);
|
|
} else if (type == ICMP_AMR) {
|
|
MIB2_STATS_INC(mib2.icmpinaddrmaskreps);
|
|
}
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
|
|
800ec58: f897 3021 ldrb.w r3, [r7, #33] ; 0x21
|
|
800ec5c: f897 2020 ldrb.w r2, [r7, #32]
|
|
800ec60: 4619 mov r1, r3
|
|
800ec62: 481e ldr r0, [pc, #120] ; (800ecdc <icmp_input+0x2e8>)
|
|
800ec64: f001 ffb0 bl 8010bc8 <iprintf>
|
|
800ec68: e002 b.n 800ec70 <icmp_input+0x27c>
|
|
break;
|
|
800ec6a: bf00 nop
|
|
800ec6c: e000 b.n 800ec70 <icmp_input+0x27c>
|
|
break;
|
|
800ec6e: bf00 nop
|
|
(s16_t)type, (s16_t)code));
|
|
ICMP_STATS_INC(icmp.proterr);
|
|
ICMP_STATS_INC(icmp.drop);
|
|
}
|
|
pbuf_free(p);
|
|
800ec70: 6878 ldr r0, [r7, #4]
|
|
800ec72: f7f8 f9af bl 8006fd4 <pbuf_free>
|
|
return;
|
|
800ec76: e007 b.n 800ec88 <icmp_input+0x294>
|
|
lenerr:
|
|
pbuf_free(p);
|
|
800ec78: 6878 ldr r0, [r7, #4]
|
|
800ec7a: f7f8 f9ab bl 8006fd4 <pbuf_free>
|
|
ICMP_STATS_INC(icmp.lenerr);
|
|
MIB2_STATS_INC(mib2.icmpinerrors);
|
|
return;
|
|
800ec7e: e003 b.n 800ec88 <icmp_input+0x294>
|
|
#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN || !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING
|
|
icmperr:
|
|
pbuf_free(p);
|
|
800ec80: 6878 ldr r0, [r7, #4]
|
|
800ec82: f7f8 f9a7 bl 8006fd4 <pbuf_free>
|
|
ICMP_STATS_INC(icmp.err);
|
|
MIB2_STATS_INC(mib2.icmpinerrors);
|
|
return;
|
|
800ec86: bf00 nop
|
|
#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN || !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */
|
|
}
|
|
800ec88: 3728 adds r7, #40 ; 0x28
|
|
800ec8a: 46bd mov sp, r7
|
|
800ec8c: bd80 pop {r7, pc}
|
|
800ec8e: bf00 nop
|
|
800ec90: 24004c10 .word 0x24004c10
|
|
800ec94: 08014554 .word 0x08014554
|
|
800ec98: 08014588 .word 0x08014588
|
|
800ec9c: 24004c24 .word 0x24004c24
|
|
800eca0: 080145b8 .word 0x080145b8
|
|
800eca4: 080145e4 .word 0x080145e4
|
|
800eca8: 08014610 .word 0x08014610
|
|
800ecac: 08014624 .word 0x08014624
|
|
800ecb0: 08014648 .word 0x08014648
|
|
800ecb4: 0801467c .word 0x0801467c
|
|
800ecb8: 080146b8 .word 0x080146b8
|
|
800ecbc: 080146e0 .word 0x080146e0
|
|
800ecc0: 08014708 .word 0x08014708
|
|
800ecc4: 08014740 .word 0x08014740
|
|
800ecc8: 08014778 .word 0x08014778
|
|
800eccc: 080147a0 .word 0x080147a0
|
|
800ecd0: 080147c8 .word 0x080147c8
|
|
800ecd4: 080147fc .word 0x080147fc
|
|
800ecd8: 08014820 .word 0x08014820
|
|
800ecdc: 08014850 .word 0x08014850
|
|
|
|
0800ece0 <icmp_dest_unreach>:
|
|
* p->payload pointing to the IP header
|
|
* @param t type of the 'unreachable' packet
|
|
*/
|
|
void
|
|
icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
|
|
{
|
|
800ece0: b580 push {r7, lr}
|
|
800ece2: b082 sub sp, #8
|
|
800ece4: af00 add r7, sp, #0
|
|
800ece6: 6078 str r0, [r7, #4]
|
|
800ece8: 460b mov r3, r1
|
|
800ecea: 70fb strb r3, [r7, #3]
|
|
MIB2_STATS_INC(mib2.icmpoutdestunreachs);
|
|
icmp_send_response(p, ICMP_DUR, t);
|
|
800ecec: 78fb ldrb r3, [r7, #3]
|
|
800ecee: 461a mov r2, r3
|
|
800ecf0: 2103 movs r1, #3
|
|
800ecf2: 6878 ldr r0, [r7, #4]
|
|
800ecf4: f000 f814 bl 800ed20 <icmp_send_response>
|
|
}
|
|
800ecf8: bf00 nop
|
|
800ecfa: 3708 adds r7, #8
|
|
800ecfc: 46bd mov sp, r7
|
|
800ecfe: bd80 pop {r7, pc}
|
|
|
|
0800ed00 <icmp_time_exceeded>:
|
|
* p->payload pointing to the IP header
|
|
* @param t type of the 'time exceeded' packet
|
|
*/
|
|
void
|
|
icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t)
|
|
{
|
|
800ed00: b580 push {r7, lr}
|
|
800ed02: b082 sub sp, #8
|
|
800ed04: af00 add r7, sp, #0
|
|
800ed06: 6078 str r0, [r7, #4]
|
|
800ed08: 460b mov r3, r1
|
|
800ed0a: 70fb strb r3, [r7, #3]
|
|
MIB2_STATS_INC(mib2.icmpouttimeexcds);
|
|
icmp_send_response(p, ICMP_TE, t);
|
|
800ed0c: 78fb ldrb r3, [r7, #3]
|
|
800ed0e: 461a mov r2, r3
|
|
800ed10: 210b movs r1, #11
|
|
800ed12: 6878 ldr r0, [r7, #4]
|
|
800ed14: f000 f804 bl 800ed20 <icmp_send_response>
|
|
}
|
|
800ed18: bf00 nop
|
|
800ed1a: 3708 adds r7, #8
|
|
800ed1c: 46bd mov sp, r7
|
|
800ed1e: bd80 pop {r7, pc}
|
|
|
|
0800ed20 <icmp_send_response>:
|
|
* @param type Type of the ICMP header
|
|
* @param code Code of the ICMP header
|
|
*/
|
|
static void
|
|
icmp_send_response(struct pbuf *p, u8_t type, u8_t code)
|
|
{
|
|
800ed20: b580 push {r7, lr}
|
|
800ed22: b08c sub sp, #48 ; 0x30
|
|
800ed24: af04 add r7, sp, #16
|
|
800ed26: 6078 str r0, [r7, #4]
|
|
800ed28: 460b mov r3, r1
|
|
800ed2a: 70fb strb r3, [r7, #3]
|
|
800ed2c: 4613 mov r3, r2
|
|
800ed2e: 70bb strb r3, [r7, #2]
|
|
|
|
/* increase number of messages attempted to send */
|
|
MIB2_STATS_INC(mib2.icmpoutmsgs);
|
|
|
|
/* ICMP header + IP header + 8 bytes of data */
|
|
q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE,
|
|
800ed30: f44f 7220 mov.w r2, #640 ; 0x280
|
|
800ed34: 2124 movs r1, #36 ; 0x24
|
|
800ed36: 2022 movs r0, #34 ; 0x22
|
|
800ed38: f7f7 fe68 bl 8006a0c <pbuf_alloc>
|
|
800ed3c: 61f8 str r0, [r7, #28]
|
|
PBUF_RAM);
|
|
if (q == NULL) {
|
|
800ed3e: 69fb ldr r3, [r7, #28]
|
|
800ed40: 2b00 cmp r3, #0
|
|
800ed42: d103 bne.n 800ed4c <icmp_send_response+0x2c>
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n"));
|
|
800ed44: 4849 ldr r0, [pc, #292] ; (800ee6c <icmp_send_response+0x14c>)
|
|
800ed46: f001 ffad bl 8010ca4 <puts>
|
|
800ed4a: e08c b.n 800ee66 <icmp_send_response+0x146>
|
|
MIB2_STATS_INC(mib2.icmpouterrors);
|
|
return;
|
|
}
|
|
LWIP_ASSERT("check that first pbuf can hold icmp message",
|
|
800ed4c: 69fb ldr r3, [r7, #28]
|
|
800ed4e: 895b ldrh r3, [r3, #10]
|
|
800ed50: 2b23 cmp r3, #35 ; 0x23
|
|
800ed52: d806 bhi.n 800ed62 <icmp_send_response+0x42>
|
|
800ed54: 4b46 ldr r3, [pc, #280] ; (800ee70 <icmp_send_response+0x150>)
|
|
800ed56: f44f 72b4 mov.w r2, #360 ; 0x168
|
|
800ed5a: 4946 ldr r1, [pc, #280] ; (800ee74 <icmp_send_response+0x154>)
|
|
800ed5c: 4846 ldr r0, [pc, #280] ; (800ee78 <icmp_send_response+0x158>)
|
|
800ed5e: f001 ff33 bl 8010bc8 <iprintf>
|
|
(q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE)));
|
|
|
|
iphdr = (struct ip_hdr *)p->payload;
|
|
800ed62: 687b ldr r3, [r7, #4]
|
|
800ed64: 685b ldr r3, [r3, #4]
|
|
800ed66: 61bb str r3, [r7, #24]
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from "));
|
|
800ed68: 4844 ldr r0, [pc, #272] ; (800ee7c <icmp_send_response+0x15c>)
|
|
800ed6a: f001 ff2d bl 8010bc8 <iprintf>
|
|
ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->src);
|
|
800ed6e: 69bb ldr r3, [r7, #24]
|
|
800ed70: 68db ldr r3, [r3, #12]
|
|
800ed72: b2db uxtb r3, r3
|
|
800ed74: 4619 mov r1, r3
|
|
800ed76: 69bb ldr r3, [r7, #24]
|
|
800ed78: 68db ldr r3, [r3, #12]
|
|
800ed7a: 0a1b lsrs r3, r3, #8
|
|
800ed7c: b2db uxtb r3, r3
|
|
800ed7e: 461a mov r2, r3
|
|
800ed80: 69bb ldr r3, [r7, #24]
|
|
800ed82: 68db ldr r3, [r3, #12]
|
|
800ed84: 0c1b lsrs r3, r3, #16
|
|
800ed86: b2db uxtb r3, r3
|
|
800ed88: 4618 mov r0, r3
|
|
800ed8a: 69bb ldr r3, [r7, #24]
|
|
800ed8c: 68db ldr r3, [r3, #12]
|
|
800ed8e: 0e1b lsrs r3, r3, #24
|
|
800ed90: b2db uxtb r3, r3
|
|
800ed92: 9300 str r3, [sp, #0]
|
|
800ed94: 4603 mov r3, r0
|
|
800ed96: 483a ldr r0, [pc, #232] ; (800ee80 <icmp_send_response+0x160>)
|
|
800ed98: f001 ff16 bl 8010bc8 <iprintf>
|
|
LWIP_DEBUGF(ICMP_DEBUG, (" to "));
|
|
800ed9c: 4839 ldr r0, [pc, #228] ; (800ee84 <icmp_send_response+0x164>)
|
|
800ed9e: f001 ff13 bl 8010bc8 <iprintf>
|
|
ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->dest);
|
|
800eda2: 69bb ldr r3, [r7, #24]
|
|
800eda4: 691b ldr r3, [r3, #16]
|
|
800eda6: b2db uxtb r3, r3
|
|
800eda8: 4619 mov r1, r3
|
|
800edaa: 69bb ldr r3, [r7, #24]
|
|
800edac: 691b ldr r3, [r3, #16]
|
|
800edae: 0a1b lsrs r3, r3, #8
|
|
800edb0: b2db uxtb r3, r3
|
|
800edb2: 461a mov r2, r3
|
|
800edb4: 69bb ldr r3, [r7, #24]
|
|
800edb6: 691b ldr r3, [r3, #16]
|
|
800edb8: 0c1b lsrs r3, r3, #16
|
|
800edba: b2db uxtb r3, r3
|
|
800edbc: 4618 mov r0, r3
|
|
800edbe: 69bb ldr r3, [r7, #24]
|
|
800edc0: 691b ldr r3, [r3, #16]
|
|
800edc2: 0e1b lsrs r3, r3, #24
|
|
800edc4: b2db uxtb r3, r3
|
|
800edc6: 9300 str r3, [sp, #0]
|
|
800edc8: 4603 mov r3, r0
|
|
800edca: 482d ldr r0, [pc, #180] ; (800ee80 <icmp_send_response+0x160>)
|
|
800edcc: f001 fefc bl 8010bc8 <iprintf>
|
|
LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
|
|
800edd0: 200a movs r0, #10
|
|
800edd2: f001 ff0b bl 8010bec <putchar>
|
|
|
|
icmphdr = (struct icmp_echo_hdr *)q->payload;
|
|
800edd6: 69fb ldr r3, [r7, #28]
|
|
800edd8: 685b ldr r3, [r3, #4]
|
|
800edda: 617b str r3, [r7, #20]
|
|
icmphdr->type = type;
|
|
800eddc: 697b ldr r3, [r7, #20]
|
|
800edde: 78fa ldrb r2, [r7, #3]
|
|
800ede0: 701a strb r2, [r3, #0]
|
|
icmphdr->code = code;
|
|
800ede2: 697b ldr r3, [r7, #20]
|
|
800ede4: 78ba ldrb r2, [r7, #2]
|
|
800ede6: 705a strb r2, [r3, #1]
|
|
icmphdr->id = 0;
|
|
800ede8: 697b ldr r3, [r7, #20]
|
|
800edea: 2200 movs r2, #0
|
|
800edec: 711a strb r2, [r3, #4]
|
|
800edee: 2200 movs r2, #0
|
|
800edf0: 715a strb r2, [r3, #5]
|
|
icmphdr->seqno = 0;
|
|
800edf2: 697b ldr r3, [r7, #20]
|
|
800edf4: 2200 movs r2, #0
|
|
800edf6: 719a strb r2, [r3, #6]
|
|
800edf8: 2200 movs r2, #0
|
|
800edfa: 71da strb r2, [r3, #7]
|
|
|
|
/* copy fields from original packet */
|
|
SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload,
|
|
800edfc: 69fb ldr r3, [r7, #28]
|
|
800edfe: 685b ldr r3, [r3, #4]
|
|
800ee00: f103 0008 add.w r0, r3, #8
|
|
800ee04: 687b ldr r3, [r7, #4]
|
|
800ee06: 685b ldr r3, [r3, #4]
|
|
800ee08: 221c movs r2, #28
|
|
800ee0a: 4619 mov r1, r3
|
|
800ee0c: f002 f8bd bl 8010f8a <memcpy>
|
|
IP_HLEN + ICMP_DEST_UNREACH_DATASIZE);
|
|
|
|
ip4_addr_copy(iphdr_src, iphdr->src);
|
|
800ee10: 69bb ldr r3, [r7, #24]
|
|
800ee12: 68db ldr r3, [r3, #12]
|
|
800ee14: 60fb str r3, [r7, #12]
|
|
ip4_addr_t iphdr_dst;
|
|
ip4_addr_copy(iphdr_dst, iphdr->dest);
|
|
netif = ip4_route_src(&iphdr_dst, &iphdr_src);
|
|
}
|
|
#else
|
|
netif = ip4_route(&iphdr_src);
|
|
800ee16: f107 030c add.w r3, r7, #12
|
|
800ee1a: 4618 mov r0, r3
|
|
800ee1c: f000 f834 bl 800ee88 <ip4_route>
|
|
800ee20: 6138 str r0, [r7, #16]
|
|
#endif
|
|
if (netif != NULL) {
|
|
800ee22: 693b ldr r3, [r7, #16]
|
|
800ee24: 2b00 cmp r3, #0
|
|
800ee26: d01b beq.n 800ee60 <icmp_send_response+0x140>
|
|
/* calculate checksum */
|
|
icmphdr->chksum = 0;
|
|
800ee28: 697b ldr r3, [r7, #20]
|
|
800ee2a: 2200 movs r2, #0
|
|
800ee2c: 709a strb r2, [r3, #2]
|
|
800ee2e: 2200 movs r2, #0
|
|
800ee30: 70da strb r2, [r3, #3]
|
|
#if CHECKSUM_GEN_ICMP
|
|
IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP) {
|
|
icmphdr->chksum = inet_chksum(icmphdr, q->len);
|
|
800ee32: 69fb ldr r3, [r7, #28]
|
|
800ee34: 895b ldrh r3, [r3, #10]
|
|
800ee36: 4619 mov r1, r3
|
|
800ee38: 6978 ldr r0, [r7, #20]
|
|
800ee3a: f7f6 fc12 bl 8005662 <inet_chksum>
|
|
800ee3e: 4603 mov r3, r0
|
|
800ee40: 461a mov r2, r3
|
|
800ee42: 697b ldr r3, [r7, #20]
|
|
800ee44: 805a strh r2, [r3, #2]
|
|
}
|
|
#endif
|
|
ICMP_STATS_INC(icmp.xmit);
|
|
ip4_output_if(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP, netif);
|
|
800ee46: f107 020c add.w r2, r7, #12
|
|
800ee4a: 693b ldr r3, [r7, #16]
|
|
800ee4c: 9302 str r3, [sp, #8]
|
|
800ee4e: 2301 movs r3, #1
|
|
800ee50: 9301 str r3, [sp, #4]
|
|
800ee52: 2300 movs r3, #0
|
|
800ee54: 9300 str r3, [sp, #0]
|
|
800ee56: 23ff movs r3, #255 ; 0xff
|
|
800ee58: 2100 movs r1, #0
|
|
800ee5a: 69f8 ldr r0, [r7, #28]
|
|
800ee5c: f000 f9d2 bl 800f204 <ip4_output_if>
|
|
}
|
|
pbuf_free(q);
|
|
800ee60: 69f8 ldr r0, [r7, #28]
|
|
800ee62: f7f8 f8b7 bl 8006fd4 <pbuf_free>
|
|
}
|
|
800ee66: 3720 adds r7, #32
|
|
800ee68: 46bd mov sp, r7
|
|
800ee6a: bd80 pop {r7, pc}
|
|
800ee6c: 08014884 .word 0x08014884
|
|
800ee70: 08014708 .word 0x08014708
|
|
800ee74: 080148c4 .word 0x080148c4
|
|
800ee78: 08014778 .word 0x08014778
|
|
800ee7c: 080148f0 .word 0x080148f0
|
|
800ee80: 0801490c .word 0x0801490c
|
|
800ee84: 0801491c .word 0x0801491c
|
|
|
|
0800ee88 <ip4_route>:
|
|
* @param dest the destination IP address for which to find the route
|
|
* @return the netif on which to send to reach dest
|
|
*/
|
|
struct netif *
|
|
ip4_route(const ip4_addr_t *dest)
|
|
{
|
|
800ee88: b480 push {r7}
|
|
800ee8a: b085 sub sp, #20
|
|
800ee8c: af00 add r7, sp, #0
|
|
800ee8e: 6078 str r0, [r7, #4]
|
|
|
|
/* bug #54569: in case LWIP_SINGLE_NETIF=1 and LWIP_DEBUGF() disabled, the following loop is optimized away */
|
|
LWIP_UNUSED_ARG(dest);
|
|
|
|
/* iterate through netifs */
|
|
NETIF_FOREACH(netif) {
|
|
800ee90: 4b33 ldr r3, [pc, #204] ; (800ef60 <ip4_route+0xd8>)
|
|
800ee92: 681b ldr r3, [r3, #0]
|
|
800ee94: 60fb str r3, [r7, #12]
|
|
800ee96: e036 b.n 800ef06 <ip4_route+0x7e>
|
|
/* is the netif up, does it have a link and a valid address? */
|
|
if (netif_is_up(netif) && netif_is_link_up(netif) && !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
|
|
800ee98: 68fb ldr r3, [r7, #12]
|
|
800ee9a: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800ee9e: f003 0301 and.w r3, r3, #1
|
|
800eea2: b2db uxtb r3, r3
|
|
800eea4: 2b00 cmp r3, #0
|
|
800eea6: d02b beq.n 800ef00 <ip4_route+0x78>
|
|
800eea8: 68fb ldr r3, [r7, #12]
|
|
800eeaa: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800eeae: 089b lsrs r3, r3, #2
|
|
800eeb0: f003 0301 and.w r3, r3, #1
|
|
800eeb4: b2db uxtb r3, r3
|
|
800eeb6: 2b00 cmp r3, #0
|
|
800eeb8: d022 beq.n 800ef00 <ip4_route+0x78>
|
|
800eeba: 68fb ldr r3, [r7, #12]
|
|
800eebc: 3304 adds r3, #4
|
|
800eebe: 681b ldr r3, [r3, #0]
|
|
800eec0: 2b00 cmp r3, #0
|
|
800eec2: d01d beq.n 800ef00 <ip4_route+0x78>
|
|
/* network mask matches? */
|
|
if (ip4_addr_netcmp(dest, netif_ip4_addr(netif), netif_ip4_netmask(netif))) {
|
|
800eec4: 687b ldr r3, [r7, #4]
|
|
800eec6: 681a ldr r2, [r3, #0]
|
|
800eec8: 68fb ldr r3, [r7, #12]
|
|
800eeca: 3304 adds r3, #4
|
|
800eecc: 681b ldr r3, [r3, #0]
|
|
800eece: 405a eors r2, r3
|
|
800eed0: 68fb ldr r3, [r7, #12]
|
|
800eed2: 3308 adds r3, #8
|
|
800eed4: 681b ldr r3, [r3, #0]
|
|
800eed6: 4013 ands r3, r2
|
|
800eed8: 2b00 cmp r3, #0
|
|
800eeda: d101 bne.n 800eee0 <ip4_route+0x58>
|
|
/* return netif on which to forward IP packet */
|
|
return netif;
|
|
800eedc: 68fb ldr r3, [r7, #12]
|
|
800eede: e038 b.n 800ef52 <ip4_route+0xca>
|
|
}
|
|
/* gateway matches on a non broadcast interface? (i.e. peer in a point to point interface) */
|
|
if (((netif->flags & NETIF_FLAG_BROADCAST) == 0) && ip4_addr_cmp(dest, netif_ip4_gw(netif))) {
|
|
800eee0: 68fb ldr r3, [r7, #12]
|
|
800eee2: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800eee6: f003 0302 and.w r3, r3, #2
|
|
800eeea: 2b00 cmp r3, #0
|
|
800eeec: d108 bne.n 800ef00 <ip4_route+0x78>
|
|
800eeee: 687b ldr r3, [r7, #4]
|
|
800eef0: 681a ldr r2, [r3, #0]
|
|
800eef2: 68fb ldr r3, [r7, #12]
|
|
800eef4: 330c adds r3, #12
|
|
800eef6: 681b ldr r3, [r3, #0]
|
|
800eef8: 429a cmp r2, r3
|
|
800eefa: d101 bne.n 800ef00 <ip4_route+0x78>
|
|
/* return netif on which to forward IP packet */
|
|
return netif;
|
|
800eefc: 68fb ldr r3, [r7, #12]
|
|
800eefe: e028 b.n 800ef52 <ip4_route+0xca>
|
|
NETIF_FOREACH(netif) {
|
|
800ef00: 68fb ldr r3, [r7, #12]
|
|
800ef02: 681b ldr r3, [r3, #0]
|
|
800ef04: 60fb str r3, [r7, #12]
|
|
800ef06: 68fb ldr r3, [r7, #12]
|
|
800ef08: 2b00 cmp r3, #0
|
|
800ef0a: d1c5 bne.n 800ee98 <ip4_route+0x10>
|
|
return netif;
|
|
}
|
|
#endif
|
|
#endif /* !LWIP_SINGLE_NETIF */
|
|
|
|
if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) ||
|
|
800ef0c: 4b15 ldr r3, [pc, #84] ; (800ef64 <ip4_route+0xdc>)
|
|
800ef0e: 681b ldr r3, [r3, #0]
|
|
800ef10: 2b00 cmp r3, #0
|
|
800ef12: d01a beq.n 800ef4a <ip4_route+0xc2>
|
|
800ef14: 4b13 ldr r3, [pc, #76] ; (800ef64 <ip4_route+0xdc>)
|
|
800ef16: 681b ldr r3, [r3, #0]
|
|
800ef18: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800ef1c: f003 0301 and.w r3, r3, #1
|
|
800ef20: 2b00 cmp r3, #0
|
|
800ef22: d012 beq.n 800ef4a <ip4_route+0xc2>
|
|
800ef24: 4b0f ldr r3, [pc, #60] ; (800ef64 <ip4_route+0xdc>)
|
|
800ef26: 681b ldr r3, [r3, #0]
|
|
800ef28: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800ef2c: f003 0304 and.w r3, r3, #4
|
|
800ef30: 2b00 cmp r3, #0
|
|
800ef32: d00a beq.n 800ef4a <ip4_route+0xc2>
|
|
ip4_addr_isany_val(*netif_ip4_addr(netif_default)) || ip4_addr_isloopback(dest)) {
|
|
800ef34: 4b0b ldr r3, [pc, #44] ; (800ef64 <ip4_route+0xdc>)
|
|
800ef36: 681b ldr r3, [r3, #0]
|
|
800ef38: 3304 adds r3, #4
|
|
800ef3a: 681b ldr r3, [r3, #0]
|
|
if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) ||
|
|
800ef3c: 2b00 cmp r3, #0
|
|
800ef3e: d004 beq.n 800ef4a <ip4_route+0xc2>
|
|
ip4_addr_isany_val(*netif_ip4_addr(netif_default)) || ip4_addr_isloopback(dest)) {
|
|
800ef40: 687b ldr r3, [r7, #4]
|
|
800ef42: 681b ldr r3, [r3, #0]
|
|
800ef44: b2db uxtb r3, r3
|
|
800ef46: 2b7f cmp r3, #127 ; 0x7f
|
|
800ef48: d101 bne.n 800ef4e <ip4_route+0xc6>
|
|
If this is not good enough for you, use LWIP_HOOK_IP4_ROUTE() */
|
|
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_route: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
|
|
ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
|
|
IP_STATS_INC(ip.rterr);
|
|
MIB2_STATS_INC(mib2.ipoutnoroutes);
|
|
return NULL;
|
|
800ef4a: 2300 movs r3, #0
|
|
800ef4c: e001 b.n 800ef52 <ip4_route+0xca>
|
|
}
|
|
|
|
return netif_default;
|
|
800ef4e: 4b05 ldr r3, [pc, #20] ; (800ef64 <ip4_route+0xdc>)
|
|
800ef50: 681b ldr r3, [r3, #0]
|
|
}
|
|
800ef52: 4618 mov r0, r3
|
|
800ef54: 3714 adds r7, #20
|
|
800ef56: 46bd mov sp, r7
|
|
800ef58: f85d 7b04 ldr.w r7, [sp], #4
|
|
800ef5c: 4770 bx lr
|
|
800ef5e: bf00 nop
|
|
800ef60: 24007b60 .word 0x24007b60
|
|
800ef64: 24007b64 .word 0x24007b64
|
|
|
|
0800ef68 <ip4_input_accept>:
|
|
#endif /* IP_FORWARD */
|
|
|
|
/** Return true if the current input packet should be accepted on this netif */
|
|
static int
|
|
ip4_input_accept(struct netif *netif)
|
|
{
|
|
800ef68: b580 push {r7, lr}
|
|
800ef6a: b082 sub sp, #8
|
|
800ef6c: af00 add r7, sp, #0
|
|
800ef6e: 6078 str r0, [r7, #4]
|
|
ip4_addr_get_u32(ip4_current_dest_addr()) & ip4_addr_get_u32(netif_ip4_netmask(netif)),
|
|
ip4_addr_get_u32(netif_ip4_addr(netif)) & ip4_addr_get_u32(netif_ip4_netmask(netif)),
|
|
ip4_addr_get_u32(ip4_current_dest_addr()) & ~ip4_addr_get_u32(netif_ip4_netmask(netif))));
|
|
|
|
/* interface is up and configured? */
|
|
if ((netif_is_up(netif)) && (!ip4_addr_isany_val(*netif_ip4_addr(netif)))) {
|
|
800ef70: 687b ldr r3, [r7, #4]
|
|
800ef72: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800ef76: f003 0301 and.w r3, r3, #1
|
|
800ef7a: b2db uxtb r3, r3
|
|
800ef7c: 2b00 cmp r3, #0
|
|
800ef7e: d016 beq.n 800efae <ip4_input_accept+0x46>
|
|
800ef80: 687b ldr r3, [r7, #4]
|
|
800ef82: 3304 adds r3, #4
|
|
800ef84: 681b ldr r3, [r3, #0]
|
|
800ef86: 2b00 cmp r3, #0
|
|
800ef88: d011 beq.n 800efae <ip4_input_accept+0x46>
|
|
/* unicast to this interface address? */
|
|
if (ip4_addr_cmp(ip4_current_dest_addr(), netif_ip4_addr(netif)) ||
|
|
800ef8a: 4b0b ldr r3, [pc, #44] ; (800efb8 <ip4_input_accept+0x50>)
|
|
800ef8c: 695a ldr r2, [r3, #20]
|
|
800ef8e: 687b ldr r3, [r7, #4]
|
|
800ef90: 3304 adds r3, #4
|
|
800ef92: 681b ldr r3, [r3, #0]
|
|
800ef94: 429a cmp r2, r3
|
|
800ef96: d008 beq.n 800efaa <ip4_input_accept+0x42>
|
|
/* or broadcast on this interface network address? */
|
|
ip4_addr_isbroadcast(ip4_current_dest_addr(), netif)
|
|
800ef98: 4b07 ldr r3, [pc, #28] ; (800efb8 <ip4_input_accept+0x50>)
|
|
800ef9a: 695b ldr r3, [r3, #20]
|
|
800ef9c: 6879 ldr r1, [r7, #4]
|
|
800ef9e: 4618 mov r0, r3
|
|
800efa0: f000 fa08 bl 800f3b4 <ip4_addr_isbroadcast_u32>
|
|
800efa4: 4603 mov r3, r0
|
|
if (ip4_addr_cmp(ip4_current_dest_addr(), netif_ip4_addr(netif)) ||
|
|
800efa6: 2b00 cmp r3, #0
|
|
800efa8: d001 beq.n 800efae <ip4_input_accept+0x46>
|
|
#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */
|
|
) {
|
|
LWIP_DEBUGF(IP_DEBUG, ("ip4_input: packet accepted on interface %c%c\n",
|
|
netif->name[0], netif->name[1]));
|
|
/* accept on this netif */
|
|
return 1;
|
|
800efaa: 2301 movs r3, #1
|
|
800efac: e000 b.n 800efb0 <ip4_input_accept+0x48>
|
|
/* accept on this netif */
|
|
return 1;
|
|
}
|
|
#endif /* LWIP_AUTOIP */
|
|
}
|
|
return 0;
|
|
800efae: 2300 movs r3, #0
|
|
}
|
|
800efb0: 4618 mov r0, r3
|
|
800efb2: 3708 adds r7, #8
|
|
800efb4: 46bd mov sp, r7
|
|
800efb6: bd80 pop {r7, pc}
|
|
800efb8: 24004c10 .word 0x24004c10
|
|
|
|
0800efbc <ip4_input>:
|
|
* @return ERR_OK if the packet was processed (could return ERR_* if it wasn't
|
|
* processed, but currently always returns ERR_OK)
|
|
*/
|
|
err_t
|
|
ip4_input(struct pbuf *p, struct netif *inp)
|
|
{
|
|
800efbc: b580 push {r7, lr}
|
|
800efbe: b086 sub sp, #24
|
|
800efc0: af00 add r7, sp, #0
|
|
800efc2: 6078 str r0, [r7, #4]
|
|
800efc4: 6039 str r1, [r7, #0]
|
|
|
|
IP_STATS_INC(ip.recv);
|
|
MIB2_STATS_INC(mib2.ipinreceives);
|
|
|
|
/* identify the IP header */
|
|
iphdr = (struct ip_hdr *)p->payload;
|
|
800efc6: 687b ldr r3, [r7, #4]
|
|
800efc8: 685b ldr r3, [r3, #4]
|
|
800efca: 613b str r3, [r7, #16]
|
|
if (IPH_V(iphdr) != 4) {
|
|
800efcc: 693b ldr r3, [r7, #16]
|
|
800efce: 781b ldrb r3, [r3, #0]
|
|
800efd0: 091b lsrs r3, r3, #4
|
|
800efd2: b2db uxtb r3, r3
|
|
800efd4: 2b04 cmp r3, #4
|
|
800efd6: d004 beq.n 800efe2 <ip4_input+0x26>
|
|
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", (u16_t)IPH_V(iphdr)));
|
|
ip4_debug_print(p);
|
|
pbuf_free(p);
|
|
800efd8: 6878 ldr r0, [r7, #4]
|
|
800efda: f7f7 fffb bl 8006fd4 <pbuf_free>
|
|
IP_STATS_INC(ip.err);
|
|
IP_STATS_INC(ip.drop);
|
|
MIB2_STATS_INC(mib2.ipinhdrerrors);
|
|
return ERR_OK;
|
|
800efde: 2300 movs r3, #0
|
|
800efe0: e107 b.n 800f1f2 <ip4_input+0x236>
|
|
return ERR_OK;
|
|
}
|
|
#endif
|
|
|
|
/* obtain IP header length in bytes */
|
|
iphdr_hlen = IPH_HL_BYTES(iphdr);
|
|
800efe2: 693b ldr r3, [r7, #16]
|
|
800efe4: 781b ldrb r3, [r3, #0]
|
|
800efe6: f003 030f and.w r3, r3, #15
|
|
800efea: b2db uxtb r3, r3
|
|
800efec: 009b lsls r3, r3, #2
|
|
800efee: b2db uxtb r3, r3
|
|
800eff0: 81fb strh r3, [r7, #14]
|
|
/* obtain ip length in bytes */
|
|
iphdr_len = lwip_ntohs(IPH_LEN(iphdr));
|
|
800eff2: 693b ldr r3, [r7, #16]
|
|
800eff4: 885b ldrh r3, [r3, #2]
|
|
800eff6: b29b uxth r3, r3
|
|
800eff8: 4618 mov r0, r3
|
|
800effa: f7f6 faa7 bl 800554c <lwip_htons>
|
|
800effe: 4603 mov r3, r0
|
|
800f000: 81bb strh r3, [r7, #12]
|
|
|
|
/* Trim pbuf. This is especially required for packets < 60 bytes. */
|
|
if (iphdr_len < p->tot_len) {
|
|
800f002: 687b ldr r3, [r7, #4]
|
|
800f004: 891b ldrh r3, [r3, #8]
|
|
800f006: 89ba ldrh r2, [r7, #12]
|
|
800f008: 429a cmp r2, r3
|
|
800f00a: d204 bcs.n 800f016 <ip4_input+0x5a>
|
|
pbuf_realloc(p, iphdr_len);
|
|
800f00c: 89bb ldrh r3, [r7, #12]
|
|
800f00e: 4619 mov r1, r3
|
|
800f010: 6878 ldr r0, [r7, #4]
|
|
800f012: f7f7 fe59 bl 8006cc8 <pbuf_realloc>
|
|
}
|
|
|
|
/* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
|
|
if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len) || (iphdr_hlen < IP_HLEN)) {
|
|
800f016: 687b ldr r3, [r7, #4]
|
|
800f018: 895b ldrh r3, [r3, #10]
|
|
800f01a: 89fa ldrh r2, [r7, #14]
|
|
800f01c: 429a cmp r2, r3
|
|
800f01e: d807 bhi.n 800f030 <ip4_input+0x74>
|
|
800f020: 687b ldr r3, [r7, #4]
|
|
800f022: 891b ldrh r3, [r3, #8]
|
|
800f024: 89ba ldrh r2, [r7, #12]
|
|
800f026: 429a cmp r2, r3
|
|
800f028: d802 bhi.n 800f030 <ip4_input+0x74>
|
|
800f02a: 89fb ldrh r3, [r7, #14]
|
|
800f02c: 2b13 cmp r3, #19
|
|
800f02e: d804 bhi.n 800f03a <ip4_input+0x7e>
|
|
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
|
|
("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
|
|
iphdr_len, p->tot_len));
|
|
}
|
|
/* free (drop) packet pbufs */
|
|
pbuf_free(p);
|
|
800f030: 6878 ldr r0, [r7, #4]
|
|
800f032: f7f7 ffcf bl 8006fd4 <pbuf_free>
|
|
IP_STATS_INC(ip.lenerr);
|
|
IP_STATS_INC(ip.drop);
|
|
MIB2_STATS_INC(mib2.ipindiscards);
|
|
return ERR_OK;
|
|
800f036: 2300 movs r3, #0
|
|
800f038: e0db b.n 800f1f2 <ip4_input+0x236>
|
|
}
|
|
}
|
|
#endif
|
|
|
|
/* copy IP addresses to aligned ip_addr_t */
|
|
ip_addr_copy_from_ip4(ip_data.current_iphdr_dest, iphdr->dest);
|
|
800f03a: 693b ldr r3, [r7, #16]
|
|
800f03c: 691b ldr r3, [r3, #16]
|
|
800f03e: 4a6f ldr r2, [pc, #444] ; (800f1fc <ip4_input+0x240>)
|
|
800f040: 6153 str r3, [r2, #20]
|
|
ip_addr_copy_from_ip4(ip_data.current_iphdr_src, iphdr->src);
|
|
800f042: 693b ldr r3, [r7, #16]
|
|
800f044: 68db ldr r3, [r3, #12]
|
|
800f046: 4a6d ldr r2, [pc, #436] ; (800f1fc <ip4_input+0x240>)
|
|
800f048: 6113 str r3, [r2, #16]
|
|
|
|
/* match packet against an interface, i.e. is this packet for us? */
|
|
if (ip4_addr_ismulticast(ip4_current_dest_addr())) {
|
|
800f04a: 4b6c ldr r3, [pc, #432] ; (800f1fc <ip4_input+0x240>)
|
|
800f04c: 695b ldr r3, [r3, #20]
|
|
800f04e: f003 03f0 and.w r3, r3, #240 ; 0xf0
|
|
800f052: 2be0 cmp r3, #224 ; 0xe0
|
|
800f054: d112 bne.n 800f07c <ip4_input+0xc0>
|
|
netif = inp;
|
|
} else {
|
|
netif = NULL;
|
|
}
|
|
#else /* LWIP_IGMP */
|
|
if ((netif_is_up(inp)) && (!ip4_addr_isany_val(*netif_ip4_addr(inp)))) {
|
|
800f056: 683b ldr r3, [r7, #0]
|
|
800f058: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800f05c: f003 0301 and.w r3, r3, #1
|
|
800f060: b2db uxtb r3, r3
|
|
800f062: 2b00 cmp r3, #0
|
|
800f064: d007 beq.n 800f076 <ip4_input+0xba>
|
|
800f066: 683b ldr r3, [r7, #0]
|
|
800f068: 3304 adds r3, #4
|
|
800f06a: 681b ldr r3, [r3, #0]
|
|
800f06c: 2b00 cmp r3, #0
|
|
800f06e: d002 beq.n 800f076 <ip4_input+0xba>
|
|
netif = inp;
|
|
800f070: 683b ldr r3, [r7, #0]
|
|
800f072: 617b str r3, [r7, #20]
|
|
800f074: e02a b.n 800f0cc <ip4_input+0x110>
|
|
} else {
|
|
netif = NULL;
|
|
800f076: 2300 movs r3, #0
|
|
800f078: 617b str r3, [r7, #20]
|
|
800f07a: e027 b.n 800f0cc <ip4_input+0x110>
|
|
}
|
|
#endif /* LWIP_IGMP */
|
|
} else {
|
|
/* start trying with inp. if that's not acceptable, start walking the
|
|
list of configured netifs. */
|
|
if (ip4_input_accept(inp)) {
|
|
800f07c: 6838 ldr r0, [r7, #0]
|
|
800f07e: f7ff ff73 bl 800ef68 <ip4_input_accept>
|
|
800f082: 4603 mov r3, r0
|
|
800f084: 2b00 cmp r3, #0
|
|
800f086: d002 beq.n 800f08e <ip4_input+0xd2>
|
|
netif = inp;
|
|
800f088: 683b ldr r3, [r7, #0]
|
|
800f08a: 617b str r3, [r7, #20]
|
|
800f08c: e01e b.n 800f0cc <ip4_input+0x110>
|
|
} else {
|
|
netif = NULL;
|
|
800f08e: 2300 movs r3, #0
|
|
800f090: 617b str r3, [r7, #20]
|
|
#if !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF
|
|
/* Packets sent to the loopback address must not be accepted on an
|
|
* interface that does not have the loopback address assigned to it,
|
|
* unless a non-loopback interface is used for loopback traffic. */
|
|
if (!ip4_addr_isloopback(ip4_current_dest_addr()))
|
|
800f092: 4b5a ldr r3, [pc, #360] ; (800f1fc <ip4_input+0x240>)
|
|
800f094: 695b ldr r3, [r3, #20]
|
|
800f096: b2db uxtb r3, r3
|
|
800f098: 2b7f cmp r3, #127 ; 0x7f
|
|
800f09a: d017 beq.n 800f0cc <ip4_input+0x110>
|
|
#endif /* !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF */
|
|
{
|
|
#if !LWIP_SINGLE_NETIF
|
|
NETIF_FOREACH(netif) {
|
|
800f09c: 4b58 ldr r3, [pc, #352] ; (800f200 <ip4_input+0x244>)
|
|
800f09e: 681b ldr r3, [r3, #0]
|
|
800f0a0: 617b str r3, [r7, #20]
|
|
800f0a2: e00e b.n 800f0c2 <ip4_input+0x106>
|
|
if (netif == inp) {
|
|
800f0a4: 697a ldr r2, [r7, #20]
|
|
800f0a6: 683b ldr r3, [r7, #0]
|
|
800f0a8: 429a cmp r2, r3
|
|
800f0aa: d006 beq.n 800f0ba <ip4_input+0xfe>
|
|
/* we checked that before already */
|
|
continue;
|
|
}
|
|
if (ip4_input_accept(netif)) {
|
|
800f0ac: 6978 ldr r0, [r7, #20]
|
|
800f0ae: f7ff ff5b bl 800ef68 <ip4_input_accept>
|
|
800f0b2: 4603 mov r3, r0
|
|
800f0b4: 2b00 cmp r3, #0
|
|
800f0b6: d108 bne.n 800f0ca <ip4_input+0x10e>
|
|
800f0b8: e000 b.n 800f0bc <ip4_input+0x100>
|
|
continue;
|
|
800f0ba: bf00 nop
|
|
NETIF_FOREACH(netif) {
|
|
800f0bc: 697b ldr r3, [r7, #20]
|
|
800f0be: 681b ldr r3, [r3, #0]
|
|
800f0c0: 617b str r3, [r7, #20]
|
|
800f0c2: 697b ldr r3, [r7, #20]
|
|
800f0c4: 2b00 cmp r3, #0
|
|
800f0c6: d1ed bne.n 800f0a4 <ip4_input+0xe8>
|
|
800f0c8: e000 b.n 800f0cc <ip4_input+0x110>
|
|
break;
|
|
800f0ca: bf00 nop
|
|
&& !ip4_addr_isany_val(*ip4_current_src_addr())
|
|
#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
|
|
)
|
|
#endif /* LWIP_IGMP || IP_ACCEPT_LINK_LAYER_ADDRESSING */
|
|
{
|
|
if ((ip4_addr_isbroadcast(ip4_current_src_addr(), inp)) ||
|
|
800f0cc: 4b4b ldr r3, [pc, #300] ; (800f1fc <ip4_input+0x240>)
|
|
800f0ce: 691b ldr r3, [r3, #16]
|
|
800f0d0: 6839 ldr r1, [r7, #0]
|
|
800f0d2: 4618 mov r0, r3
|
|
800f0d4: f000 f96e bl 800f3b4 <ip4_addr_isbroadcast_u32>
|
|
800f0d8: 4603 mov r3, r0
|
|
800f0da: 2b00 cmp r3, #0
|
|
800f0dc: d105 bne.n 800f0ea <ip4_input+0x12e>
|
|
(ip4_addr_ismulticast(ip4_current_src_addr()))) {
|
|
800f0de: 4b47 ldr r3, [pc, #284] ; (800f1fc <ip4_input+0x240>)
|
|
800f0e0: 691b ldr r3, [r3, #16]
|
|
800f0e2: f003 03f0 and.w r3, r3, #240 ; 0xf0
|
|
if ((ip4_addr_isbroadcast(ip4_current_src_addr(), inp)) ||
|
|
800f0e6: 2be0 cmp r3, #224 ; 0xe0
|
|
800f0e8: d104 bne.n 800f0f4 <ip4_input+0x138>
|
|
/* packet source is not valid */
|
|
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip4_input: packet source is not valid.\n"));
|
|
/* free (drop) packet pbufs */
|
|
pbuf_free(p);
|
|
800f0ea: 6878 ldr r0, [r7, #4]
|
|
800f0ec: f7f7 ff72 bl 8006fd4 <pbuf_free>
|
|
IP_STATS_INC(ip.drop);
|
|
MIB2_STATS_INC(mib2.ipinaddrerrors);
|
|
MIB2_STATS_INC(mib2.ipindiscards);
|
|
return ERR_OK;
|
|
800f0f0: 2300 movs r3, #0
|
|
800f0f2: e07e b.n 800f1f2 <ip4_input+0x236>
|
|
}
|
|
}
|
|
|
|
/* packet not for us? */
|
|
if (netif == NULL) {
|
|
800f0f4: 697b ldr r3, [r7, #20]
|
|
800f0f6: 2b00 cmp r3, #0
|
|
800f0f8: d104 bne.n 800f104 <ip4_input+0x148>
|
|
{
|
|
IP_STATS_INC(ip.drop);
|
|
MIB2_STATS_INC(mib2.ipinaddrerrors);
|
|
MIB2_STATS_INC(mib2.ipindiscards);
|
|
}
|
|
pbuf_free(p);
|
|
800f0fa: 6878 ldr r0, [r7, #4]
|
|
800f0fc: f7f7 ff6a bl 8006fd4 <pbuf_free>
|
|
return ERR_OK;
|
|
800f100: 2300 movs r3, #0
|
|
800f102: e076 b.n 800f1f2 <ip4_input+0x236>
|
|
}
|
|
/* packet consists of multiple fragments? */
|
|
if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) {
|
|
800f104: 693b ldr r3, [r7, #16]
|
|
800f106: 88db ldrh r3, [r3, #6]
|
|
800f108: b29b uxth r3, r3
|
|
800f10a: 461a mov r2, r3
|
|
800f10c: f64f 733f movw r3, #65343 ; 0xff3f
|
|
800f110: 4013 ands r3, r2
|
|
800f112: 2b00 cmp r3, #0
|
|
800f114: d00b beq.n 800f12e <ip4_input+0x172>
|
|
#if IP_REASSEMBLY /* packet fragment reassembly code present? */
|
|
LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip4_reass()\n",
|
|
lwip_ntohs(IPH_ID(iphdr)), p->tot_len, lwip_ntohs(IPH_LEN(iphdr)), (u16_t)!!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (u16_t)((lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK) * 8)));
|
|
/* reassemble the packet*/
|
|
p = ip4_reass(p);
|
|
800f116: 6878 ldr r0, [r7, #4]
|
|
800f118: f000 fc92 bl 800fa40 <ip4_reass>
|
|
800f11c: 6078 str r0, [r7, #4]
|
|
/* packet not fully reassembled yet? */
|
|
if (p == NULL) {
|
|
800f11e: 687b ldr r3, [r7, #4]
|
|
800f120: 2b00 cmp r3, #0
|
|
800f122: d101 bne.n 800f128 <ip4_input+0x16c>
|
|
return ERR_OK;
|
|
800f124: 2300 movs r3, #0
|
|
800f126: e064 b.n 800f1f2 <ip4_input+0x236>
|
|
}
|
|
iphdr = (const struct ip_hdr *)p->payload;
|
|
800f128: 687b ldr r3, [r7, #4]
|
|
800f12a: 685b ldr r3, [r3, #4]
|
|
800f12c: 613b str r3, [r7, #16]
|
|
/* send to upper layers */
|
|
LWIP_DEBUGF(IP_DEBUG, ("ip4_input: \n"));
|
|
ip4_debug_print(p);
|
|
LWIP_DEBUGF(IP_DEBUG, ("ip4_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
|
|
|
|
ip_data.current_netif = netif;
|
|
800f12e: 4a33 ldr r2, [pc, #204] ; (800f1fc <ip4_input+0x240>)
|
|
800f130: 697b ldr r3, [r7, #20]
|
|
800f132: 6013 str r3, [r2, #0]
|
|
ip_data.current_input_netif = inp;
|
|
800f134: 4a31 ldr r2, [pc, #196] ; (800f1fc <ip4_input+0x240>)
|
|
800f136: 683b ldr r3, [r7, #0]
|
|
800f138: 6053 str r3, [r2, #4]
|
|
ip_data.current_ip4_header = iphdr;
|
|
800f13a: 4a30 ldr r2, [pc, #192] ; (800f1fc <ip4_input+0x240>)
|
|
800f13c: 693b ldr r3, [r7, #16]
|
|
800f13e: 6093 str r3, [r2, #8]
|
|
ip_data.current_ip_header_tot_len = IPH_HL_BYTES(iphdr);
|
|
800f140: 693b ldr r3, [r7, #16]
|
|
800f142: 781b ldrb r3, [r3, #0]
|
|
800f144: f003 030f and.w r3, r3, #15
|
|
800f148: b2db uxtb r3, r3
|
|
800f14a: 009b lsls r3, r3, #2
|
|
800f14c: b2db uxtb r3, r3
|
|
800f14e: b29a uxth r2, r3
|
|
800f150: 4b2a ldr r3, [pc, #168] ; (800f1fc <ip4_input+0x240>)
|
|
800f152: 819a strh r2, [r3, #12]
|
|
/* raw input did not eat the packet? */
|
|
raw_status = raw_input(p, inp);
|
|
if (raw_status != RAW_INPUT_EATEN)
|
|
#endif /* LWIP_RAW */
|
|
{
|
|
pbuf_remove_header(p, iphdr_hlen); /* Move to payload, no check necessary. */
|
|
800f154: 89fb ldrh r3, [r7, #14]
|
|
800f156: 4619 mov r1, r3
|
|
800f158: 6878 ldr r0, [r7, #4]
|
|
800f15a: f7f7 feb5 bl 8006ec8 <pbuf_remove_header>
|
|
|
|
switch (IPH_PROTO(iphdr)) {
|
|
800f15e: 693b ldr r3, [r7, #16]
|
|
800f160: 7a5b ldrb r3, [r3, #9]
|
|
800f162: 2b11 cmp r3, #17
|
|
800f164: d006 beq.n 800f174 <ip4_input+0x1b8>
|
|
800f166: 2b11 cmp r3, #17
|
|
800f168: dc13 bgt.n 800f192 <ip4_input+0x1d6>
|
|
800f16a: 2b01 cmp r3, #1
|
|
800f16c: d00c beq.n 800f188 <ip4_input+0x1cc>
|
|
800f16e: 2b06 cmp r3, #6
|
|
800f170: d005 beq.n 800f17e <ip4_input+0x1c2>
|
|
800f172: e00e b.n 800f192 <ip4_input+0x1d6>
|
|
case IP_PROTO_UDP:
|
|
#if LWIP_UDPLITE
|
|
case IP_PROTO_UDPLITE:
|
|
#endif /* LWIP_UDPLITE */
|
|
MIB2_STATS_INC(mib2.ipindelivers);
|
|
udp_input(p, inp);
|
|
800f174: 6839 ldr r1, [r7, #0]
|
|
800f176: 6878 ldr r0, [r7, #4]
|
|
800f178: f7fe fb7e bl 800d878 <udp_input>
|
|
break;
|
|
800f17c: e026 b.n 800f1cc <ip4_input+0x210>
|
|
#endif /* LWIP_UDP */
|
|
#if LWIP_TCP
|
|
case IP_PROTO_TCP:
|
|
MIB2_STATS_INC(mib2.ipindelivers);
|
|
tcp_input(p, inp);
|
|
800f17e: 6839 ldr r1, [r7, #0]
|
|
800f180: 6878 ldr r0, [r7, #4]
|
|
800f182: f7f9 ff33 bl 8008fec <tcp_input>
|
|
break;
|
|
800f186: e021 b.n 800f1cc <ip4_input+0x210>
|
|
#endif /* LWIP_TCP */
|
|
#if LWIP_ICMP
|
|
case IP_PROTO_ICMP:
|
|
MIB2_STATS_INC(mib2.ipindelivers);
|
|
icmp_input(p, inp);
|
|
800f188: 6839 ldr r1, [r7, #0]
|
|
800f18a: 6878 ldr r0, [r7, #4]
|
|
800f18c: f7ff fc32 bl 800e9f4 <icmp_input>
|
|
break;
|
|
800f190: e01c b.n 800f1cc <ip4_input+0x210>
|
|
} else
|
|
#endif /* LWIP_RAW */
|
|
{
|
|
#if LWIP_ICMP
|
|
/* send ICMP destination protocol unreachable unless is was a broadcast */
|
|
if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) &&
|
|
800f192: 4b1a ldr r3, [pc, #104] ; (800f1fc <ip4_input+0x240>)
|
|
800f194: 695b ldr r3, [r3, #20]
|
|
800f196: 6979 ldr r1, [r7, #20]
|
|
800f198: 4618 mov r0, r3
|
|
800f19a: f000 f90b bl 800f3b4 <ip4_addr_isbroadcast_u32>
|
|
800f19e: 4603 mov r3, r0
|
|
800f1a0: 2b00 cmp r3, #0
|
|
800f1a2: d10f bne.n 800f1c4 <ip4_input+0x208>
|
|
!ip4_addr_ismulticast(ip4_current_dest_addr())) {
|
|
800f1a4: 4b15 ldr r3, [pc, #84] ; (800f1fc <ip4_input+0x240>)
|
|
800f1a6: 695b ldr r3, [r3, #20]
|
|
800f1a8: f003 03f0 and.w r3, r3, #240 ; 0xf0
|
|
if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) &&
|
|
800f1ac: 2be0 cmp r3, #224 ; 0xe0
|
|
800f1ae: d009 beq.n 800f1c4 <ip4_input+0x208>
|
|
pbuf_header_force(p, (s16_t)iphdr_hlen); /* Move to ip header, no check necessary. */
|
|
800f1b0: f9b7 300e ldrsh.w r3, [r7, #14]
|
|
800f1b4: 4619 mov r1, r3
|
|
800f1b6: 6878 ldr r0, [r7, #4]
|
|
800f1b8: f7f7 fef9 bl 8006fae <pbuf_header_force>
|
|
icmp_dest_unreach(p, ICMP_DUR_PROTO);
|
|
800f1bc: 2102 movs r1, #2
|
|
800f1be: 6878 ldr r0, [r7, #4]
|
|
800f1c0: f7ff fd8e bl 800ece0 <icmp_dest_unreach>
|
|
|
|
IP_STATS_INC(ip.proterr);
|
|
IP_STATS_INC(ip.drop);
|
|
MIB2_STATS_INC(mib2.ipinunknownprotos);
|
|
}
|
|
pbuf_free(p);
|
|
800f1c4: 6878 ldr r0, [r7, #4]
|
|
800f1c6: f7f7 ff05 bl 8006fd4 <pbuf_free>
|
|
break;
|
|
800f1ca: bf00 nop
|
|
}
|
|
}
|
|
|
|
/* @todo: this is not really necessary... */
|
|
ip_data.current_netif = NULL;
|
|
800f1cc: 4b0b ldr r3, [pc, #44] ; (800f1fc <ip4_input+0x240>)
|
|
800f1ce: 2200 movs r2, #0
|
|
800f1d0: 601a str r2, [r3, #0]
|
|
ip_data.current_input_netif = NULL;
|
|
800f1d2: 4b0a ldr r3, [pc, #40] ; (800f1fc <ip4_input+0x240>)
|
|
800f1d4: 2200 movs r2, #0
|
|
800f1d6: 605a str r2, [r3, #4]
|
|
ip_data.current_ip4_header = NULL;
|
|
800f1d8: 4b08 ldr r3, [pc, #32] ; (800f1fc <ip4_input+0x240>)
|
|
800f1da: 2200 movs r2, #0
|
|
800f1dc: 609a str r2, [r3, #8]
|
|
ip_data.current_ip_header_tot_len = 0;
|
|
800f1de: 4b07 ldr r3, [pc, #28] ; (800f1fc <ip4_input+0x240>)
|
|
800f1e0: 2200 movs r2, #0
|
|
800f1e2: 819a strh r2, [r3, #12]
|
|
ip4_addr_set_any(ip4_current_src_addr());
|
|
800f1e4: 4b05 ldr r3, [pc, #20] ; (800f1fc <ip4_input+0x240>)
|
|
800f1e6: 2200 movs r2, #0
|
|
800f1e8: 611a str r2, [r3, #16]
|
|
ip4_addr_set_any(ip4_current_dest_addr());
|
|
800f1ea: 4b04 ldr r3, [pc, #16] ; (800f1fc <ip4_input+0x240>)
|
|
800f1ec: 2200 movs r2, #0
|
|
800f1ee: 615a str r2, [r3, #20]
|
|
|
|
return ERR_OK;
|
|
800f1f0: 2300 movs r3, #0
|
|
}
|
|
800f1f2: 4618 mov r0, r3
|
|
800f1f4: 3718 adds r7, #24
|
|
800f1f6: 46bd mov sp, r7
|
|
800f1f8: bd80 pop {r7, pc}
|
|
800f1fa: bf00 nop
|
|
800f1fc: 24004c10 .word 0x24004c10
|
|
800f200: 24007b60 .word 0x24007b60
|
|
|
|
0800f204 <ip4_output_if>:
|
|
*/
|
|
err_t
|
|
ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,
|
|
u8_t ttl, u8_t tos,
|
|
u8_t proto, struct netif *netif)
|
|
{
|
|
800f204: b580 push {r7, lr}
|
|
800f206: b08a sub sp, #40 ; 0x28
|
|
800f208: af04 add r7, sp, #16
|
|
800f20a: 60f8 str r0, [r7, #12]
|
|
800f20c: 60b9 str r1, [r7, #8]
|
|
800f20e: 607a str r2, [r7, #4]
|
|
800f210: 70fb strb r3, [r7, #3]
|
|
ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,
|
|
u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,
|
|
u16_t optlen)
|
|
{
|
|
#endif /* IP_OPTIONS_SEND */
|
|
const ip4_addr_t *src_used = src;
|
|
800f212: 68bb ldr r3, [r7, #8]
|
|
800f214: 617b str r3, [r7, #20]
|
|
if (dest != LWIP_IP_HDRINCL) {
|
|
800f216: 687b ldr r3, [r7, #4]
|
|
800f218: 2b00 cmp r3, #0
|
|
800f21a: d009 beq.n 800f230 <ip4_output_if+0x2c>
|
|
if (ip4_addr_isany(src)) {
|
|
800f21c: 68bb ldr r3, [r7, #8]
|
|
800f21e: 2b00 cmp r3, #0
|
|
800f220: d003 beq.n 800f22a <ip4_output_if+0x26>
|
|
800f222: 68bb ldr r3, [r7, #8]
|
|
800f224: 681b ldr r3, [r3, #0]
|
|
800f226: 2b00 cmp r3, #0
|
|
800f228: d102 bne.n 800f230 <ip4_output_if+0x2c>
|
|
src_used = netif_ip4_addr(netif);
|
|
800f22a: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f22c: 3304 adds r3, #4
|
|
800f22e: 617b str r3, [r7, #20]
|
|
|
|
#if IP_OPTIONS_SEND
|
|
return ip4_output_if_opt_src(p, src_used, dest, ttl, tos, proto, netif,
|
|
ip_options, optlen);
|
|
#else /* IP_OPTIONS_SEND */
|
|
return ip4_output_if_src(p, src_used, dest, ttl, tos, proto, netif);
|
|
800f230: 78fa ldrb r2, [r7, #3]
|
|
800f232: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f234: 9302 str r3, [sp, #8]
|
|
800f236: f897 3024 ldrb.w r3, [r7, #36] ; 0x24
|
|
800f23a: 9301 str r3, [sp, #4]
|
|
800f23c: f897 3020 ldrb.w r3, [r7, #32]
|
|
800f240: 9300 str r3, [sp, #0]
|
|
800f242: 4613 mov r3, r2
|
|
800f244: 687a ldr r2, [r7, #4]
|
|
800f246: 6979 ldr r1, [r7, #20]
|
|
800f248: 68f8 ldr r0, [r7, #12]
|
|
800f24a: f000 f805 bl 800f258 <ip4_output_if_src>
|
|
800f24e: 4603 mov r3, r0
|
|
#endif /* IP_OPTIONS_SEND */
|
|
}
|
|
800f250: 4618 mov r0, r3
|
|
800f252: 3718 adds r7, #24
|
|
800f254: 46bd mov sp, r7
|
|
800f256: bd80 pop {r7, pc}
|
|
|
|
0800f258 <ip4_output_if_src>:
|
|
*/
|
|
err_t
|
|
ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,
|
|
u8_t ttl, u8_t tos,
|
|
u8_t proto, struct netif *netif)
|
|
{
|
|
800f258: b580 push {r7, lr}
|
|
800f25a: b088 sub sp, #32
|
|
800f25c: af00 add r7, sp, #0
|
|
800f25e: 60f8 str r0, [r7, #12]
|
|
800f260: 60b9 str r1, [r7, #8]
|
|
800f262: 607a str r2, [r7, #4]
|
|
800f264: 70fb strb r3, [r7, #3]
|
|
#if CHECKSUM_GEN_IP_INLINE
|
|
u32_t chk_sum = 0;
|
|
#endif /* CHECKSUM_GEN_IP_INLINE */
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
|
|
800f266: 68fb ldr r3, [r7, #12]
|
|
800f268: 7b9b ldrb r3, [r3, #14]
|
|
800f26a: 2b01 cmp r3, #1
|
|
800f26c: d006 beq.n 800f27c <ip4_output_if_src+0x24>
|
|
800f26e: 4b4b ldr r3, [pc, #300] ; (800f39c <ip4_output_if_src+0x144>)
|
|
800f270: f44f 7255 mov.w r2, #852 ; 0x354
|
|
800f274: 494a ldr r1, [pc, #296] ; (800f3a0 <ip4_output_if_src+0x148>)
|
|
800f276: 484b ldr r0, [pc, #300] ; (800f3a4 <ip4_output_if_src+0x14c>)
|
|
800f278: f001 fca6 bl 8010bc8 <iprintf>
|
|
|
|
MIB2_STATS_INC(mib2.ipoutrequests);
|
|
|
|
/* Should the IP header be generated or is it already included in p? */
|
|
if (dest != LWIP_IP_HDRINCL) {
|
|
800f27c: 687b ldr r3, [r7, #4]
|
|
800f27e: 2b00 cmp r3, #0
|
|
800f280: d060 beq.n 800f344 <ip4_output_if_src+0xec>
|
|
u16_t ip_hlen = IP_HLEN;
|
|
800f282: 2314 movs r3, #20
|
|
800f284: 837b strh r3, [r7, #26]
|
|
}
|
|
#endif /* CHECKSUM_GEN_IP_INLINE */
|
|
}
|
|
#endif /* IP_OPTIONS_SEND */
|
|
/* generate IP header */
|
|
if (pbuf_add_header(p, IP_HLEN)) {
|
|
800f286: 2114 movs r1, #20
|
|
800f288: 68f8 ldr r0, [r7, #12]
|
|
800f28a: f7f7 fe0d bl 8006ea8 <pbuf_add_header>
|
|
800f28e: 4603 mov r3, r0
|
|
800f290: 2b00 cmp r3, #0
|
|
800f292: d002 beq.n 800f29a <ip4_output_if_src+0x42>
|
|
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: not enough room for IP header in pbuf\n"));
|
|
|
|
IP_STATS_INC(ip.err);
|
|
MIB2_STATS_INC(mib2.ipoutdiscards);
|
|
return ERR_BUF;
|
|
800f294: f06f 0301 mvn.w r3, #1
|
|
800f298: e07c b.n 800f394 <ip4_output_if_src+0x13c>
|
|
}
|
|
|
|
iphdr = (struct ip_hdr *)p->payload;
|
|
800f29a: 68fb ldr r3, [r7, #12]
|
|
800f29c: 685b ldr r3, [r3, #4]
|
|
800f29e: 61fb str r3, [r7, #28]
|
|
LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
|
|
800f2a0: 68fb ldr r3, [r7, #12]
|
|
800f2a2: 895b ldrh r3, [r3, #10]
|
|
800f2a4: 2b13 cmp r3, #19
|
|
800f2a6: d806 bhi.n 800f2b6 <ip4_output_if_src+0x5e>
|
|
800f2a8: 4b3c ldr r3, [pc, #240] ; (800f39c <ip4_output_if_src+0x144>)
|
|
800f2aa: f44f 7262 mov.w r2, #904 ; 0x388
|
|
800f2ae: 493e ldr r1, [pc, #248] ; (800f3a8 <ip4_output_if_src+0x150>)
|
|
800f2b0: 483c ldr r0, [pc, #240] ; (800f3a4 <ip4_output_if_src+0x14c>)
|
|
800f2b2: f001 fc89 bl 8010bc8 <iprintf>
|
|
(p->len >= sizeof(struct ip_hdr)));
|
|
|
|
IPH_TTL_SET(iphdr, ttl);
|
|
800f2b6: 69fb ldr r3, [r7, #28]
|
|
800f2b8: 78fa ldrb r2, [r7, #3]
|
|
800f2ba: 721a strb r2, [r3, #8]
|
|
IPH_PROTO_SET(iphdr, proto);
|
|
800f2bc: 69fb ldr r3, [r7, #28]
|
|
800f2be: f897 202c ldrb.w r2, [r7, #44] ; 0x2c
|
|
800f2c2: 725a strb r2, [r3, #9]
|
|
#if CHECKSUM_GEN_IP_INLINE
|
|
chk_sum += PP_NTOHS(proto | (ttl << 8));
|
|
#endif /* CHECKSUM_GEN_IP_INLINE */
|
|
|
|
/* dest cannot be NULL here */
|
|
ip4_addr_copy(iphdr->dest, *dest);
|
|
800f2c4: 687b ldr r3, [r7, #4]
|
|
800f2c6: 681a ldr r2, [r3, #0]
|
|
800f2c8: 69fb ldr r3, [r7, #28]
|
|
800f2ca: 611a str r2, [r3, #16]
|
|
#if CHECKSUM_GEN_IP_INLINE
|
|
chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF;
|
|
chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16;
|
|
#endif /* CHECKSUM_GEN_IP_INLINE */
|
|
|
|
IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
|
|
800f2cc: 8b7b ldrh r3, [r7, #26]
|
|
800f2ce: 089b lsrs r3, r3, #2
|
|
800f2d0: b29b uxth r3, r3
|
|
800f2d2: b2db uxtb r3, r3
|
|
800f2d4: f043 0340 orr.w r3, r3, #64 ; 0x40
|
|
800f2d8: b2da uxtb r2, r3
|
|
800f2da: 69fb ldr r3, [r7, #28]
|
|
800f2dc: 701a strb r2, [r3, #0]
|
|
IPH_TOS_SET(iphdr, tos);
|
|
800f2de: 69fb ldr r3, [r7, #28]
|
|
800f2e0: f897 2028 ldrb.w r2, [r7, #40] ; 0x28
|
|
800f2e4: 705a strb r2, [r3, #1]
|
|
#if CHECKSUM_GEN_IP_INLINE
|
|
chk_sum += PP_NTOHS(tos | (iphdr->_v_hl << 8));
|
|
#endif /* CHECKSUM_GEN_IP_INLINE */
|
|
IPH_LEN_SET(iphdr, lwip_htons(p->tot_len));
|
|
800f2e6: 68fb ldr r3, [r7, #12]
|
|
800f2e8: 891b ldrh r3, [r3, #8]
|
|
800f2ea: 4618 mov r0, r3
|
|
800f2ec: f7f6 f92e bl 800554c <lwip_htons>
|
|
800f2f0: 4603 mov r3, r0
|
|
800f2f2: 461a mov r2, r3
|
|
800f2f4: 69fb ldr r3, [r7, #28]
|
|
800f2f6: 805a strh r2, [r3, #2]
|
|
#if CHECKSUM_GEN_IP_INLINE
|
|
chk_sum += iphdr->_len;
|
|
#endif /* CHECKSUM_GEN_IP_INLINE */
|
|
IPH_OFFSET_SET(iphdr, 0);
|
|
800f2f8: 69fb ldr r3, [r7, #28]
|
|
800f2fa: 2200 movs r2, #0
|
|
800f2fc: 719a strb r2, [r3, #6]
|
|
800f2fe: 2200 movs r2, #0
|
|
800f300: 71da strb r2, [r3, #7]
|
|
IPH_ID_SET(iphdr, lwip_htons(ip_id));
|
|
800f302: 4b2a ldr r3, [pc, #168] ; (800f3ac <ip4_output_if_src+0x154>)
|
|
800f304: 881b ldrh r3, [r3, #0]
|
|
800f306: 4618 mov r0, r3
|
|
800f308: f7f6 f920 bl 800554c <lwip_htons>
|
|
800f30c: 4603 mov r3, r0
|
|
800f30e: 461a mov r2, r3
|
|
800f310: 69fb ldr r3, [r7, #28]
|
|
800f312: 809a strh r2, [r3, #4]
|
|
#if CHECKSUM_GEN_IP_INLINE
|
|
chk_sum += iphdr->_id;
|
|
#endif /* CHECKSUM_GEN_IP_INLINE */
|
|
++ip_id;
|
|
800f314: 4b25 ldr r3, [pc, #148] ; (800f3ac <ip4_output_if_src+0x154>)
|
|
800f316: 881b ldrh r3, [r3, #0]
|
|
800f318: 3301 adds r3, #1
|
|
800f31a: b29a uxth r2, r3
|
|
800f31c: 4b23 ldr r3, [pc, #140] ; (800f3ac <ip4_output_if_src+0x154>)
|
|
800f31e: 801a strh r2, [r3, #0]
|
|
|
|
if (src == NULL) {
|
|
800f320: 68bb ldr r3, [r7, #8]
|
|
800f322: 2b00 cmp r3, #0
|
|
800f324: d104 bne.n 800f330 <ip4_output_if_src+0xd8>
|
|
ip4_addr_copy(iphdr->src, *IP4_ADDR_ANY4);
|
|
800f326: 4b22 ldr r3, [pc, #136] ; (800f3b0 <ip4_output_if_src+0x158>)
|
|
800f328: 681a ldr r2, [r3, #0]
|
|
800f32a: 69fb ldr r3, [r7, #28]
|
|
800f32c: 60da str r2, [r3, #12]
|
|
800f32e: e003 b.n 800f338 <ip4_output_if_src+0xe0>
|
|
} else {
|
|
/* src cannot be NULL here */
|
|
ip4_addr_copy(iphdr->src, *src);
|
|
800f330: 68bb ldr r3, [r7, #8]
|
|
800f332: 681a ldr r2, [r3, #0]
|
|
800f334: 69fb ldr r3, [r7, #28]
|
|
800f336: 60da str r2, [r3, #12]
|
|
else {
|
|
IPH_CHKSUM_SET(iphdr, 0);
|
|
}
|
|
#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/
|
|
#else /* CHECKSUM_GEN_IP_INLINE */
|
|
IPH_CHKSUM_SET(iphdr, 0);
|
|
800f338: 69fb ldr r3, [r7, #28]
|
|
800f33a: 2200 movs r2, #0
|
|
800f33c: 729a strb r2, [r3, #10]
|
|
800f33e: 2200 movs r2, #0
|
|
800f340: 72da strb r2, [r3, #11]
|
|
800f342: e00f b.n 800f364 <ip4_output_if_src+0x10c>
|
|
}
|
|
#endif /* CHECKSUM_GEN_IP */
|
|
#endif /* CHECKSUM_GEN_IP_INLINE */
|
|
} else {
|
|
/* IP header already included in p */
|
|
if (p->len < IP_HLEN) {
|
|
800f344: 68fb ldr r3, [r7, #12]
|
|
800f346: 895b ldrh r3, [r3, #10]
|
|
800f348: 2b13 cmp r3, #19
|
|
800f34a: d802 bhi.n 800f352 <ip4_output_if_src+0xfa>
|
|
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: LWIP_IP_HDRINCL but pbuf is too short\n"));
|
|
IP_STATS_INC(ip.err);
|
|
MIB2_STATS_INC(mib2.ipoutdiscards);
|
|
return ERR_BUF;
|
|
800f34c: f06f 0301 mvn.w r3, #1
|
|
800f350: e020 b.n 800f394 <ip4_output_if_src+0x13c>
|
|
}
|
|
iphdr = (struct ip_hdr *)p->payload;
|
|
800f352: 68fb ldr r3, [r7, #12]
|
|
800f354: 685b ldr r3, [r3, #4]
|
|
800f356: 61fb str r3, [r7, #28]
|
|
ip4_addr_copy(dest_addr, iphdr->dest);
|
|
800f358: 69fb ldr r3, [r7, #28]
|
|
800f35a: 691b ldr r3, [r3, #16]
|
|
800f35c: 617b str r3, [r7, #20]
|
|
dest = &dest_addr;
|
|
800f35e: f107 0314 add.w r3, r7, #20
|
|
800f362: 607b str r3, [r7, #4]
|
|
}
|
|
#endif /* LWIP_MULTICAST_TX_OPTIONS */
|
|
#endif /* ENABLE_LOOPBACK */
|
|
#if IP_FRAG
|
|
/* don't fragment if interface has mtu set to 0 [loopif] */
|
|
if (netif->mtu && (p->tot_len > netif->mtu)) {
|
|
800f364: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800f366: 8c9b ldrh r3, [r3, #36] ; 0x24
|
|
800f368: 2b00 cmp r3, #0
|
|
800f36a: d00c beq.n 800f386 <ip4_output_if_src+0x12e>
|
|
800f36c: 68fb ldr r3, [r7, #12]
|
|
800f36e: 891a ldrh r2, [r3, #8]
|
|
800f370: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800f372: 8c9b ldrh r3, [r3, #36] ; 0x24
|
|
800f374: 429a cmp r2, r3
|
|
800f376: d906 bls.n 800f386 <ip4_output_if_src+0x12e>
|
|
return ip4_frag(p, netif, dest);
|
|
800f378: 687a ldr r2, [r7, #4]
|
|
800f37a: 6b39 ldr r1, [r7, #48] ; 0x30
|
|
800f37c: 68f8 ldr r0, [r7, #12]
|
|
800f37e: f000 fd53 bl 800fe28 <ip4_frag>
|
|
800f382: 4603 mov r3, r0
|
|
800f384: e006 b.n 800f394 <ip4_output_if_src+0x13c>
|
|
}
|
|
#endif /* IP_FRAG */
|
|
|
|
LWIP_DEBUGF(IP_DEBUG, ("ip4_output_if: call netif->output()\n"));
|
|
return netif->output(netif, p, dest);
|
|
800f386: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800f388: 695b ldr r3, [r3, #20]
|
|
800f38a: 687a ldr r2, [r7, #4]
|
|
800f38c: 68f9 ldr r1, [r7, #12]
|
|
800f38e: 6b38 ldr r0, [r7, #48] ; 0x30
|
|
800f390: 4798 blx r3
|
|
800f392: 4603 mov r3, r0
|
|
}
|
|
800f394: 4618 mov r0, r3
|
|
800f396: 3720 adds r7, #32
|
|
800f398: 46bd mov sp, r7
|
|
800f39a: bd80 pop {r7, pc}
|
|
800f39c: 08014924 .word 0x08014924
|
|
800f3a0: 08014958 .word 0x08014958
|
|
800f3a4: 08014964 .word 0x08014964
|
|
800f3a8: 0801498c .word 0x0801498c
|
|
800f3ac: 24007cc2 .word 0x24007cc2
|
|
800f3b0: 08014d94 .word 0x08014d94
|
|
|
|
0800f3b4 <ip4_addr_isbroadcast_u32>:
|
|
* @param netif the network interface against which the address is checked
|
|
* @return returns non-zero if the address is a broadcast address
|
|
*/
|
|
u8_t
|
|
ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif)
|
|
{
|
|
800f3b4: b480 push {r7}
|
|
800f3b6: b085 sub sp, #20
|
|
800f3b8: af00 add r7, sp, #0
|
|
800f3ba: 6078 str r0, [r7, #4]
|
|
800f3bc: 6039 str r1, [r7, #0]
|
|
ip4_addr_t ipaddr;
|
|
ip4_addr_set_u32(&ipaddr, addr);
|
|
800f3be: 687b ldr r3, [r7, #4]
|
|
800f3c0: 60fb str r3, [r7, #12]
|
|
|
|
/* all ones (broadcast) or all zeroes (old skool broadcast) */
|
|
if ((~addr == IPADDR_ANY) ||
|
|
800f3c2: 687b ldr r3, [r7, #4]
|
|
800f3c4: f1b3 3fff cmp.w r3, #4294967295
|
|
800f3c8: d002 beq.n 800f3d0 <ip4_addr_isbroadcast_u32+0x1c>
|
|
800f3ca: 687b ldr r3, [r7, #4]
|
|
800f3cc: 2b00 cmp r3, #0
|
|
800f3ce: d101 bne.n 800f3d4 <ip4_addr_isbroadcast_u32+0x20>
|
|
(addr == IPADDR_ANY)) {
|
|
return 1;
|
|
800f3d0: 2301 movs r3, #1
|
|
800f3d2: e02a b.n 800f42a <ip4_addr_isbroadcast_u32+0x76>
|
|
/* no broadcast support on this network interface? */
|
|
} else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
|
|
800f3d4: 683b ldr r3, [r7, #0]
|
|
800f3d6: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
800f3da: f003 0302 and.w r3, r3, #2
|
|
800f3de: 2b00 cmp r3, #0
|
|
800f3e0: d101 bne.n 800f3e6 <ip4_addr_isbroadcast_u32+0x32>
|
|
/* the given address cannot be a broadcast address
|
|
* nor can we check against any broadcast addresses */
|
|
return 0;
|
|
800f3e2: 2300 movs r3, #0
|
|
800f3e4: e021 b.n 800f42a <ip4_addr_isbroadcast_u32+0x76>
|
|
/* address matches network interface address exactly? => no broadcast */
|
|
} else if (addr == ip4_addr_get_u32(netif_ip4_addr(netif))) {
|
|
800f3e6: 683b ldr r3, [r7, #0]
|
|
800f3e8: 3304 adds r3, #4
|
|
800f3ea: 681b ldr r3, [r3, #0]
|
|
800f3ec: 687a ldr r2, [r7, #4]
|
|
800f3ee: 429a cmp r2, r3
|
|
800f3f0: d101 bne.n 800f3f6 <ip4_addr_isbroadcast_u32+0x42>
|
|
return 0;
|
|
800f3f2: 2300 movs r3, #0
|
|
800f3f4: e019 b.n 800f42a <ip4_addr_isbroadcast_u32+0x76>
|
|
/* on the same (sub) network... */
|
|
} else if (ip4_addr_netcmp(&ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif))
|
|
800f3f6: 68fa ldr r2, [r7, #12]
|
|
800f3f8: 683b ldr r3, [r7, #0]
|
|
800f3fa: 3304 adds r3, #4
|
|
800f3fc: 681b ldr r3, [r3, #0]
|
|
800f3fe: 405a eors r2, r3
|
|
800f400: 683b ldr r3, [r7, #0]
|
|
800f402: 3308 adds r3, #8
|
|
800f404: 681b ldr r3, [r3, #0]
|
|
800f406: 4013 ands r3, r2
|
|
800f408: 2b00 cmp r3, #0
|
|
800f40a: d10d bne.n 800f428 <ip4_addr_isbroadcast_u32+0x74>
|
|
/* ...and host identifier bits are all ones? =>... */
|
|
&& ((addr & ~ip4_addr_get_u32(netif_ip4_netmask(netif))) ==
|
|
800f40c: 683b ldr r3, [r7, #0]
|
|
800f40e: 3308 adds r3, #8
|
|
800f410: 681b ldr r3, [r3, #0]
|
|
800f412: 43da mvns r2, r3
|
|
800f414: 687b ldr r3, [r7, #4]
|
|
800f416: 401a ands r2, r3
|
|
(IPADDR_BROADCAST & ~ip4_addr_get_u32(netif_ip4_netmask(netif))))) {
|
|
800f418: 683b ldr r3, [r7, #0]
|
|
800f41a: 3308 adds r3, #8
|
|
800f41c: 681b ldr r3, [r3, #0]
|
|
800f41e: 43db mvns r3, r3
|
|
&& ((addr & ~ip4_addr_get_u32(netif_ip4_netmask(netif))) ==
|
|
800f420: 429a cmp r2, r3
|
|
800f422: d101 bne.n 800f428 <ip4_addr_isbroadcast_u32+0x74>
|
|
/* => network broadcast address */
|
|
return 1;
|
|
800f424: 2301 movs r3, #1
|
|
800f426: e000 b.n 800f42a <ip4_addr_isbroadcast_u32+0x76>
|
|
} else {
|
|
return 0;
|
|
800f428: 2300 movs r3, #0
|
|
}
|
|
}
|
|
800f42a: 4618 mov r0, r3
|
|
800f42c: 3714 adds r7, #20
|
|
800f42e: 46bd mov sp, r7
|
|
800f430: f85d 7b04 ldr.w r7, [sp], #4
|
|
800f434: 4770 bx lr
|
|
...
|
|
|
|
0800f438 <ip_reass_tmr>:
|
|
*
|
|
* Should be called every 1000 msec (defined by IP_TMR_INTERVAL).
|
|
*/
|
|
void
|
|
ip_reass_tmr(void)
|
|
{
|
|
800f438: b580 push {r7, lr}
|
|
800f43a: b084 sub sp, #16
|
|
800f43c: af00 add r7, sp, #0
|
|
struct ip_reassdata *r, *prev = NULL;
|
|
800f43e: 2300 movs r3, #0
|
|
800f440: 60bb str r3, [r7, #8]
|
|
|
|
r = reassdatagrams;
|
|
800f442: 4b12 ldr r3, [pc, #72] ; (800f48c <ip_reass_tmr+0x54>)
|
|
800f444: 681b ldr r3, [r3, #0]
|
|
800f446: 60fb str r3, [r7, #12]
|
|
while (r != NULL) {
|
|
800f448: e018 b.n 800f47c <ip_reass_tmr+0x44>
|
|
/* Decrement the timer. Once it reaches 0,
|
|
* clean up the incomplete fragment assembly */
|
|
if (r->timer > 0) {
|
|
800f44a: 68fb ldr r3, [r7, #12]
|
|
800f44c: 7fdb ldrb r3, [r3, #31]
|
|
800f44e: 2b00 cmp r3, #0
|
|
800f450: d00b beq.n 800f46a <ip_reass_tmr+0x32>
|
|
r->timer--;
|
|
800f452: 68fb ldr r3, [r7, #12]
|
|
800f454: 7fdb ldrb r3, [r3, #31]
|
|
800f456: 3b01 subs r3, #1
|
|
800f458: b2da uxtb r2, r3
|
|
800f45a: 68fb ldr r3, [r7, #12]
|
|
800f45c: 77da strb r2, [r3, #31]
|
|
LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n", (u16_t)r->timer));
|
|
prev = r;
|
|
800f45e: 68fb ldr r3, [r7, #12]
|
|
800f460: 60bb str r3, [r7, #8]
|
|
r = r->next;
|
|
800f462: 68fb ldr r3, [r7, #12]
|
|
800f464: 681b ldr r3, [r3, #0]
|
|
800f466: 60fb str r3, [r7, #12]
|
|
800f468: e008 b.n 800f47c <ip_reass_tmr+0x44>
|
|
} else {
|
|
/* reassembly timed out */
|
|
struct ip_reassdata *tmp;
|
|
LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer timed out\n"));
|
|
tmp = r;
|
|
800f46a: 68fb ldr r3, [r7, #12]
|
|
800f46c: 607b str r3, [r7, #4]
|
|
/* get the next pointer before freeing */
|
|
r = r->next;
|
|
800f46e: 68fb ldr r3, [r7, #12]
|
|
800f470: 681b ldr r3, [r3, #0]
|
|
800f472: 60fb str r3, [r7, #12]
|
|
/* free the helper struct and all enqueued pbufs */
|
|
ip_reass_free_complete_datagram(tmp, prev);
|
|
800f474: 68b9 ldr r1, [r7, #8]
|
|
800f476: 6878 ldr r0, [r7, #4]
|
|
800f478: f000 f80a bl 800f490 <ip_reass_free_complete_datagram>
|
|
while (r != NULL) {
|
|
800f47c: 68fb ldr r3, [r7, #12]
|
|
800f47e: 2b00 cmp r3, #0
|
|
800f480: d1e3 bne.n 800f44a <ip_reass_tmr+0x12>
|
|
}
|
|
}
|
|
}
|
|
800f482: bf00 nop
|
|
800f484: bf00 nop
|
|
800f486: 3710 adds r7, #16
|
|
800f488: 46bd mov sp, r7
|
|
800f48a: bd80 pop {r7, pc}
|
|
800f48c: 24007cc4 .word 0x24007cc4
|
|
|
|
0800f490 <ip_reass_free_complete_datagram>:
|
|
* @param prev the previous datagram in the linked list
|
|
* @return the number of pbufs freed
|
|
*/
|
|
static int
|
|
ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev)
|
|
{
|
|
800f490: b580 push {r7, lr}
|
|
800f492: b088 sub sp, #32
|
|
800f494: af00 add r7, sp, #0
|
|
800f496: 6078 str r0, [r7, #4]
|
|
800f498: 6039 str r1, [r7, #0]
|
|
u16_t pbufs_freed = 0;
|
|
800f49a: 2300 movs r3, #0
|
|
800f49c: 83fb strh r3, [r7, #30]
|
|
u16_t clen;
|
|
struct pbuf *p;
|
|
struct ip_reass_helper *iprh;
|
|
|
|
LWIP_ASSERT("prev != ipr", prev != ipr);
|
|
800f49e: 683a ldr r2, [r7, #0]
|
|
800f4a0: 687b ldr r3, [r7, #4]
|
|
800f4a2: 429a cmp r2, r3
|
|
800f4a4: d105 bne.n 800f4b2 <ip_reass_free_complete_datagram+0x22>
|
|
800f4a6: 4b45 ldr r3, [pc, #276] ; (800f5bc <ip_reass_free_complete_datagram+0x12c>)
|
|
800f4a8: 22ab movs r2, #171 ; 0xab
|
|
800f4aa: 4945 ldr r1, [pc, #276] ; (800f5c0 <ip_reass_free_complete_datagram+0x130>)
|
|
800f4ac: 4845 ldr r0, [pc, #276] ; (800f5c4 <ip_reass_free_complete_datagram+0x134>)
|
|
800f4ae: f001 fb8b bl 8010bc8 <iprintf>
|
|
if (prev != NULL) {
|
|
800f4b2: 683b ldr r3, [r7, #0]
|
|
800f4b4: 2b00 cmp r3, #0
|
|
800f4b6: d00a beq.n 800f4ce <ip_reass_free_complete_datagram+0x3e>
|
|
LWIP_ASSERT("prev->next == ipr", prev->next == ipr);
|
|
800f4b8: 683b ldr r3, [r7, #0]
|
|
800f4ba: 681b ldr r3, [r3, #0]
|
|
800f4bc: 687a ldr r2, [r7, #4]
|
|
800f4be: 429a cmp r2, r3
|
|
800f4c0: d005 beq.n 800f4ce <ip_reass_free_complete_datagram+0x3e>
|
|
800f4c2: 4b3e ldr r3, [pc, #248] ; (800f5bc <ip_reass_free_complete_datagram+0x12c>)
|
|
800f4c4: 22ad movs r2, #173 ; 0xad
|
|
800f4c6: 4940 ldr r1, [pc, #256] ; (800f5c8 <ip_reass_free_complete_datagram+0x138>)
|
|
800f4c8: 483e ldr r0, [pc, #248] ; (800f5c4 <ip_reass_free_complete_datagram+0x134>)
|
|
800f4ca: f001 fb7d bl 8010bc8 <iprintf>
|
|
}
|
|
|
|
MIB2_STATS_INC(mib2.ipreasmfails);
|
|
#if LWIP_ICMP
|
|
iprh = (struct ip_reass_helper *)ipr->p->payload;
|
|
800f4ce: 687b ldr r3, [r7, #4]
|
|
800f4d0: 685b ldr r3, [r3, #4]
|
|
800f4d2: 685b ldr r3, [r3, #4]
|
|
800f4d4: 617b str r3, [r7, #20]
|
|
if (iprh->start == 0) {
|
|
800f4d6: 697b ldr r3, [r7, #20]
|
|
800f4d8: 889b ldrh r3, [r3, #4]
|
|
800f4da: b29b uxth r3, r3
|
|
800f4dc: 2b00 cmp r3, #0
|
|
800f4de: d12a bne.n 800f536 <ip_reass_free_complete_datagram+0xa6>
|
|
/* The first fragment was received, send ICMP time exceeded. */
|
|
/* First, de-queue the first pbuf from r->p. */
|
|
p = ipr->p;
|
|
800f4e0: 687b ldr r3, [r7, #4]
|
|
800f4e2: 685b ldr r3, [r3, #4]
|
|
800f4e4: 61bb str r3, [r7, #24]
|
|
ipr->p = iprh->next_pbuf;
|
|
800f4e6: 697b ldr r3, [r7, #20]
|
|
800f4e8: 681a ldr r2, [r3, #0]
|
|
800f4ea: 687b ldr r3, [r7, #4]
|
|
800f4ec: 605a str r2, [r3, #4]
|
|
/* Then, copy the original header into it. */
|
|
SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN);
|
|
800f4ee: 69bb ldr r3, [r7, #24]
|
|
800f4f0: 6858 ldr r0, [r3, #4]
|
|
800f4f2: 687b ldr r3, [r7, #4]
|
|
800f4f4: 3308 adds r3, #8
|
|
800f4f6: 2214 movs r2, #20
|
|
800f4f8: 4619 mov r1, r3
|
|
800f4fa: f001 fd46 bl 8010f8a <memcpy>
|
|
icmp_time_exceeded(p, ICMP_TE_FRAG);
|
|
800f4fe: 2101 movs r1, #1
|
|
800f500: 69b8 ldr r0, [r7, #24]
|
|
800f502: f7ff fbfd bl 800ed00 <icmp_time_exceeded>
|
|
clen = pbuf_clen(p);
|
|
800f506: 69b8 ldr r0, [r7, #24]
|
|
800f508: f7f7 fdec bl 80070e4 <pbuf_clen>
|
|
800f50c: 4603 mov r3, r0
|
|
800f50e: 827b strh r3, [r7, #18]
|
|
LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
|
|
800f510: 8bfa ldrh r2, [r7, #30]
|
|
800f512: 8a7b ldrh r3, [r7, #18]
|
|
800f514: 4413 add r3, r2
|
|
800f516: f5b3 3f80 cmp.w r3, #65536 ; 0x10000
|
|
800f51a: db05 blt.n 800f528 <ip_reass_free_complete_datagram+0x98>
|
|
800f51c: 4b27 ldr r3, [pc, #156] ; (800f5bc <ip_reass_free_complete_datagram+0x12c>)
|
|
800f51e: 22bc movs r2, #188 ; 0xbc
|
|
800f520: 492a ldr r1, [pc, #168] ; (800f5cc <ip_reass_free_complete_datagram+0x13c>)
|
|
800f522: 4828 ldr r0, [pc, #160] ; (800f5c4 <ip_reass_free_complete_datagram+0x134>)
|
|
800f524: f001 fb50 bl 8010bc8 <iprintf>
|
|
pbufs_freed = (u16_t)(pbufs_freed + clen);
|
|
800f528: 8bfa ldrh r2, [r7, #30]
|
|
800f52a: 8a7b ldrh r3, [r7, #18]
|
|
800f52c: 4413 add r3, r2
|
|
800f52e: 83fb strh r3, [r7, #30]
|
|
pbuf_free(p);
|
|
800f530: 69b8 ldr r0, [r7, #24]
|
|
800f532: f7f7 fd4f bl 8006fd4 <pbuf_free>
|
|
}
|
|
#endif /* LWIP_ICMP */
|
|
|
|
/* First, free all received pbufs. The individual pbufs need to be released
|
|
separately as they have not yet been chained */
|
|
p = ipr->p;
|
|
800f536: 687b ldr r3, [r7, #4]
|
|
800f538: 685b ldr r3, [r3, #4]
|
|
800f53a: 61bb str r3, [r7, #24]
|
|
while (p != NULL) {
|
|
800f53c: e01f b.n 800f57e <ip_reass_free_complete_datagram+0xee>
|
|
struct pbuf *pcur;
|
|
iprh = (struct ip_reass_helper *)p->payload;
|
|
800f53e: 69bb ldr r3, [r7, #24]
|
|
800f540: 685b ldr r3, [r3, #4]
|
|
800f542: 617b str r3, [r7, #20]
|
|
pcur = p;
|
|
800f544: 69bb ldr r3, [r7, #24]
|
|
800f546: 60fb str r3, [r7, #12]
|
|
/* get the next pointer before freeing */
|
|
p = iprh->next_pbuf;
|
|
800f548: 697b ldr r3, [r7, #20]
|
|
800f54a: 681b ldr r3, [r3, #0]
|
|
800f54c: 61bb str r3, [r7, #24]
|
|
clen = pbuf_clen(pcur);
|
|
800f54e: 68f8 ldr r0, [r7, #12]
|
|
800f550: f7f7 fdc8 bl 80070e4 <pbuf_clen>
|
|
800f554: 4603 mov r3, r0
|
|
800f556: 827b strh r3, [r7, #18]
|
|
LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
|
|
800f558: 8bfa ldrh r2, [r7, #30]
|
|
800f55a: 8a7b ldrh r3, [r7, #18]
|
|
800f55c: 4413 add r3, r2
|
|
800f55e: f5b3 3f80 cmp.w r3, #65536 ; 0x10000
|
|
800f562: db05 blt.n 800f570 <ip_reass_free_complete_datagram+0xe0>
|
|
800f564: 4b15 ldr r3, [pc, #84] ; (800f5bc <ip_reass_free_complete_datagram+0x12c>)
|
|
800f566: 22cc movs r2, #204 ; 0xcc
|
|
800f568: 4918 ldr r1, [pc, #96] ; (800f5cc <ip_reass_free_complete_datagram+0x13c>)
|
|
800f56a: 4816 ldr r0, [pc, #88] ; (800f5c4 <ip_reass_free_complete_datagram+0x134>)
|
|
800f56c: f001 fb2c bl 8010bc8 <iprintf>
|
|
pbufs_freed = (u16_t)(pbufs_freed + clen);
|
|
800f570: 8bfa ldrh r2, [r7, #30]
|
|
800f572: 8a7b ldrh r3, [r7, #18]
|
|
800f574: 4413 add r3, r2
|
|
800f576: 83fb strh r3, [r7, #30]
|
|
pbuf_free(pcur);
|
|
800f578: 68f8 ldr r0, [r7, #12]
|
|
800f57a: f7f7 fd2b bl 8006fd4 <pbuf_free>
|
|
while (p != NULL) {
|
|
800f57e: 69bb ldr r3, [r7, #24]
|
|
800f580: 2b00 cmp r3, #0
|
|
800f582: d1dc bne.n 800f53e <ip_reass_free_complete_datagram+0xae>
|
|
}
|
|
/* Then, unchain the struct ip_reassdata from the list and free it. */
|
|
ip_reass_dequeue_datagram(ipr, prev);
|
|
800f584: 6839 ldr r1, [r7, #0]
|
|
800f586: 6878 ldr r0, [r7, #4]
|
|
800f588: f000 f8c2 bl 800f710 <ip_reass_dequeue_datagram>
|
|
LWIP_ASSERT("ip_reass_pbufcount >= pbufs_freed", ip_reass_pbufcount >= pbufs_freed);
|
|
800f58c: 4b10 ldr r3, [pc, #64] ; (800f5d0 <ip_reass_free_complete_datagram+0x140>)
|
|
800f58e: 881b ldrh r3, [r3, #0]
|
|
800f590: 8bfa ldrh r2, [r7, #30]
|
|
800f592: 429a cmp r2, r3
|
|
800f594: d905 bls.n 800f5a2 <ip_reass_free_complete_datagram+0x112>
|
|
800f596: 4b09 ldr r3, [pc, #36] ; (800f5bc <ip_reass_free_complete_datagram+0x12c>)
|
|
800f598: 22d2 movs r2, #210 ; 0xd2
|
|
800f59a: 490e ldr r1, [pc, #56] ; (800f5d4 <ip_reass_free_complete_datagram+0x144>)
|
|
800f59c: 4809 ldr r0, [pc, #36] ; (800f5c4 <ip_reass_free_complete_datagram+0x134>)
|
|
800f59e: f001 fb13 bl 8010bc8 <iprintf>
|
|
ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - pbufs_freed);
|
|
800f5a2: 4b0b ldr r3, [pc, #44] ; (800f5d0 <ip_reass_free_complete_datagram+0x140>)
|
|
800f5a4: 881a ldrh r2, [r3, #0]
|
|
800f5a6: 8bfb ldrh r3, [r7, #30]
|
|
800f5a8: 1ad3 subs r3, r2, r3
|
|
800f5aa: b29a uxth r2, r3
|
|
800f5ac: 4b08 ldr r3, [pc, #32] ; (800f5d0 <ip_reass_free_complete_datagram+0x140>)
|
|
800f5ae: 801a strh r2, [r3, #0]
|
|
|
|
return pbufs_freed;
|
|
800f5b0: 8bfb ldrh r3, [r7, #30]
|
|
}
|
|
800f5b2: 4618 mov r0, r3
|
|
800f5b4: 3720 adds r7, #32
|
|
800f5b6: 46bd mov sp, r7
|
|
800f5b8: bd80 pop {r7, pc}
|
|
800f5ba: bf00 nop
|
|
800f5bc: 080149bc .word 0x080149bc
|
|
800f5c0: 080149f8 .word 0x080149f8
|
|
800f5c4: 08014a04 .word 0x08014a04
|
|
800f5c8: 08014a2c .word 0x08014a2c
|
|
800f5cc: 08014a40 .word 0x08014a40
|
|
800f5d0: 24007cc8 .word 0x24007cc8
|
|
800f5d4: 08014a60 .word 0x08014a60
|
|
|
|
0800f5d8 <ip_reass_remove_oldest_datagram>:
|
|
* (used for freeing other datagrams if not enough space)
|
|
* @return the number of pbufs freed
|
|
*/
|
|
static int
|
|
ip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed)
|
|
{
|
|
800f5d8: b580 push {r7, lr}
|
|
800f5da: b08a sub sp, #40 ; 0x28
|
|
800f5dc: af00 add r7, sp, #0
|
|
800f5de: 6078 str r0, [r7, #4]
|
|
800f5e0: 6039 str r1, [r7, #0]
|
|
/* @todo Can't we simply remove the last datagram in the
|
|
* linked list behind reassdatagrams?
|
|
*/
|
|
struct ip_reassdata *r, *oldest, *prev, *oldest_prev;
|
|
int pbufs_freed = 0, pbufs_freed_current;
|
|
800f5e2: 2300 movs r3, #0
|
|
800f5e4: 617b str r3, [r7, #20]
|
|
int other_datagrams;
|
|
|
|
/* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs,
|
|
* but don't free the datagram that 'fraghdr' belongs to! */
|
|
do {
|
|
oldest = NULL;
|
|
800f5e6: 2300 movs r3, #0
|
|
800f5e8: 623b str r3, [r7, #32]
|
|
prev = NULL;
|
|
800f5ea: 2300 movs r3, #0
|
|
800f5ec: 61fb str r3, [r7, #28]
|
|
oldest_prev = NULL;
|
|
800f5ee: 2300 movs r3, #0
|
|
800f5f0: 61bb str r3, [r7, #24]
|
|
other_datagrams = 0;
|
|
800f5f2: 2300 movs r3, #0
|
|
800f5f4: 613b str r3, [r7, #16]
|
|
r = reassdatagrams;
|
|
800f5f6: 4b28 ldr r3, [pc, #160] ; (800f698 <ip_reass_remove_oldest_datagram+0xc0>)
|
|
800f5f8: 681b ldr r3, [r3, #0]
|
|
800f5fa: 627b str r3, [r7, #36] ; 0x24
|
|
while (r != NULL) {
|
|
800f5fc: e030 b.n 800f660 <ip_reass_remove_oldest_datagram+0x88>
|
|
if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) {
|
|
800f5fe: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f600: 695a ldr r2, [r3, #20]
|
|
800f602: 687b ldr r3, [r7, #4]
|
|
800f604: 68db ldr r3, [r3, #12]
|
|
800f606: 429a cmp r2, r3
|
|
800f608: d10c bne.n 800f624 <ip_reass_remove_oldest_datagram+0x4c>
|
|
800f60a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f60c: 699a ldr r2, [r3, #24]
|
|
800f60e: 687b ldr r3, [r7, #4]
|
|
800f610: 691b ldr r3, [r3, #16]
|
|
800f612: 429a cmp r2, r3
|
|
800f614: d106 bne.n 800f624 <ip_reass_remove_oldest_datagram+0x4c>
|
|
800f616: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f618: 899a ldrh r2, [r3, #12]
|
|
800f61a: 687b ldr r3, [r7, #4]
|
|
800f61c: 889b ldrh r3, [r3, #4]
|
|
800f61e: b29b uxth r3, r3
|
|
800f620: 429a cmp r2, r3
|
|
800f622: d014 beq.n 800f64e <ip_reass_remove_oldest_datagram+0x76>
|
|
/* Not the same datagram as fraghdr */
|
|
other_datagrams++;
|
|
800f624: 693b ldr r3, [r7, #16]
|
|
800f626: 3301 adds r3, #1
|
|
800f628: 613b str r3, [r7, #16]
|
|
if (oldest == NULL) {
|
|
800f62a: 6a3b ldr r3, [r7, #32]
|
|
800f62c: 2b00 cmp r3, #0
|
|
800f62e: d104 bne.n 800f63a <ip_reass_remove_oldest_datagram+0x62>
|
|
oldest = r;
|
|
800f630: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f632: 623b str r3, [r7, #32]
|
|
oldest_prev = prev;
|
|
800f634: 69fb ldr r3, [r7, #28]
|
|
800f636: 61bb str r3, [r7, #24]
|
|
800f638: e009 b.n 800f64e <ip_reass_remove_oldest_datagram+0x76>
|
|
} else if (r->timer <= oldest->timer) {
|
|
800f63a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f63c: 7fda ldrb r2, [r3, #31]
|
|
800f63e: 6a3b ldr r3, [r7, #32]
|
|
800f640: 7fdb ldrb r3, [r3, #31]
|
|
800f642: 429a cmp r2, r3
|
|
800f644: d803 bhi.n 800f64e <ip_reass_remove_oldest_datagram+0x76>
|
|
/* older than the previous oldest */
|
|
oldest = r;
|
|
800f646: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f648: 623b str r3, [r7, #32]
|
|
oldest_prev = prev;
|
|
800f64a: 69fb ldr r3, [r7, #28]
|
|
800f64c: 61bb str r3, [r7, #24]
|
|
}
|
|
}
|
|
if (r->next != NULL) {
|
|
800f64e: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f650: 681b ldr r3, [r3, #0]
|
|
800f652: 2b00 cmp r3, #0
|
|
800f654: d001 beq.n 800f65a <ip_reass_remove_oldest_datagram+0x82>
|
|
prev = r;
|
|
800f656: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f658: 61fb str r3, [r7, #28]
|
|
}
|
|
r = r->next;
|
|
800f65a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f65c: 681b ldr r3, [r3, #0]
|
|
800f65e: 627b str r3, [r7, #36] ; 0x24
|
|
while (r != NULL) {
|
|
800f660: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f662: 2b00 cmp r3, #0
|
|
800f664: d1cb bne.n 800f5fe <ip_reass_remove_oldest_datagram+0x26>
|
|
}
|
|
if (oldest != NULL) {
|
|
800f666: 6a3b ldr r3, [r7, #32]
|
|
800f668: 2b00 cmp r3, #0
|
|
800f66a: d008 beq.n 800f67e <ip_reass_remove_oldest_datagram+0xa6>
|
|
pbufs_freed_current = ip_reass_free_complete_datagram(oldest, oldest_prev);
|
|
800f66c: 69b9 ldr r1, [r7, #24]
|
|
800f66e: 6a38 ldr r0, [r7, #32]
|
|
800f670: f7ff ff0e bl 800f490 <ip_reass_free_complete_datagram>
|
|
800f674: 60f8 str r0, [r7, #12]
|
|
pbufs_freed += pbufs_freed_current;
|
|
800f676: 697a ldr r2, [r7, #20]
|
|
800f678: 68fb ldr r3, [r7, #12]
|
|
800f67a: 4413 add r3, r2
|
|
800f67c: 617b str r3, [r7, #20]
|
|
}
|
|
} while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1));
|
|
800f67e: 697a ldr r2, [r7, #20]
|
|
800f680: 683b ldr r3, [r7, #0]
|
|
800f682: 429a cmp r2, r3
|
|
800f684: da02 bge.n 800f68c <ip_reass_remove_oldest_datagram+0xb4>
|
|
800f686: 693b ldr r3, [r7, #16]
|
|
800f688: 2b01 cmp r3, #1
|
|
800f68a: dcac bgt.n 800f5e6 <ip_reass_remove_oldest_datagram+0xe>
|
|
return pbufs_freed;
|
|
800f68c: 697b ldr r3, [r7, #20]
|
|
}
|
|
800f68e: 4618 mov r0, r3
|
|
800f690: 3728 adds r7, #40 ; 0x28
|
|
800f692: 46bd mov sp, r7
|
|
800f694: bd80 pop {r7, pc}
|
|
800f696: bf00 nop
|
|
800f698: 24007cc4 .word 0x24007cc4
|
|
|
|
0800f69c <ip_reass_enqueue_new_datagram>:
|
|
* @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space)
|
|
* @return A pointer to the queue location into which the fragment was enqueued
|
|
*/
|
|
static struct ip_reassdata *
|
|
ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen)
|
|
{
|
|
800f69c: b580 push {r7, lr}
|
|
800f69e: b084 sub sp, #16
|
|
800f6a0: af00 add r7, sp, #0
|
|
800f6a2: 6078 str r0, [r7, #4]
|
|
800f6a4: 6039 str r1, [r7, #0]
|
|
#if ! IP_REASS_FREE_OLDEST
|
|
LWIP_UNUSED_ARG(clen);
|
|
#endif
|
|
|
|
/* No matching previous fragment found, allocate a new reassdata struct */
|
|
ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA);
|
|
800f6a6: 2004 movs r0, #4
|
|
800f6a8: f7f6 fcb8 bl 800601c <memp_malloc>
|
|
800f6ac: 60f8 str r0, [r7, #12]
|
|
if (ipr == NULL) {
|
|
800f6ae: 68fb ldr r3, [r7, #12]
|
|
800f6b0: 2b00 cmp r3, #0
|
|
800f6b2: d110 bne.n 800f6d6 <ip_reass_enqueue_new_datagram+0x3a>
|
|
#if IP_REASS_FREE_OLDEST
|
|
if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) {
|
|
800f6b4: 6839 ldr r1, [r7, #0]
|
|
800f6b6: 6878 ldr r0, [r7, #4]
|
|
800f6b8: f7ff ff8e bl 800f5d8 <ip_reass_remove_oldest_datagram>
|
|
800f6bc: 4602 mov r2, r0
|
|
800f6be: 683b ldr r3, [r7, #0]
|
|
800f6c0: 4293 cmp r3, r2
|
|
800f6c2: dc03 bgt.n 800f6cc <ip_reass_enqueue_new_datagram+0x30>
|
|
ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA);
|
|
800f6c4: 2004 movs r0, #4
|
|
800f6c6: f7f6 fca9 bl 800601c <memp_malloc>
|
|
800f6ca: 60f8 str r0, [r7, #12]
|
|
}
|
|
if (ipr == NULL)
|
|
800f6cc: 68fb ldr r3, [r7, #12]
|
|
800f6ce: 2b00 cmp r3, #0
|
|
800f6d0: d101 bne.n 800f6d6 <ip_reass_enqueue_new_datagram+0x3a>
|
|
#endif /* IP_REASS_FREE_OLDEST */
|
|
{
|
|
IPFRAG_STATS_INC(ip_frag.memerr);
|
|
LWIP_DEBUGF(IP_REASS_DEBUG, ("Failed to alloc reassdata struct\n"));
|
|
return NULL;
|
|
800f6d2: 2300 movs r3, #0
|
|
800f6d4: e016 b.n 800f704 <ip_reass_enqueue_new_datagram+0x68>
|
|
}
|
|
}
|
|
memset(ipr, 0, sizeof(struct ip_reassdata));
|
|
800f6d6: 2220 movs r2, #32
|
|
800f6d8: 2100 movs r1, #0
|
|
800f6da: 68f8 ldr r0, [r7, #12]
|
|
800f6dc: f001 fbd2 bl 8010e84 <memset>
|
|
ipr->timer = IP_REASS_MAXAGE;
|
|
800f6e0: 68fb ldr r3, [r7, #12]
|
|
800f6e2: 220f movs r2, #15
|
|
800f6e4: 77da strb r2, [r3, #31]
|
|
|
|
/* enqueue the new structure to the front of the list */
|
|
ipr->next = reassdatagrams;
|
|
800f6e6: 4b09 ldr r3, [pc, #36] ; (800f70c <ip_reass_enqueue_new_datagram+0x70>)
|
|
800f6e8: 681a ldr r2, [r3, #0]
|
|
800f6ea: 68fb ldr r3, [r7, #12]
|
|
800f6ec: 601a str r2, [r3, #0]
|
|
reassdatagrams = ipr;
|
|
800f6ee: 4a07 ldr r2, [pc, #28] ; (800f70c <ip_reass_enqueue_new_datagram+0x70>)
|
|
800f6f0: 68fb ldr r3, [r7, #12]
|
|
800f6f2: 6013 str r3, [r2, #0]
|
|
/* copy the ip header for later tests and input */
|
|
/* @todo: no ip options supported? */
|
|
SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN);
|
|
800f6f4: 68fb ldr r3, [r7, #12]
|
|
800f6f6: 3308 adds r3, #8
|
|
800f6f8: 2214 movs r2, #20
|
|
800f6fa: 6879 ldr r1, [r7, #4]
|
|
800f6fc: 4618 mov r0, r3
|
|
800f6fe: f001 fc44 bl 8010f8a <memcpy>
|
|
return ipr;
|
|
800f702: 68fb ldr r3, [r7, #12]
|
|
}
|
|
800f704: 4618 mov r0, r3
|
|
800f706: 3710 adds r7, #16
|
|
800f708: 46bd mov sp, r7
|
|
800f70a: bd80 pop {r7, pc}
|
|
800f70c: 24007cc4 .word 0x24007cc4
|
|
|
|
0800f710 <ip_reass_dequeue_datagram>:
|
|
* Dequeues a datagram from the datagram queue. Doesn't deallocate the pbufs.
|
|
* @param ipr points to the queue entry to dequeue
|
|
*/
|
|
static void
|
|
ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev)
|
|
{
|
|
800f710: b580 push {r7, lr}
|
|
800f712: b082 sub sp, #8
|
|
800f714: af00 add r7, sp, #0
|
|
800f716: 6078 str r0, [r7, #4]
|
|
800f718: 6039 str r1, [r7, #0]
|
|
/* dequeue the reass struct */
|
|
if (reassdatagrams == ipr) {
|
|
800f71a: 4b10 ldr r3, [pc, #64] ; (800f75c <ip_reass_dequeue_datagram+0x4c>)
|
|
800f71c: 681b ldr r3, [r3, #0]
|
|
800f71e: 687a ldr r2, [r7, #4]
|
|
800f720: 429a cmp r2, r3
|
|
800f722: d104 bne.n 800f72e <ip_reass_dequeue_datagram+0x1e>
|
|
/* it was the first in the list */
|
|
reassdatagrams = ipr->next;
|
|
800f724: 687b ldr r3, [r7, #4]
|
|
800f726: 681b ldr r3, [r3, #0]
|
|
800f728: 4a0c ldr r2, [pc, #48] ; (800f75c <ip_reass_dequeue_datagram+0x4c>)
|
|
800f72a: 6013 str r3, [r2, #0]
|
|
800f72c: e00d b.n 800f74a <ip_reass_dequeue_datagram+0x3a>
|
|
} else {
|
|
/* it wasn't the first, so it must have a valid 'prev' */
|
|
LWIP_ASSERT("sanity check linked list", prev != NULL);
|
|
800f72e: 683b ldr r3, [r7, #0]
|
|
800f730: 2b00 cmp r3, #0
|
|
800f732: d106 bne.n 800f742 <ip_reass_dequeue_datagram+0x32>
|
|
800f734: 4b0a ldr r3, [pc, #40] ; (800f760 <ip_reass_dequeue_datagram+0x50>)
|
|
800f736: f240 1245 movw r2, #325 ; 0x145
|
|
800f73a: 490a ldr r1, [pc, #40] ; (800f764 <ip_reass_dequeue_datagram+0x54>)
|
|
800f73c: 480a ldr r0, [pc, #40] ; (800f768 <ip_reass_dequeue_datagram+0x58>)
|
|
800f73e: f001 fa43 bl 8010bc8 <iprintf>
|
|
prev->next = ipr->next;
|
|
800f742: 687b ldr r3, [r7, #4]
|
|
800f744: 681a ldr r2, [r3, #0]
|
|
800f746: 683b ldr r3, [r7, #0]
|
|
800f748: 601a str r2, [r3, #0]
|
|
}
|
|
|
|
/* now we can free the ip_reassdata struct */
|
|
memp_free(MEMP_REASSDATA, ipr);
|
|
800f74a: 6879 ldr r1, [r7, #4]
|
|
800f74c: 2004 movs r0, #4
|
|
800f74e: f7f6 fcd5 bl 80060fc <memp_free>
|
|
}
|
|
800f752: bf00 nop
|
|
800f754: 3708 adds r7, #8
|
|
800f756: 46bd mov sp, r7
|
|
800f758: bd80 pop {r7, pc}
|
|
800f75a: bf00 nop
|
|
800f75c: 24007cc4 .word 0x24007cc4
|
|
800f760: 080149bc .word 0x080149bc
|
|
800f764: 08014a84 .word 0x08014a84
|
|
800f768: 08014a04 .word 0x08014a04
|
|
|
|
0800f76c <ip_reass_chain_frag_into_datagram_and_validate>:
|
|
* @param is_last is 1 if this pbuf has MF==0 (ipr->flags not updated yet)
|
|
* @return see IP_REASS_VALIDATE_* defines
|
|
*/
|
|
static int
|
|
ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p, int is_last)
|
|
{
|
|
800f76c: b580 push {r7, lr}
|
|
800f76e: b08c sub sp, #48 ; 0x30
|
|
800f770: af00 add r7, sp, #0
|
|
800f772: 60f8 str r0, [r7, #12]
|
|
800f774: 60b9 str r1, [r7, #8]
|
|
800f776: 607a str r2, [r7, #4]
|
|
struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev = NULL;
|
|
800f778: 2300 movs r3, #0
|
|
800f77a: 62bb str r3, [r7, #40] ; 0x28
|
|
struct pbuf *q;
|
|
u16_t offset, len;
|
|
u8_t hlen;
|
|
struct ip_hdr *fraghdr;
|
|
int valid = 1;
|
|
800f77c: 2301 movs r3, #1
|
|
800f77e: 623b str r3, [r7, #32]
|
|
|
|
/* Extract length and fragment offset from current fragment */
|
|
fraghdr = (struct ip_hdr *)new_p->payload;
|
|
800f780: 68bb ldr r3, [r7, #8]
|
|
800f782: 685b ldr r3, [r3, #4]
|
|
800f784: 61fb str r3, [r7, #28]
|
|
len = lwip_ntohs(IPH_LEN(fraghdr));
|
|
800f786: 69fb ldr r3, [r7, #28]
|
|
800f788: 885b ldrh r3, [r3, #2]
|
|
800f78a: b29b uxth r3, r3
|
|
800f78c: 4618 mov r0, r3
|
|
800f78e: f7f5 fedd bl 800554c <lwip_htons>
|
|
800f792: 4603 mov r3, r0
|
|
800f794: 837b strh r3, [r7, #26]
|
|
hlen = IPH_HL_BYTES(fraghdr);
|
|
800f796: 69fb ldr r3, [r7, #28]
|
|
800f798: 781b ldrb r3, [r3, #0]
|
|
800f79a: f003 030f and.w r3, r3, #15
|
|
800f79e: b2db uxtb r3, r3
|
|
800f7a0: 009b lsls r3, r3, #2
|
|
800f7a2: 767b strb r3, [r7, #25]
|
|
if (hlen > len) {
|
|
800f7a4: 7e7b ldrb r3, [r7, #25]
|
|
800f7a6: b29b uxth r3, r3
|
|
800f7a8: 8b7a ldrh r2, [r7, #26]
|
|
800f7aa: 429a cmp r2, r3
|
|
800f7ac: d202 bcs.n 800f7b4 <ip_reass_chain_frag_into_datagram_and_validate+0x48>
|
|
/* invalid datagram */
|
|
return IP_REASS_VALIDATE_PBUF_DROPPED;
|
|
800f7ae: f04f 33ff mov.w r3, #4294967295
|
|
800f7b2: e135 b.n 800fa20 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
|
|
}
|
|
len = (u16_t)(len - hlen);
|
|
800f7b4: 7e7b ldrb r3, [r7, #25]
|
|
800f7b6: b29b uxth r3, r3
|
|
800f7b8: 8b7a ldrh r2, [r7, #26]
|
|
800f7ba: 1ad3 subs r3, r2, r3
|
|
800f7bc: 837b strh r3, [r7, #26]
|
|
offset = IPH_OFFSET_BYTES(fraghdr);
|
|
800f7be: 69fb ldr r3, [r7, #28]
|
|
800f7c0: 88db ldrh r3, [r3, #6]
|
|
800f7c2: b29b uxth r3, r3
|
|
800f7c4: 4618 mov r0, r3
|
|
800f7c6: f7f5 fec1 bl 800554c <lwip_htons>
|
|
800f7ca: 4603 mov r3, r0
|
|
800f7cc: f3c3 030c ubfx r3, r3, #0, #13
|
|
800f7d0: b29b uxth r3, r3
|
|
800f7d2: 00db lsls r3, r3, #3
|
|
800f7d4: 82fb strh r3, [r7, #22]
|
|
/* overwrite the fragment's ip header from the pbuf with our helper struct,
|
|
* and setup the embedded helper structure. */
|
|
/* make sure the struct ip_reass_helper fits into the IP header */
|
|
LWIP_ASSERT("sizeof(struct ip_reass_helper) <= IP_HLEN",
|
|
sizeof(struct ip_reass_helper) <= IP_HLEN);
|
|
iprh = (struct ip_reass_helper *)new_p->payload;
|
|
800f7d6: 68bb ldr r3, [r7, #8]
|
|
800f7d8: 685b ldr r3, [r3, #4]
|
|
800f7da: 62fb str r3, [r7, #44] ; 0x2c
|
|
iprh->next_pbuf = NULL;
|
|
800f7dc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f7de: 2200 movs r2, #0
|
|
800f7e0: 701a strb r2, [r3, #0]
|
|
800f7e2: 2200 movs r2, #0
|
|
800f7e4: 705a strb r2, [r3, #1]
|
|
800f7e6: 2200 movs r2, #0
|
|
800f7e8: 709a strb r2, [r3, #2]
|
|
800f7ea: 2200 movs r2, #0
|
|
800f7ec: 70da strb r2, [r3, #3]
|
|
iprh->start = offset;
|
|
800f7ee: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f7f0: 8afa ldrh r2, [r7, #22]
|
|
800f7f2: 809a strh r2, [r3, #4]
|
|
iprh->end = (u16_t)(offset + len);
|
|
800f7f4: 8afa ldrh r2, [r7, #22]
|
|
800f7f6: 8b7b ldrh r3, [r7, #26]
|
|
800f7f8: 4413 add r3, r2
|
|
800f7fa: b29a uxth r2, r3
|
|
800f7fc: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f7fe: 80da strh r2, [r3, #6]
|
|
if (iprh->end < offset) {
|
|
800f800: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f802: 88db ldrh r3, [r3, #6]
|
|
800f804: b29b uxth r3, r3
|
|
800f806: 8afa ldrh r2, [r7, #22]
|
|
800f808: 429a cmp r2, r3
|
|
800f80a: d902 bls.n 800f812 <ip_reass_chain_frag_into_datagram_and_validate+0xa6>
|
|
/* u16_t overflow, cannot handle this */
|
|
return IP_REASS_VALIDATE_PBUF_DROPPED;
|
|
800f80c: f04f 33ff mov.w r3, #4294967295
|
|
800f810: e106 b.n 800fa20 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
|
|
}
|
|
|
|
/* Iterate through until we either get to the end of the list (append),
|
|
* or we find one with a larger offset (insert). */
|
|
for (q = ipr->p; q != NULL;) {
|
|
800f812: 68fb ldr r3, [r7, #12]
|
|
800f814: 685b ldr r3, [r3, #4]
|
|
800f816: 627b str r3, [r7, #36] ; 0x24
|
|
800f818: e068 b.n 800f8ec <ip_reass_chain_frag_into_datagram_and_validate+0x180>
|
|
iprh_tmp = (struct ip_reass_helper *)q->payload;
|
|
800f81a: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f81c: 685b ldr r3, [r3, #4]
|
|
800f81e: 613b str r3, [r7, #16]
|
|
if (iprh->start < iprh_tmp->start) {
|
|
800f820: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f822: 889b ldrh r3, [r3, #4]
|
|
800f824: b29a uxth r2, r3
|
|
800f826: 693b ldr r3, [r7, #16]
|
|
800f828: 889b ldrh r3, [r3, #4]
|
|
800f82a: b29b uxth r3, r3
|
|
800f82c: 429a cmp r2, r3
|
|
800f82e: d235 bcs.n 800f89c <ip_reass_chain_frag_into_datagram_and_validate+0x130>
|
|
/* the new pbuf should be inserted before this */
|
|
iprh->next_pbuf = q;
|
|
800f830: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f832: 6a7a ldr r2, [r7, #36] ; 0x24
|
|
800f834: 601a str r2, [r3, #0]
|
|
if (iprh_prev != NULL) {
|
|
800f836: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f838: 2b00 cmp r3, #0
|
|
800f83a: d020 beq.n 800f87e <ip_reass_chain_frag_into_datagram_and_validate+0x112>
|
|
/* not the fragment with the lowest offset */
|
|
#if IP_REASS_CHECK_OVERLAP
|
|
if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) {
|
|
800f83c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f83e: 889b ldrh r3, [r3, #4]
|
|
800f840: b29a uxth r2, r3
|
|
800f842: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f844: 88db ldrh r3, [r3, #6]
|
|
800f846: b29b uxth r3, r3
|
|
800f848: 429a cmp r2, r3
|
|
800f84a: d307 bcc.n 800f85c <ip_reass_chain_frag_into_datagram_and_validate+0xf0>
|
|
800f84c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f84e: 88db ldrh r3, [r3, #6]
|
|
800f850: b29a uxth r2, r3
|
|
800f852: 693b ldr r3, [r7, #16]
|
|
800f854: 889b ldrh r3, [r3, #4]
|
|
800f856: b29b uxth r3, r3
|
|
800f858: 429a cmp r2, r3
|
|
800f85a: d902 bls.n 800f862 <ip_reass_chain_frag_into_datagram_and_validate+0xf6>
|
|
/* fragment overlaps with previous or following, throw away */
|
|
return IP_REASS_VALIDATE_PBUF_DROPPED;
|
|
800f85c: f04f 33ff mov.w r3, #4294967295
|
|
800f860: e0de b.n 800fa20 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
|
|
}
|
|
#endif /* IP_REASS_CHECK_OVERLAP */
|
|
iprh_prev->next_pbuf = new_p;
|
|
800f862: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f864: 68ba ldr r2, [r7, #8]
|
|
800f866: 601a str r2, [r3, #0]
|
|
if (iprh_prev->end != iprh->start) {
|
|
800f868: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f86a: 88db ldrh r3, [r3, #6]
|
|
800f86c: b29a uxth r2, r3
|
|
800f86e: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f870: 889b ldrh r3, [r3, #4]
|
|
800f872: b29b uxth r3, r3
|
|
800f874: 429a cmp r2, r3
|
|
800f876: d03d beq.n 800f8f4 <ip_reass_chain_frag_into_datagram_and_validate+0x188>
|
|
/* There is a fragment missing between the current
|
|
* and the previous fragment */
|
|
valid = 0;
|
|
800f878: 2300 movs r3, #0
|
|
800f87a: 623b str r3, [r7, #32]
|
|
}
|
|
#endif /* IP_REASS_CHECK_OVERLAP */
|
|
/* fragment with the lowest offset */
|
|
ipr->p = new_p;
|
|
}
|
|
break;
|
|
800f87c: e03a b.n 800f8f4 <ip_reass_chain_frag_into_datagram_and_validate+0x188>
|
|
if (iprh->end > iprh_tmp->start) {
|
|
800f87e: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f880: 88db ldrh r3, [r3, #6]
|
|
800f882: b29a uxth r2, r3
|
|
800f884: 693b ldr r3, [r7, #16]
|
|
800f886: 889b ldrh r3, [r3, #4]
|
|
800f888: b29b uxth r3, r3
|
|
800f88a: 429a cmp r2, r3
|
|
800f88c: d902 bls.n 800f894 <ip_reass_chain_frag_into_datagram_and_validate+0x128>
|
|
return IP_REASS_VALIDATE_PBUF_DROPPED;
|
|
800f88e: f04f 33ff mov.w r3, #4294967295
|
|
800f892: e0c5 b.n 800fa20 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
|
|
ipr->p = new_p;
|
|
800f894: 68fb ldr r3, [r7, #12]
|
|
800f896: 68ba ldr r2, [r7, #8]
|
|
800f898: 605a str r2, [r3, #4]
|
|
break;
|
|
800f89a: e02b b.n 800f8f4 <ip_reass_chain_frag_into_datagram_and_validate+0x188>
|
|
} else if (iprh->start == iprh_tmp->start) {
|
|
800f89c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f89e: 889b ldrh r3, [r3, #4]
|
|
800f8a0: b29a uxth r2, r3
|
|
800f8a2: 693b ldr r3, [r7, #16]
|
|
800f8a4: 889b ldrh r3, [r3, #4]
|
|
800f8a6: b29b uxth r3, r3
|
|
800f8a8: 429a cmp r2, r3
|
|
800f8aa: d102 bne.n 800f8b2 <ip_reass_chain_frag_into_datagram_and_validate+0x146>
|
|
/* received the same datagram twice: no need to keep the datagram */
|
|
return IP_REASS_VALIDATE_PBUF_DROPPED;
|
|
800f8ac: f04f 33ff mov.w r3, #4294967295
|
|
800f8b0: e0b6 b.n 800fa20 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
|
|
#if IP_REASS_CHECK_OVERLAP
|
|
} else if (iprh->start < iprh_tmp->end) {
|
|
800f8b2: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f8b4: 889b ldrh r3, [r3, #4]
|
|
800f8b6: b29a uxth r2, r3
|
|
800f8b8: 693b ldr r3, [r7, #16]
|
|
800f8ba: 88db ldrh r3, [r3, #6]
|
|
800f8bc: b29b uxth r3, r3
|
|
800f8be: 429a cmp r2, r3
|
|
800f8c0: d202 bcs.n 800f8c8 <ip_reass_chain_frag_into_datagram_and_validate+0x15c>
|
|
/* overlap: no need to keep the new datagram */
|
|
return IP_REASS_VALIDATE_PBUF_DROPPED;
|
|
800f8c2: f04f 33ff mov.w r3, #4294967295
|
|
800f8c6: e0ab b.n 800fa20 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
|
|
#endif /* IP_REASS_CHECK_OVERLAP */
|
|
} else {
|
|
/* Check if the fragments received so far have no holes. */
|
|
if (iprh_prev != NULL) {
|
|
800f8c8: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f8ca: 2b00 cmp r3, #0
|
|
800f8cc: d009 beq.n 800f8e2 <ip_reass_chain_frag_into_datagram_and_validate+0x176>
|
|
if (iprh_prev->end != iprh_tmp->start) {
|
|
800f8ce: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f8d0: 88db ldrh r3, [r3, #6]
|
|
800f8d2: b29a uxth r2, r3
|
|
800f8d4: 693b ldr r3, [r7, #16]
|
|
800f8d6: 889b ldrh r3, [r3, #4]
|
|
800f8d8: b29b uxth r3, r3
|
|
800f8da: 429a cmp r2, r3
|
|
800f8dc: d001 beq.n 800f8e2 <ip_reass_chain_frag_into_datagram_and_validate+0x176>
|
|
/* There is a fragment missing between the current
|
|
* and the previous fragment */
|
|
valid = 0;
|
|
800f8de: 2300 movs r3, #0
|
|
800f8e0: 623b str r3, [r7, #32]
|
|
}
|
|
}
|
|
}
|
|
q = iprh_tmp->next_pbuf;
|
|
800f8e2: 693b ldr r3, [r7, #16]
|
|
800f8e4: 681b ldr r3, [r3, #0]
|
|
800f8e6: 627b str r3, [r7, #36] ; 0x24
|
|
iprh_prev = iprh_tmp;
|
|
800f8e8: 693b ldr r3, [r7, #16]
|
|
800f8ea: 62bb str r3, [r7, #40] ; 0x28
|
|
for (q = ipr->p; q != NULL;) {
|
|
800f8ec: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f8ee: 2b00 cmp r3, #0
|
|
800f8f0: d193 bne.n 800f81a <ip_reass_chain_frag_into_datagram_and_validate+0xae>
|
|
800f8f2: e000 b.n 800f8f6 <ip_reass_chain_frag_into_datagram_and_validate+0x18a>
|
|
break;
|
|
800f8f4: bf00 nop
|
|
}
|
|
|
|
/* If q is NULL, then we made it to the end of the list. Determine what to do now */
|
|
if (q == NULL) {
|
|
800f8f6: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f8f8: 2b00 cmp r3, #0
|
|
800f8fa: d12d bne.n 800f958 <ip_reass_chain_frag_into_datagram_and_validate+0x1ec>
|
|
if (iprh_prev != NULL) {
|
|
800f8fc: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f8fe: 2b00 cmp r3, #0
|
|
800f900: d01c beq.n 800f93c <ip_reass_chain_frag_into_datagram_and_validate+0x1d0>
|
|
/* this is (for now), the fragment with the highest offset:
|
|
* chain it to the last fragment */
|
|
#if IP_REASS_CHECK_OVERLAP
|
|
LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start);
|
|
800f902: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f904: 88db ldrh r3, [r3, #6]
|
|
800f906: b29a uxth r2, r3
|
|
800f908: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f90a: 889b ldrh r3, [r3, #4]
|
|
800f90c: b29b uxth r3, r3
|
|
800f90e: 429a cmp r2, r3
|
|
800f910: d906 bls.n 800f920 <ip_reass_chain_frag_into_datagram_and_validate+0x1b4>
|
|
800f912: 4b45 ldr r3, [pc, #276] ; (800fa28 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
|
|
800f914: f44f 72db mov.w r2, #438 ; 0x1b6
|
|
800f918: 4944 ldr r1, [pc, #272] ; (800fa2c <ip_reass_chain_frag_into_datagram_and_validate+0x2c0>)
|
|
800f91a: 4845 ldr r0, [pc, #276] ; (800fa30 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
|
|
800f91c: f001 f954 bl 8010bc8 <iprintf>
|
|
#endif /* IP_REASS_CHECK_OVERLAP */
|
|
iprh_prev->next_pbuf = new_p;
|
|
800f920: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f922: 68ba ldr r2, [r7, #8]
|
|
800f924: 601a str r2, [r3, #0]
|
|
if (iprh_prev->end != iprh->start) {
|
|
800f926: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f928: 88db ldrh r3, [r3, #6]
|
|
800f92a: b29a uxth r2, r3
|
|
800f92c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f92e: 889b ldrh r3, [r3, #4]
|
|
800f930: b29b uxth r3, r3
|
|
800f932: 429a cmp r2, r3
|
|
800f934: d010 beq.n 800f958 <ip_reass_chain_frag_into_datagram_and_validate+0x1ec>
|
|
valid = 0;
|
|
800f936: 2300 movs r3, #0
|
|
800f938: 623b str r3, [r7, #32]
|
|
800f93a: e00d b.n 800f958 <ip_reass_chain_frag_into_datagram_and_validate+0x1ec>
|
|
}
|
|
} else {
|
|
#if IP_REASS_CHECK_OVERLAP
|
|
LWIP_ASSERT("no previous fragment, this must be the first fragment!",
|
|
800f93c: 68fb ldr r3, [r7, #12]
|
|
800f93e: 685b ldr r3, [r3, #4]
|
|
800f940: 2b00 cmp r3, #0
|
|
800f942: d006 beq.n 800f952 <ip_reass_chain_frag_into_datagram_and_validate+0x1e6>
|
|
800f944: 4b38 ldr r3, [pc, #224] ; (800fa28 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
|
|
800f946: f44f 72df mov.w r2, #446 ; 0x1be
|
|
800f94a: 493a ldr r1, [pc, #232] ; (800fa34 <ip_reass_chain_frag_into_datagram_and_validate+0x2c8>)
|
|
800f94c: 4838 ldr r0, [pc, #224] ; (800fa30 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
|
|
800f94e: f001 f93b bl 8010bc8 <iprintf>
|
|
ipr->p == NULL);
|
|
#endif /* IP_REASS_CHECK_OVERLAP */
|
|
/* this is the first fragment we ever received for this ip datagram */
|
|
ipr->p = new_p;
|
|
800f952: 68fb ldr r3, [r7, #12]
|
|
800f954: 68ba ldr r2, [r7, #8]
|
|
800f956: 605a str r2, [r3, #4]
|
|
}
|
|
}
|
|
|
|
/* At this point, the validation part begins: */
|
|
/* If we already received the last fragment */
|
|
if (is_last || ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0)) {
|
|
800f958: 687b ldr r3, [r7, #4]
|
|
800f95a: 2b00 cmp r3, #0
|
|
800f95c: d105 bne.n 800f96a <ip_reass_chain_frag_into_datagram_and_validate+0x1fe>
|
|
800f95e: 68fb ldr r3, [r7, #12]
|
|
800f960: 7f9b ldrb r3, [r3, #30]
|
|
800f962: f003 0301 and.w r3, r3, #1
|
|
800f966: 2b00 cmp r3, #0
|
|
800f968: d059 beq.n 800fa1e <ip_reass_chain_frag_into_datagram_and_validate+0x2b2>
|
|
/* and had no holes so far */
|
|
if (valid) {
|
|
800f96a: 6a3b ldr r3, [r7, #32]
|
|
800f96c: 2b00 cmp r3, #0
|
|
800f96e: d04f beq.n 800fa10 <ip_reass_chain_frag_into_datagram_and_validate+0x2a4>
|
|
/* then check if the rest of the fragments is here */
|
|
/* Check if the queue starts with the first datagram */
|
|
if ((ipr->p == NULL) || (((struct ip_reass_helper *)ipr->p->payload)->start != 0)) {
|
|
800f970: 68fb ldr r3, [r7, #12]
|
|
800f972: 685b ldr r3, [r3, #4]
|
|
800f974: 2b00 cmp r3, #0
|
|
800f976: d006 beq.n 800f986 <ip_reass_chain_frag_into_datagram_and_validate+0x21a>
|
|
800f978: 68fb ldr r3, [r7, #12]
|
|
800f97a: 685b ldr r3, [r3, #4]
|
|
800f97c: 685b ldr r3, [r3, #4]
|
|
800f97e: 889b ldrh r3, [r3, #4]
|
|
800f980: b29b uxth r3, r3
|
|
800f982: 2b00 cmp r3, #0
|
|
800f984: d002 beq.n 800f98c <ip_reass_chain_frag_into_datagram_and_validate+0x220>
|
|
valid = 0;
|
|
800f986: 2300 movs r3, #0
|
|
800f988: 623b str r3, [r7, #32]
|
|
800f98a: e041 b.n 800fa10 <ip_reass_chain_frag_into_datagram_and_validate+0x2a4>
|
|
} else {
|
|
/* and check that there are no holes after this datagram */
|
|
iprh_prev = iprh;
|
|
800f98c: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f98e: 62bb str r3, [r7, #40] ; 0x28
|
|
q = iprh->next_pbuf;
|
|
800f990: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f992: 681b ldr r3, [r3, #0]
|
|
800f994: 627b str r3, [r7, #36] ; 0x24
|
|
while (q != NULL) {
|
|
800f996: e012 b.n 800f9be <ip_reass_chain_frag_into_datagram_and_validate+0x252>
|
|
iprh = (struct ip_reass_helper *)q->payload;
|
|
800f998: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f99a: 685b ldr r3, [r3, #4]
|
|
800f99c: 62fb str r3, [r7, #44] ; 0x2c
|
|
if (iprh_prev->end != iprh->start) {
|
|
800f99e: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800f9a0: 88db ldrh r3, [r3, #6]
|
|
800f9a2: b29a uxth r2, r3
|
|
800f9a4: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f9a6: 889b ldrh r3, [r3, #4]
|
|
800f9a8: b29b uxth r3, r3
|
|
800f9aa: 429a cmp r2, r3
|
|
800f9ac: d002 beq.n 800f9b4 <ip_reass_chain_frag_into_datagram_and_validate+0x248>
|
|
valid = 0;
|
|
800f9ae: 2300 movs r3, #0
|
|
800f9b0: 623b str r3, [r7, #32]
|
|
break;
|
|
800f9b2: e007 b.n 800f9c4 <ip_reass_chain_frag_into_datagram_and_validate+0x258>
|
|
}
|
|
iprh_prev = iprh;
|
|
800f9b4: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f9b6: 62bb str r3, [r7, #40] ; 0x28
|
|
q = iprh->next_pbuf;
|
|
800f9b8: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f9ba: 681b ldr r3, [r3, #0]
|
|
800f9bc: 627b str r3, [r7, #36] ; 0x24
|
|
while (q != NULL) {
|
|
800f9be: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800f9c0: 2b00 cmp r3, #0
|
|
800f9c2: d1e9 bne.n 800f998 <ip_reass_chain_frag_into_datagram_and_validate+0x22c>
|
|
}
|
|
/* if still valid, all fragments are received
|
|
* (because to the MF==0 already arrived */
|
|
if (valid) {
|
|
800f9c4: 6a3b ldr r3, [r7, #32]
|
|
800f9c6: 2b00 cmp r3, #0
|
|
800f9c8: d022 beq.n 800fa10 <ip_reass_chain_frag_into_datagram_and_validate+0x2a4>
|
|
LWIP_ASSERT("sanity check", ipr->p != NULL);
|
|
800f9ca: 68fb ldr r3, [r7, #12]
|
|
800f9cc: 685b ldr r3, [r3, #4]
|
|
800f9ce: 2b00 cmp r3, #0
|
|
800f9d0: d106 bne.n 800f9e0 <ip_reass_chain_frag_into_datagram_and_validate+0x274>
|
|
800f9d2: 4b15 ldr r3, [pc, #84] ; (800fa28 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
|
|
800f9d4: f240 12df movw r2, #479 ; 0x1df
|
|
800f9d8: 4917 ldr r1, [pc, #92] ; (800fa38 <ip_reass_chain_frag_into_datagram_and_validate+0x2cc>)
|
|
800f9da: 4815 ldr r0, [pc, #84] ; (800fa30 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
|
|
800f9dc: f001 f8f4 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("sanity check",
|
|
800f9e0: 68fb ldr r3, [r7, #12]
|
|
800f9e2: 685b ldr r3, [r3, #4]
|
|
800f9e4: 685b ldr r3, [r3, #4]
|
|
800f9e6: 6afa ldr r2, [r7, #44] ; 0x2c
|
|
800f9e8: 429a cmp r2, r3
|
|
800f9ea: d106 bne.n 800f9fa <ip_reass_chain_frag_into_datagram_and_validate+0x28e>
|
|
800f9ec: 4b0e ldr r3, [pc, #56] ; (800fa28 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
|
|
800f9ee: f44f 72f0 mov.w r2, #480 ; 0x1e0
|
|
800f9f2: 4911 ldr r1, [pc, #68] ; (800fa38 <ip_reass_chain_frag_into_datagram_and_validate+0x2cc>)
|
|
800f9f4: 480e ldr r0, [pc, #56] ; (800fa30 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
|
|
800f9f6: f001 f8e7 bl 8010bc8 <iprintf>
|
|
((struct ip_reass_helper *)ipr->p->payload) != iprh);
|
|
LWIP_ASSERT("validate_datagram:next_pbuf!=NULL",
|
|
800f9fa: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800f9fc: 681b ldr r3, [r3, #0]
|
|
800f9fe: 2b00 cmp r3, #0
|
|
800fa00: d006 beq.n 800fa10 <ip_reass_chain_frag_into_datagram_and_validate+0x2a4>
|
|
800fa02: 4b09 ldr r3, [pc, #36] ; (800fa28 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
|
|
800fa04: f44f 72f1 mov.w r2, #482 ; 0x1e2
|
|
800fa08: 490c ldr r1, [pc, #48] ; (800fa3c <ip_reass_chain_frag_into_datagram_and_validate+0x2d0>)
|
|
800fa0a: 4809 ldr r0, [pc, #36] ; (800fa30 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
|
|
800fa0c: f001 f8dc bl 8010bc8 <iprintf>
|
|
}
|
|
}
|
|
/* If valid is 0 here, there are some fragments missing in the middle
|
|
* (since MF == 0 has already arrived). Such datagrams simply time out if
|
|
* no more fragments are received... */
|
|
return valid ? IP_REASS_VALIDATE_TELEGRAM_FINISHED : IP_REASS_VALIDATE_PBUF_QUEUED;
|
|
800fa10: 6a3b ldr r3, [r7, #32]
|
|
800fa12: 2b00 cmp r3, #0
|
|
800fa14: bf14 ite ne
|
|
800fa16: 2301 movne r3, #1
|
|
800fa18: 2300 moveq r3, #0
|
|
800fa1a: b2db uxtb r3, r3
|
|
800fa1c: e000 b.n 800fa20 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
|
|
}
|
|
/* If we come here, not all fragments were received, yet! */
|
|
return IP_REASS_VALIDATE_PBUF_QUEUED; /* not yet valid! */
|
|
800fa1e: 2300 movs r3, #0
|
|
}
|
|
800fa20: 4618 mov r0, r3
|
|
800fa22: 3730 adds r7, #48 ; 0x30
|
|
800fa24: 46bd mov sp, r7
|
|
800fa26: bd80 pop {r7, pc}
|
|
800fa28: 080149bc .word 0x080149bc
|
|
800fa2c: 08014aa0 .word 0x08014aa0
|
|
800fa30: 08014a04 .word 0x08014a04
|
|
800fa34: 08014ac0 .word 0x08014ac0
|
|
800fa38: 08014af8 .word 0x08014af8
|
|
800fa3c: 08014b08 .word 0x08014b08
|
|
|
|
0800fa40 <ip4_reass>:
|
|
* @param p points to a pbuf chain of the fragment
|
|
* @return NULL if reassembly is incomplete, ? otherwise
|
|
*/
|
|
struct pbuf *
|
|
ip4_reass(struct pbuf *p)
|
|
{
|
|
800fa40: b580 push {r7, lr}
|
|
800fa42: b08e sub sp, #56 ; 0x38
|
|
800fa44: af00 add r7, sp, #0
|
|
800fa46: 6078 str r0, [r7, #4]
|
|
int is_last;
|
|
|
|
IPFRAG_STATS_INC(ip_frag.recv);
|
|
MIB2_STATS_INC(mib2.ipreasmreqds);
|
|
|
|
fraghdr = (struct ip_hdr *)p->payload;
|
|
800fa48: 687b ldr r3, [r7, #4]
|
|
800fa4a: 685b ldr r3, [r3, #4]
|
|
800fa4c: 62bb str r3, [r7, #40] ; 0x28
|
|
|
|
if (IPH_HL_BYTES(fraghdr) != IP_HLEN) {
|
|
800fa4e: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fa50: 781b ldrb r3, [r3, #0]
|
|
800fa52: f003 030f and.w r3, r3, #15
|
|
800fa56: b2db uxtb r3, r3
|
|
800fa58: 009b lsls r3, r3, #2
|
|
800fa5a: b2db uxtb r3, r3
|
|
800fa5c: 2b14 cmp r3, #20
|
|
800fa5e: f040 8171 bne.w 800fd44 <ip4_reass+0x304>
|
|
LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: IP options currently not supported!\n"));
|
|
IPFRAG_STATS_INC(ip_frag.err);
|
|
goto nullreturn;
|
|
}
|
|
|
|
offset = IPH_OFFSET_BYTES(fraghdr);
|
|
800fa62: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fa64: 88db ldrh r3, [r3, #6]
|
|
800fa66: b29b uxth r3, r3
|
|
800fa68: 4618 mov r0, r3
|
|
800fa6a: f7f5 fd6f bl 800554c <lwip_htons>
|
|
800fa6e: 4603 mov r3, r0
|
|
800fa70: f3c3 030c ubfx r3, r3, #0, #13
|
|
800fa74: b29b uxth r3, r3
|
|
800fa76: 00db lsls r3, r3, #3
|
|
800fa78: 84fb strh r3, [r7, #38] ; 0x26
|
|
len = lwip_ntohs(IPH_LEN(fraghdr));
|
|
800fa7a: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fa7c: 885b ldrh r3, [r3, #2]
|
|
800fa7e: b29b uxth r3, r3
|
|
800fa80: 4618 mov r0, r3
|
|
800fa82: f7f5 fd63 bl 800554c <lwip_htons>
|
|
800fa86: 4603 mov r3, r0
|
|
800fa88: 84bb strh r3, [r7, #36] ; 0x24
|
|
hlen = IPH_HL_BYTES(fraghdr);
|
|
800fa8a: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fa8c: 781b ldrb r3, [r3, #0]
|
|
800fa8e: f003 030f and.w r3, r3, #15
|
|
800fa92: b2db uxtb r3, r3
|
|
800fa94: 009b lsls r3, r3, #2
|
|
800fa96: f887 3023 strb.w r3, [r7, #35] ; 0x23
|
|
if (hlen > len) {
|
|
800fa9a: f897 3023 ldrb.w r3, [r7, #35] ; 0x23
|
|
800fa9e: b29b uxth r3, r3
|
|
800faa0: 8cba ldrh r2, [r7, #36] ; 0x24
|
|
800faa2: 429a cmp r2, r3
|
|
800faa4: f0c0 8150 bcc.w 800fd48 <ip4_reass+0x308>
|
|
/* invalid datagram */
|
|
goto nullreturn;
|
|
}
|
|
len = (u16_t)(len - hlen);
|
|
800faa8: f897 3023 ldrb.w r3, [r7, #35] ; 0x23
|
|
800faac: b29b uxth r3, r3
|
|
800faae: 8cba ldrh r2, [r7, #36] ; 0x24
|
|
800fab0: 1ad3 subs r3, r2, r3
|
|
800fab2: 84bb strh r3, [r7, #36] ; 0x24
|
|
|
|
/* Check if we are allowed to enqueue more datagrams. */
|
|
clen = pbuf_clen(p);
|
|
800fab4: 6878 ldr r0, [r7, #4]
|
|
800fab6: f7f7 fb15 bl 80070e4 <pbuf_clen>
|
|
800faba: 4603 mov r3, r0
|
|
800fabc: 843b strh r3, [r7, #32]
|
|
if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) {
|
|
800fabe: 4b8c ldr r3, [pc, #560] ; (800fcf0 <ip4_reass+0x2b0>)
|
|
800fac0: 881b ldrh r3, [r3, #0]
|
|
800fac2: 461a mov r2, r3
|
|
800fac4: 8c3b ldrh r3, [r7, #32]
|
|
800fac6: 4413 add r3, r2
|
|
800fac8: 2b0a cmp r3, #10
|
|
800faca: dd10 ble.n 800faee <ip4_reass+0xae>
|
|
#if IP_REASS_FREE_OLDEST
|
|
if (!ip_reass_remove_oldest_datagram(fraghdr, clen) ||
|
|
800facc: 8c3b ldrh r3, [r7, #32]
|
|
800face: 4619 mov r1, r3
|
|
800fad0: 6ab8 ldr r0, [r7, #40] ; 0x28
|
|
800fad2: f7ff fd81 bl 800f5d8 <ip_reass_remove_oldest_datagram>
|
|
800fad6: 4603 mov r3, r0
|
|
800fad8: 2b00 cmp r3, #0
|
|
800fada: f000 8137 beq.w 800fd4c <ip4_reass+0x30c>
|
|
((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS))
|
|
800fade: 4b84 ldr r3, [pc, #528] ; (800fcf0 <ip4_reass+0x2b0>)
|
|
800fae0: 881b ldrh r3, [r3, #0]
|
|
800fae2: 461a mov r2, r3
|
|
800fae4: 8c3b ldrh r3, [r7, #32]
|
|
800fae6: 4413 add r3, r2
|
|
if (!ip_reass_remove_oldest_datagram(fraghdr, clen) ||
|
|
800fae8: 2b0a cmp r3, #10
|
|
800faea: f300 812f bgt.w 800fd4c <ip4_reass+0x30c>
|
|
}
|
|
}
|
|
|
|
/* Look for the datagram the fragment belongs to in the current datagram queue,
|
|
* remembering the previous in the queue for later dequeueing. */
|
|
for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) {
|
|
800faee: 4b81 ldr r3, [pc, #516] ; (800fcf4 <ip4_reass+0x2b4>)
|
|
800faf0: 681b ldr r3, [r3, #0]
|
|
800faf2: 633b str r3, [r7, #48] ; 0x30
|
|
800faf4: e015 b.n 800fb22 <ip4_reass+0xe2>
|
|
/* Check if the incoming fragment matches the one currently present
|
|
in the reassembly buffer. If so, we proceed with copying the
|
|
fragment into the buffer. */
|
|
if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) {
|
|
800faf6: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800faf8: 695a ldr r2, [r3, #20]
|
|
800fafa: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fafc: 68db ldr r3, [r3, #12]
|
|
800fafe: 429a cmp r2, r3
|
|
800fb00: d10c bne.n 800fb1c <ip4_reass+0xdc>
|
|
800fb02: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fb04: 699a ldr r2, [r3, #24]
|
|
800fb06: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fb08: 691b ldr r3, [r3, #16]
|
|
800fb0a: 429a cmp r2, r3
|
|
800fb0c: d106 bne.n 800fb1c <ip4_reass+0xdc>
|
|
800fb0e: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fb10: 899a ldrh r2, [r3, #12]
|
|
800fb12: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fb14: 889b ldrh r3, [r3, #4]
|
|
800fb16: b29b uxth r3, r3
|
|
800fb18: 429a cmp r2, r3
|
|
800fb1a: d006 beq.n 800fb2a <ip4_reass+0xea>
|
|
for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) {
|
|
800fb1c: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fb1e: 681b ldr r3, [r3, #0]
|
|
800fb20: 633b str r3, [r7, #48] ; 0x30
|
|
800fb22: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fb24: 2b00 cmp r3, #0
|
|
800fb26: d1e6 bne.n 800faf6 <ip4_reass+0xb6>
|
|
800fb28: e000 b.n 800fb2c <ip4_reass+0xec>
|
|
LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: matching previous fragment ID=%"X16_F"\n",
|
|
lwip_ntohs(IPH_ID(fraghdr))));
|
|
IPFRAG_STATS_INC(ip_frag.cachehit);
|
|
break;
|
|
800fb2a: bf00 nop
|
|
}
|
|
}
|
|
|
|
if (ipr == NULL) {
|
|
800fb2c: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fb2e: 2b00 cmp r3, #0
|
|
800fb30: d109 bne.n 800fb46 <ip4_reass+0x106>
|
|
/* Enqueue a new datagram into the datagram queue */
|
|
ipr = ip_reass_enqueue_new_datagram(fraghdr, clen);
|
|
800fb32: 8c3b ldrh r3, [r7, #32]
|
|
800fb34: 4619 mov r1, r3
|
|
800fb36: 6ab8 ldr r0, [r7, #40] ; 0x28
|
|
800fb38: f7ff fdb0 bl 800f69c <ip_reass_enqueue_new_datagram>
|
|
800fb3c: 6338 str r0, [r7, #48] ; 0x30
|
|
/* Bail if unable to enqueue */
|
|
if (ipr == NULL) {
|
|
800fb3e: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fb40: 2b00 cmp r3, #0
|
|
800fb42: d11c bne.n 800fb7e <ip4_reass+0x13e>
|
|
goto nullreturn;
|
|
800fb44: e105 b.n 800fd52 <ip4_reass+0x312>
|
|
}
|
|
} else {
|
|
if (((lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) &&
|
|
800fb46: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fb48: 88db ldrh r3, [r3, #6]
|
|
800fb4a: b29b uxth r3, r3
|
|
800fb4c: 4618 mov r0, r3
|
|
800fb4e: f7f5 fcfd bl 800554c <lwip_htons>
|
|
800fb52: 4603 mov r3, r0
|
|
800fb54: f3c3 030c ubfx r3, r3, #0, #13
|
|
800fb58: 2b00 cmp r3, #0
|
|
800fb5a: d110 bne.n 800fb7e <ip4_reass+0x13e>
|
|
((lwip_ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) {
|
|
800fb5c: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fb5e: 89db ldrh r3, [r3, #14]
|
|
800fb60: 4618 mov r0, r3
|
|
800fb62: f7f5 fcf3 bl 800554c <lwip_htons>
|
|
800fb66: 4603 mov r3, r0
|
|
800fb68: f3c3 030c ubfx r3, r3, #0, #13
|
|
if (((lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) &&
|
|
800fb6c: 2b00 cmp r3, #0
|
|
800fb6e: d006 beq.n 800fb7e <ip4_reass+0x13e>
|
|
/* ipr->iphdr is not the header from the first fragment, but fraghdr is
|
|
* -> copy fraghdr into ipr->iphdr since we want to have the header
|
|
* of the first fragment (for ICMP time exceeded and later, for copying
|
|
* all options, if supported)*/
|
|
SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN);
|
|
800fb70: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fb72: 3308 adds r3, #8
|
|
800fb74: 2214 movs r2, #20
|
|
800fb76: 6ab9 ldr r1, [r7, #40] ; 0x28
|
|
800fb78: 4618 mov r0, r3
|
|
800fb7a: f001 fa06 bl 8010f8a <memcpy>
|
|
|
|
/* At this point, we have either created a new entry or pointing
|
|
* to an existing one */
|
|
|
|
/* check for 'no more fragments', and update queue entry*/
|
|
is_last = (IPH_OFFSET(fraghdr) & PP_NTOHS(IP_MF)) == 0;
|
|
800fb7e: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fb80: 88db ldrh r3, [r3, #6]
|
|
800fb82: b29b uxth r3, r3
|
|
800fb84: f003 0320 and.w r3, r3, #32
|
|
800fb88: 2b00 cmp r3, #0
|
|
800fb8a: bf0c ite eq
|
|
800fb8c: 2301 moveq r3, #1
|
|
800fb8e: 2300 movne r3, #0
|
|
800fb90: b2db uxtb r3, r3
|
|
800fb92: 61fb str r3, [r7, #28]
|
|
if (is_last) {
|
|
800fb94: 69fb ldr r3, [r7, #28]
|
|
800fb96: 2b00 cmp r3, #0
|
|
800fb98: d00e beq.n 800fbb8 <ip4_reass+0x178>
|
|
u16_t datagram_len = (u16_t)(offset + len);
|
|
800fb9a: 8cfa ldrh r2, [r7, #38] ; 0x26
|
|
800fb9c: 8cbb ldrh r3, [r7, #36] ; 0x24
|
|
800fb9e: 4413 add r3, r2
|
|
800fba0: 837b strh r3, [r7, #26]
|
|
if ((datagram_len < offset) || (datagram_len > (0xFFFF - IP_HLEN))) {
|
|
800fba2: 8b7a ldrh r2, [r7, #26]
|
|
800fba4: 8cfb ldrh r3, [r7, #38] ; 0x26
|
|
800fba6: 429a cmp r2, r3
|
|
800fba8: f0c0 80a0 bcc.w 800fcec <ip4_reass+0x2ac>
|
|
800fbac: 8b7b ldrh r3, [r7, #26]
|
|
800fbae: f64f 72eb movw r2, #65515 ; 0xffeb
|
|
800fbb2: 4293 cmp r3, r2
|
|
800fbb4: f200 809a bhi.w 800fcec <ip4_reass+0x2ac>
|
|
goto nullreturn_ipr;
|
|
}
|
|
}
|
|
/* find the right place to insert this pbuf */
|
|
/* @todo: trim pbufs if fragments are overlapping */
|
|
valid = ip_reass_chain_frag_into_datagram_and_validate(ipr, p, is_last);
|
|
800fbb8: 69fa ldr r2, [r7, #28]
|
|
800fbba: 6879 ldr r1, [r7, #4]
|
|
800fbbc: 6b38 ldr r0, [r7, #48] ; 0x30
|
|
800fbbe: f7ff fdd5 bl 800f76c <ip_reass_chain_frag_into_datagram_and_validate>
|
|
800fbc2: 6178 str r0, [r7, #20]
|
|
if (valid == IP_REASS_VALIDATE_PBUF_DROPPED) {
|
|
800fbc4: 697b ldr r3, [r7, #20]
|
|
800fbc6: f1b3 3fff cmp.w r3, #4294967295
|
|
800fbca: f000 809b beq.w 800fd04 <ip4_reass+0x2c4>
|
|
/* if we come here, the pbuf has been enqueued */
|
|
|
|
/* Track the current number of pbufs current 'in-flight', in order to limit
|
|
the number of fragments that may be enqueued at any one time
|
|
(overflow checked by testing against IP_REASS_MAX_PBUFS) */
|
|
ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount + clen);
|
|
800fbce: 4b48 ldr r3, [pc, #288] ; (800fcf0 <ip4_reass+0x2b0>)
|
|
800fbd0: 881a ldrh r2, [r3, #0]
|
|
800fbd2: 8c3b ldrh r3, [r7, #32]
|
|
800fbd4: 4413 add r3, r2
|
|
800fbd6: b29a uxth r2, r3
|
|
800fbd8: 4b45 ldr r3, [pc, #276] ; (800fcf0 <ip4_reass+0x2b0>)
|
|
800fbda: 801a strh r2, [r3, #0]
|
|
if (is_last) {
|
|
800fbdc: 69fb ldr r3, [r7, #28]
|
|
800fbde: 2b00 cmp r3, #0
|
|
800fbe0: d00d beq.n 800fbfe <ip4_reass+0x1be>
|
|
u16_t datagram_len = (u16_t)(offset + len);
|
|
800fbe2: 8cfa ldrh r2, [r7, #38] ; 0x26
|
|
800fbe4: 8cbb ldrh r3, [r7, #36] ; 0x24
|
|
800fbe6: 4413 add r3, r2
|
|
800fbe8: 827b strh r3, [r7, #18]
|
|
ipr->datagram_len = datagram_len;
|
|
800fbea: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fbec: 8a7a ldrh r2, [r7, #18]
|
|
800fbee: 839a strh r2, [r3, #28]
|
|
ipr->flags |= IP_REASS_FLAG_LASTFRAG;
|
|
800fbf0: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fbf2: 7f9b ldrb r3, [r3, #30]
|
|
800fbf4: f043 0301 orr.w r3, r3, #1
|
|
800fbf8: b2da uxtb r2, r3
|
|
800fbfa: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fbfc: 779a strb r2, [r3, #30]
|
|
LWIP_DEBUGF(IP_REASS_DEBUG,
|
|
("ip4_reass: last fragment seen, total len %"S16_F"\n",
|
|
ipr->datagram_len));
|
|
}
|
|
|
|
if (valid == IP_REASS_VALIDATE_TELEGRAM_FINISHED) {
|
|
800fbfe: 697b ldr r3, [r7, #20]
|
|
800fc00: 2b01 cmp r3, #1
|
|
800fc02: d171 bne.n 800fce8 <ip4_reass+0x2a8>
|
|
struct ip_reassdata *ipr_prev;
|
|
/* the totally last fragment (flag more fragments = 0) was received at least
|
|
* once AND all fragments are received */
|
|
u16_t datagram_len = (u16_t)(ipr->datagram_len + IP_HLEN);
|
|
800fc04: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fc06: 8b9b ldrh r3, [r3, #28]
|
|
800fc08: 3314 adds r3, #20
|
|
800fc0a: 823b strh r3, [r7, #16]
|
|
|
|
/* save the second pbuf before copying the header over the pointer */
|
|
r = ((struct ip_reass_helper *)ipr->p->payload)->next_pbuf;
|
|
800fc0c: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fc0e: 685b ldr r3, [r3, #4]
|
|
800fc10: 685b ldr r3, [r3, #4]
|
|
800fc12: 681b ldr r3, [r3, #0]
|
|
800fc14: 62fb str r3, [r7, #44] ; 0x2c
|
|
|
|
/* copy the original ip header back to the first pbuf */
|
|
fraghdr = (struct ip_hdr *)(ipr->p->payload);
|
|
800fc16: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fc18: 685b ldr r3, [r3, #4]
|
|
800fc1a: 685b ldr r3, [r3, #4]
|
|
800fc1c: 62bb str r3, [r7, #40] ; 0x28
|
|
SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN);
|
|
800fc1e: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fc20: 3308 adds r3, #8
|
|
800fc22: 2214 movs r2, #20
|
|
800fc24: 4619 mov r1, r3
|
|
800fc26: 6ab8 ldr r0, [r7, #40] ; 0x28
|
|
800fc28: f001 f9af bl 8010f8a <memcpy>
|
|
IPH_LEN_SET(fraghdr, lwip_htons(datagram_len));
|
|
800fc2c: 8a3b ldrh r3, [r7, #16]
|
|
800fc2e: 4618 mov r0, r3
|
|
800fc30: f7f5 fc8c bl 800554c <lwip_htons>
|
|
800fc34: 4603 mov r3, r0
|
|
800fc36: 461a mov r2, r3
|
|
800fc38: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fc3a: 805a strh r2, [r3, #2]
|
|
IPH_OFFSET_SET(fraghdr, 0);
|
|
800fc3c: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fc3e: 2200 movs r2, #0
|
|
800fc40: 719a strb r2, [r3, #6]
|
|
800fc42: 2200 movs r2, #0
|
|
800fc44: 71da strb r2, [r3, #7]
|
|
IPH_CHKSUM_SET(fraghdr, 0);
|
|
800fc46: 6abb ldr r3, [r7, #40] ; 0x28
|
|
800fc48: 2200 movs r2, #0
|
|
800fc4a: 729a strb r2, [r3, #10]
|
|
800fc4c: 2200 movs r2, #0
|
|
800fc4e: 72da strb r2, [r3, #11]
|
|
IF__NETIF_CHECKSUM_ENABLED(ip_current_input_netif(), NETIF_CHECKSUM_GEN_IP) {
|
|
IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN));
|
|
}
|
|
#endif /* CHECKSUM_GEN_IP */
|
|
|
|
p = ipr->p;
|
|
800fc50: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fc52: 685b ldr r3, [r3, #4]
|
|
800fc54: 607b str r3, [r7, #4]
|
|
|
|
/* chain together the pbufs contained within the reass_data list. */
|
|
while (r != NULL) {
|
|
800fc56: e00d b.n 800fc74 <ip4_reass+0x234>
|
|
iprh = (struct ip_reass_helper *)r->payload;
|
|
800fc58: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800fc5a: 685b ldr r3, [r3, #4]
|
|
800fc5c: 60fb str r3, [r7, #12]
|
|
|
|
/* hide the ip header for every succeeding fragment */
|
|
pbuf_remove_header(r, IP_HLEN);
|
|
800fc5e: 2114 movs r1, #20
|
|
800fc60: 6af8 ldr r0, [r7, #44] ; 0x2c
|
|
800fc62: f7f7 f931 bl 8006ec8 <pbuf_remove_header>
|
|
pbuf_cat(p, r);
|
|
800fc66: 6af9 ldr r1, [r7, #44] ; 0x2c
|
|
800fc68: 6878 ldr r0, [r7, #4]
|
|
800fc6a: f7f7 fa75 bl 8007158 <pbuf_cat>
|
|
r = iprh->next_pbuf;
|
|
800fc6e: 68fb ldr r3, [r7, #12]
|
|
800fc70: 681b ldr r3, [r3, #0]
|
|
800fc72: 62fb str r3, [r7, #44] ; 0x2c
|
|
while (r != NULL) {
|
|
800fc74: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
800fc76: 2b00 cmp r3, #0
|
|
800fc78: d1ee bne.n 800fc58 <ip4_reass+0x218>
|
|
}
|
|
|
|
/* find the previous entry in the linked list */
|
|
if (ipr == reassdatagrams) {
|
|
800fc7a: 4b1e ldr r3, [pc, #120] ; (800fcf4 <ip4_reass+0x2b4>)
|
|
800fc7c: 681b ldr r3, [r3, #0]
|
|
800fc7e: 6b3a ldr r2, [r7, #48] ; 0x30
|
|
800fc80: 429a cmp r2, r3
|
|
800fc82: d102 bne.n 800fc8a <ip4_reass+0x24a>
|
|
ipr_prev = NULL;
|
|
800fc84: 2300 movs r3, #0
|
|
800fc86: 637b str r3, [r7, #52] ; 0x34
|
|
800fc88: e010 b.n 800fcac <ip4_reass+0x26c>
|
|
} else {
|
|
for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {
|
|
800fc8a: 4b1a ldr r3, [pc, #104] ; (800fcf4 <ip4_reass+0x2b4>)
|
|
800fc8c: 681b ldr r3, [r3, #0]
|
|
800fc8e: 637b str r3, [r7, #52] ; 0x34
|
|
800fc90: e007 b.n 800fca2 <ip4_reass+0x262>
|
|
if (ipr_prev->next == ipr) {
|
|
800fc92: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800fc94: 681b ldr r3, [r3, #0]
|
|
800fc96: 6b3a ldr r2, [r7, #48] ; 0x30
|
|
800fc98: 429a cmp r2, r3
|
|
800fc9a: d006 beq.n 800fcaa <ip4_reass+0x26a>
|
|
for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {
|
|
800fc9c: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800fc9e: 681b ldr r3, [r3, #0]
|
|
800fca0: 637b str r3, [r7, #52] ; 0x34
|
|
800fca2: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800fca4: 2b00 cmp r3, #0
|
|
800fca6: d1f4 bne.n 800fc92 <ip4_reass+0x252>
|
|
800fca8: e000 b.n 800fcac <ip4_reass+0x26c>
|
|
break;
|
|
800fcaa: bf00 nop
|
|
}
|
|
}
|
|
}
|
|
|
|
/* release the sources allocate for the fragment queue entry */
|
|
ip_reass_dequeue_datagram(ipr, ipr_prev);
|
|
800fcac: 6b79 ldr r1, [r7, #52] ; 0x34
|
|
800fcae: 6b38 ldr r0, [r7, #48] ; 0x30
|
|
800fcb0: f7ff fd2e bl 800f710 <ip_reass_dequeue_datagram>
|
|
|
|
/* and adjust the number of pbufs currently queued for reassembly. */
|
|
clen = pbuf_clen(p);
|
|
800fcb4: 6878 ldr r0, [r7, #4]
|
|
800fcb6: f7f7 fa15 bl 80070e4 <pbuf_clen>
|
|
800fcba: 4603 mov r3, r0
|
|
800fcbc: 843b strh r3, [r7, #32]
|
|
LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= clen);
|
|
800fcbe: 4b0c ldr r3, [pc, #48] ; (800fcf0 <ip4_reass+0x2b0>)
|
|
800fcc0: 881b ldrh r3, [r3, #0]
|
|
800fcc2: 8c3a ldrh r2, [r7, #32]
|
|
800fcc4: 429a cmp r2, r3
|
|
800fcc6: d906 bls.n 800fcd6 <ip4_reass+0x296>
|
|
800fcc8: 4b0b ldr r3, [pc, #44] ; (800fcf8 <ip4_reass+0x2b8>)
|
|
800fcca: f240 229b movw r2, #667 ; 0x29b
|
|
800fcce: 490b ldr r1, [pc, #44] ; (800fcfc <ip4_reass+0x2bc>)
|
|
800fcd0: 480b ldr r0, [pc, #44] ; (800fd00 <ip4_reass+0x2c0>)
|
|
800fcd2: f000 ff79 bl 8010bc8 <iprintf>
|
|
ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - clen);
|
|
800fcd6: 4b06 ldr r3, [pc, #24] ; (800fcf0 <ip4_reass+0x2b0>)
|
|
800fcd8: 881a ldrh r2, [r3, #0]
|
|
800fcda: 8c3b ldrh r3, [r7, #32]
|
|
800fcdc: 1ad3 subs r3, r2, r3
|
|
800fcde: b29a uxth r2, r3
|
|
800fce0: 4b03 ldr r3, [pc, #12] ; (800fcf0 <ip4_reass+0x2b0>)
|
|
800fce2: 801a strh r2, [r3, #0]
|
|
|
|
MIB2_STATS_INC(mib2.ipreasmoks);
|
|
|
|
/* Return the pbuf chain */
|
|
return p;
|
|
800fce4: 687b ldr r3, [r7, #4]
|
|
800fce6: e038 b.n 800fd5a <ip4_reass+0x31a>
|
|
}
|
|
/* the datagram is not (yet?) reassembled completely */
|
|
LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount));
|
|
return NULL;
|
|
800fce8: 2300 movs r3, #0
|
|
800fcea: e036 b.n 800fd5a <ip4_reass+0x31a>
|
|
goto nullreturn_ipr;
|
|
800fcec: bf00 nop
|
|
800fcee: e00a b.n 800fd06 <ip4_reass+0x2c6>
|
|
800fcf0: 24007cc8 .word 0x24007cc8
|
|
800fcf4: 24007cc4 .word 0x24007cc4
|
|
800fcf8: 080149bc .word 0x080149bc
|
|
800fcfc: 08014b2c .word 0x08014b2c
|
|
800fd00: 08014a04 .word 0x08014a04
|
|
goto nullreturn_ipr;
|
|
800fd04: bf00 nop
|
|
|
|
nullreturn_ipr:
|
|
LWIP_ASSERT("ipr != NULL", ipr != NULL);
|
|
800fd06: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fd08: 2b00 cmp r3, #0
|
|
800fd0a: d106 bne.n 800fd1a <ip4_reass+0x2da>
|
|
800fd0c: 4b15 ldr r3, [pc, #84] ; (800fd64 <ip4_reass+0x324>)
|
|
800fd0e: f44f 722a mov.w r2, #680 ; 0x2a8
|
|
800fd12: 4915 ldr r1, [pc, #84] ; (800fd68 <ip4_reass+0x328>)
|
|
800fd14: 4815 ldr r0, [pc, #84] ; (800fd6c <ip4_reass+0x32c>)
|
|
800fd16: f000 ff57 bl 8010bc8 <iprintf>
|
|
if (ipr->p == NULL) {
|
|
800fd1a: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fd1c: 685b ldr r3, [r3, #4]
|
|
800fd1e: 2b00 cmp r3, #0
|
|
800fd20: d116 bne.n 800fd50 <ip4_reass+0x310>
|
|
/* dropped pbuf after creating a new datagram entry: remove the entry, too */
|
|
LWIP_ASSERT("not firstalthough just enqueued", ipr == reassdatagrams);
|
|
800fd22: 4b13 ldr r3, [pc, #76] ; (800fd70 <ip4_reass+0x330>)
|
|
800fd24: 681b ldr r3, [r3, #0]
|
|
800fd26: 6b3a ldr r2, [r7, #48] ; 0x30
|
|
800fd28: 429a cmp r2, r3
|
|
800fd2a: d006 beq.n 800fd3a <ip4_reass+0x2fa>
|
|
800fd2c: 4b0d ldr r3, [pc, #52] ; (800fd64 <ip4_reass+0x324>)
|
|
800fd2e: f240 22ab movw r2, #683 ; 0x2ab
|
|
800fd32: 4910 ldr r1, [pc, #64] ; (800fd74 <ip4_reass+0x334>)
|
|
800fd34: 480d ldr r0, [pc, #52] ; (800fd6c <ip4_reass+0x32c>)
|
|
800fd36: f000 ff47 bl 8010bc8 <iprintf>
|
|
ip_reass_dequeue_datagram(ipr, NULL);
|
|
800fd3a: 2100 movs r1, #0
|
|
800fd3c: 6b38 ldr r0, [r7, #48] ; 0x30
|
|
800fd3e: f7ff fce7 bl 800f710 <ip_reass_dequeue_datagram>
|
|
800fd42: e006 b.n 800fd52 <ip4_reass+0x312>
|
|
goto nullreturn;
|
|
800fd44: bf00 nop
|
|
800fd46: e004 b.n 800fd52 <ip4_reass+0x312>
|
|
goto nullreturn;
|
|
800fd48: bf00 nop
|
|
800fd4a: e002 b.n 800fd52 <ip4_reass+0x312>
|
|
goto nullreturn;
|
|
800fd4c: bf00 nop
|
|
800fd4e: e000 b.n 800fd52 <ip4_reass+0x312>
|
|
}
|
|
|
|
nullreturn:
|
|
800fd50: bf00 nop
|
|
LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: nullreturn\n"));
|
|
IPFRAG_STATS_INC(ip_frag.drop);
|
|
pbuf_free(p);
|
|
800fd52: 6878 ldr r0, [r7, #4]
|
|
800fd54: f7f7 f93e bl 8006fd4 <pbuf_free>
|
|
return NULL;
|
|
800fd58: 2300 movs r3, #0
|
|
}
|
|
800fd5a: 4618 mov r0, r3
|
|
800fd5c: 3738 adds r7, #56 ; 0x38
|
|
800fd5e: 46bd mov sp, r7
|
|
800fd60: bd80 pop {r7, pc}
|
|
800fd62: bf00 nop
|
|
800fd64: 080149bc .word 0x080149bc
|
|
800fd68: 08014b48 .word 0x08014b48
|
|
800fd6c: 08014a04 .word 0x08014a04
|
|
800fd70: 24007cc4 .word 0x24007cc4
|
|
800fd74: 08014b54 .word 0x08014b54
|
|
|
|
0800fd78 <ip_frag_alloc_pbuf_custom_ref>:
|
|
#if IP_FRAG
|
|
#if !LWIP_NETIF_TX_SINGLE_PBUF
|
|
/** Allocate a new struct pbuf_custom_ref */
|
|
static struct pbuf_custom_ref *
|
|
ip_frag_alloc_pbuf_custom_ref(void)
|
|
{
|
|
800fd78: b580 push {r7, lr}
|
|
800fd7a: af00 add r7, sp, #0
|
|
return (struct pbuf_custom_ref *)memp_malloc(MEMP_FRAG_PBUF);
|
|
800fd7c: 2005 movs r0, #5
|
|
800fd7e: f7f6 f94d bl 800601c <memp_malloc>
|
|
800fd82: 4603 mov r3, r0
|
|
}
|
|
800fd84: 4618 mov r0, r3
|
|
800fd86: bd80 pop {r7, pc}
|
|
|
|
0800fd88 <ip_frag_free_pbuf_custom_ref>:
|
|
|
|
/** Free a struct pbuf_custom_ref */
|
|
static void
|
|
ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref *p)
|
|
{
|
|
800fd88: b580 push {r7, lr}
|
|
800fd8a: b082 sub sp, #8
|
|
800fd8c: af00 add r7, sp, #0
|
|
800fd8e: 6078 str r0, [r7, #4]
|
|
LWIP_ASSERT("p != NULL", p != NULL);
|
|
800fd90: 687b ldr r3, [r7, #4]
|
|
800fd92: 2b00 cmp r3, #0
|
|
800fd94: d106 bne.n 800fda4 <ip_frag_free_pbuf_custom_ref+0x1c>
|
|
800fd96: 4b07 ldr r3, [pc, #28] ; (800fdb4 <ip_frag_free_pbuf_custom_ref+0x2c>)
|
|
800fd98: f44f 7231 mov.w r2, #708 ; 0x2c4
|
|
800fd9c: 4906 ldr r1, [pc, #24] ; (800fdb8 <ip_frag_free_pbuf_custom_ref+0x30>)
|
|
800fd9e: 4807 ldr r0, [pc, #28] ; (800fdbc <ip_frag_free_pbuf_custom_ref+0x34>)
|
|
800fda0: f000 ff12 bl 8010bc8 <iprintf>
|
|
memp_free(MEMP_FRAG_PBUF, p);
|
|
800fda4: 6879 ldr r1, [r7, #4]
|
|
800fda6: 2005 movs r0, #5
|
|
800fda8: f7f6 f9a8 bl 80060fc <memp_free>
|
|
}
|
|
800fdac: bf00 nop
|
|
800fdae: 3708 adds r7, #8
|
|
800fdb0: 46bd mov sp, r7
|
|
800fdb2: bd80 pop {r7, pc}
|
|
800fdb4: 080149bc .word 0x080149bc
|
|
800fdb8: 08014b74 .word 0x08014b74
|
|
800fdbc: 08014a04 .word 0x08014a04
|
|
|
|
0800fdc0 <ipfrag_free_pbuf_custom>:
|
|
|
|
/** Free-callback function to free a 'struct pbuf_custom_ref', called by
|
|
* pbuf_free. */
|
|
static void
|
|
ipfrag_free_pbuf_custom(struct pbuf *p)
|
|
{
|
|
800fdc0: b580 push {r7, lr}
|
|
800fdc2: b084 sub sp, #16
|
|
800fdc4: af00 add r7, sp, #0
|
|
800fdc6: 6078 str r0, [r7, #4]
|
|
struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref *)p;
|
|
800fdc8: 687b ldr r3, [r7, #4]
|
|
800fdca: 60fb str r3, [r7, #12]
|
|
LWIP_ASSERT("pcr != NULL", pcr != NULL);
|
|
800fdcc: 68fb ldr r3, [r7, #12]
|
|
800fdce: 2b00 cmp r3, #0
|
|
800fdd0: d106 bne.n 800fde0 <ipfrag_free_pbuf_custom+0x20>
|
|
800fdd2: 4b11 ldr r3, [pc, #68] ; (800fe18 <ipfrag_free_pbuf_custom+0x58>)
|
|
800fdd4: f240 22ce movw r2, #718 ; 0x2ce
|
|
800fdd8: 4910 ldr r1, [pc, #64] ; (800fe1c <ipfrag_free_pbuf_custom+0x5c>)
|
|
800fdda: 4811 ldr r0, [pc, #68] ; (800fe20 <ipfrag_free_pbuf_custom+0x60>)
|
|
800fddc: f000 fef4 bl 8010bc8 <iprintf>
|
|
LWIP_ASSERT("pcr == p", (void *)pcr == (void *)p);
|
|
800fde0: 68fa ldr r2, [r7, #12]
|
|
800fde2: 687b ldr r3, [r7, #4]
|
|
800fde4: 429a cmp r2, r3
|
|
800fde6: d006 beq.n 800fdf6 <ipfrag_free_pbuf_custom+0x36>
|
|
800fde8: 4b0b ldr r3, [pc, #44] ; (800fe18 <ipfrag_free_pbuf_custom+0x58>)
|
|
800fdea: f240 22cf movw r2, #719 ; 0x2cf
|
|
800fdee: 490d ldr r1, [pc, #52] ; (800fe24 <ipfrag_free_pbuf_custom+0x64>)
|
|
800fdf0: 480b ldr r0, [pc, #44] ; (800fe20 <ipfrag_free_pbuf_custom+0x60>)
|
|
800fdf2: f000 fee9 bl 8010bc8 <iprintf>
|
|
if (pcr->original != NULL) {
|
|
800fdf6: 68fb ldr r3, [r7, #12]
|
|
800fdf8: 695b ldr r3, [r3, #20]
|
|
800fdfa: 2b00 cmp r3, #0
|
|
800fdfc: d004 beq.n 800fe08 <ipfrag_free_pbuf_custom+0x48>
|
|
pbuf_free(pcr->original);
|
|
800fdfe: 68fb ldr r3, [r7, #12]
|
|
800fe00: 695b ldr r3, [r3, #20]
|
|
800fe02: 4618 mov r0, r3
|
|
800fe04: f7f7 f8e6 bl 8006fd4 <pbuf_free>
|
|
}
|
|
ip_frag_free_pbuf_custom_ref(pcr);
|
|
800fe08: 68f8 ldr r0, [r7, #12]
|
|
800fe0a: f7ff ffbd bl 800fd88 <ip_frag_free_pbuf_custom_ref>
|
|
}
|
|
800fe0e: bf00 nop
|
|
800fe10: 3710 adds r7, #16
|
|
800fe12: 46bd mov sp, r7
|
|
800fe14: bd80 pop {r7, pc}
|
|
800fe16: bf00 nop
|
|
800fe18: 080149bc .word 0x080149bc
|
|
800fe1c: 08014b80 .word 0x08014b80
|
|
800fe20: 08014a04 .word 0x08014a04
|
|
800fe24: 08014b8c .word 0x08014b8c
|
|
|
|
0800fe28 <ip4_frag>:
|
|
*
|
|
* @return ERR_OK if sent successfully, err_t otherwise
|
|
*/
|
|
err_t
|
|
ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest)
|
|
{
|
|
800fe28: b580 push {r7, lr}
|
|
800fe2a: b094 sub sp, #80 ; 0x50
|
|
800fe2c: af02 add r7, sp, #8
|
|
800fe2e: 60f8 str r0, [r7, #12]
|
|
800fe30: 60b9 str r1, [r7, #8]
|
|
800fe32: 607a str r2, [r7, #4]
|
|
struct pbuf *rambuf;
|
|
#if !LWIP_NETIF_TX_SINGLE_PBUF
|
|
struct pbuf *newpbuf;
|
|
u16_t newpbuflen = 0;
|
|
800fe34: 2300 movs r3, #0
|
|
800fe36: f8a7 3046 strh.w r3, [r7, #70] ; 0x46
|
|
u16_t left_to_copy;
|
|
#endif
|
|
struct ip_hdr *original_iphdr;
|
|
struct ip_hdr *iphdr;
|
|
const u16_t nfb = (u16_t)((netif->mtu - IP_HLEN) / 8);
|
|
800fe3a: 68bb ldr r3, [r7, #8]
|
|
800fe3c: 8c9b ldrh r3, [r3, #36] ; 0x24
|
|
800fe3e: 3b14 subs r3, #20
|
|
800fe40: 2b00 cmp r3, #0
|
|
800fe42: da00 bge.n 800fe46 <ip4_frag+0x1e>
|
|
800fe44: 3307 adds r3, #7
|
|
800fe46: 10db asrs r3, r3, #3
|
|
800fe48: 877b strh r3, [r7, #58] ; 0x3a
|
|
u16_t left, fragsize;
|
|
u16_t ofo;
|
|
int last;
|
|
u16_t poff = IP_HLEN;
|
|
800fe4a: 2314 movs r3, #20
|
|
800fe4c: 87fb strh r3, [r7, #62] ; 0x3e
|
|
u16_t tmp;
|
|
int mf_set;
|
|
|
|
original_iphdr = (struct ip_hdr *)p->payload;
|
|
800fe4e: 68fb ldr r3, [r7, #12]
|
|
800fe50: 685b ldr r3, [r3, #4]
|
|
800fe52: 637b str r3, [r7, #52] ; 0x34
|
|
iphdr = original_iphdr;
|
|
800fe54: 6b7b ldr r3, [r7, #52] ; 0x34
|
|
800fe56: 633b str r3, [r7, #48] ; 0x30
|
|
if (IPH_HL_BYTES(iphdr) != IP_HLEN) {
|
|
800fe58: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fe5a: 781b ldrb r3, [r3, #0]
|
|
800fe5c: f003 030f and.w r3, r3, #15
|
|
800fe60: b2db uxtb r3, r3
|
|
800fe62: 009b lsls r3, r3, #2
|
|
800fe64: b2db uxtb r3, r3
|
|
800fe66: 2b14 cmp r3, #20
|
|
800fe68: d002 beq.n 800fe70 <ip4_frag+0x48>
|
|
/* ip4_frag() does not support IP options */
|
|
return ERR_VAL;
|
|
800fe6a: f06f 0305 mvn.w r3, #5
|
|
800fe6e: e110 b.n 8010092 <ip4_frag+0x26a>
|
|
}
|
|
LWIP_ERROR("ip4_frag(): pbuf too short", p->len >= IP_HLEN, return ERR_VAL);
|
|
800fe70: 68fb ldr r3, [r7, #12]
|
|
800fe72: 895b ldrh r3, [r3, #10]
|
|
800fe74: 2b13 cmp r3, #19
|
|
800fe76: d809 bhi.n 800fe8c <ip4_frag+0x64>
|
|
800fe78: 4b88 ldr r3, [pc, #544] ; (801009c <ip4_frag+0x274>)
|
|
800fe7a: f44f 723f mov.w r2, #764 ; 0x2fc
|
|
800fe7e: 4988 ldr r1, [pc, #544] ; (80100a0 <ip4_frag+0x278>)
|
|
800fe80: 4888 ldr r0, [pc, #544] ; (80100a4 <ip4_frag+0x27c>)
|
|
800fe82: f000 fea1 bl 8010bc8 <iprintf>
|
|
800fe86: f06f 0305 mvn.w r3, #5
|
|
800fe8a: e102 b.n 8010092 <ip4_frag+0x26a>
|
|
|
|
/* Save original offset */
|
|
tmp = lwip_ntohs(IPH_OFFSET(iphdr));
|
|
800fe8c: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
800fe8e: 88db ldrh r3, [r3, #6]
|
|
800fe90: b29b uxth r3, r3
|
|
800fe92: 4618 mov r0, r3
|
|
800fe94: f7f5 fb5a bl 800554c <lwip_htons>
|
|
800fe98: 4603 mov r3, r0
|
|
800fe9a: 87bb strh r3, [r7, #60] ; 0x3c
|
|
ofo = tmp & IP_OFFMASK;
|
|
800fe9c: 8fbb ldrh r3, [r7, #60] ; 0x3c
|
|
800fe9e: f3c3 030c ubfx r3, r3, #0, #13
|
|
800fea2: f8a7 3040 strh.w r3, [r7, #64] ; 0x40
|
|
/* already fragmented? if so, the last fragment we create must have MF, too */
|
|
mf_set = tmp & IP_MF;
|
|
800fea6: 8fbb ldrh r3, [r7, #60] ; 0x3c
|
|
800fea8: f403 5300 and.w r3, r3, #8192 ; 0x2000
|
|
800feac: 62fb str r3, [r7, #44] ; 0x2c
|
|
|
|
left = (u16_t)(p->tot_len - IP_HLEN);
|
|
800feae: 68fb ldr r3, [r7, #12]
|
|
800feb0: 891b ldrh r3, [r3, #8]
|
|
800feb2: 3b14 subs r3, #20
|
|
800feb4: f8a7 3042 strh.w r3, [r7, #66] ; 0x42
|
|
|
|
while (left) {
|
|
800feb8: e0e1 b.n 801007e <ip4_frag+0x256>
|
|
/* Fill this fragment */
|
|
fragsize = LWIP_MIN(left, (u16_t)(nfb * 8));
|
|
800feba: 8f7b ldrh r3, [r7, #58] ; 0x3a
|
|
800febc: 00db lsls r3, r3, #3
|
|
800febe: b29b uxth r3, r3
|
|
800fec0: f8b7 2042 ldrh.w r2, [r7, #66] ; 0x42
|
|
800fec4: 4293 cmp r3, r2
|
|
800fec6: bf28 it cs
|
|
800fec8: 4613 movcs r3, r2
|
|
800feca: 857b strh r3, [r7, #42] ; 0x2a
|
|
/* When not using a static buffer, create a chain of pbufs.
|
|
* The first will be a PBUF_RAM holding the link and IP header.
|
|
* The rest will be PBUF_REFs mirroring the pbuf chain to be fragged,
|
|
* but limited to the size of an mtu.
|
|
*/
|
|
rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM);
|
|
800fecc: f44f 7220 mov.w r2, #640 ; 0x280
|
|
800fed0: 2114 movs r1, #20
|
|
800fed2: 200e movs r0, #14
|
|
800fed4: f7f6 fd9a bl 8006a0c <pbuf_alloc>
|
|
800fed8: 6278 str r0, [r7, #36] ; 0x24
|
|
if (rambuf == NULL) {
|
|
800feda: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800fedc: 2b00 cmp r3, #0
|
|
800fede: f000 80d5 beq.w 801008c <ip4_frag+0x264>
|
|
goto memerr;
|
|
}
|
|
LWIP_ASSERT("this needs a pbuf in one piece!",
|
|
800fee2: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800fee4: 895b ldrh r3, [r3, #10]
|
|
800fee6: 2b13 cmp r3, #19
|
|
800fee8: d806 bhi.n 800fef8 <ip4_frag+0xd0>
|
|
800feea: 4b6c ldr r3, [pc, #432] ; (801009c <ip4_frag+0x274>)
|
|
800feec: f44f 7249 mov.w r2, #804 ; 0x324
|
|
800fef0: 496d ldr r1, [pc, #436] ; (80100a8 <ip4_frag+0x280>)
|
|
800fef2: 486c ldr r0, [pc, #432] ; (80100a4 <ip4_frag+0x27c>)
|
|
800fef4: f000 fe68 bl 8010bc8 <iprintf>
|
|
(rambuf->len >= (IP_HLEN)));
|
|
SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN);
|
|
800fef8: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800fefa: 685b ldr r3, [r3, #4]
|
|
800fefc: 2214 movs r2, #20
|
|
800fefe: 6b79 ldr r1, [r7, #52] ; 0x34
|
|
800ff00: 4618 mov r0, r3
|
|
800ff02: f001 f842 bl 8010f8a <memcpy>
|
|
iphdr = (struct ip_hdr *)rambuf->payload;
|
|
800ff06: 6a7b ldr r3, [r7, #36] ; 0x24
|
|
800ff08: 685b ldr r3, [r3, #4]
|
|
800ff0a: 633b str r3, [r7, #48] ; 0x30
|
|
|
|
left_to_copy = fragsize;
|
|
800ff0c: 8d7b ldrh r3, [r7, #42] ; 0x2a
|
|
800ff0e: f8a7 3044 strh.w r3, [r7, #68] ; 0x44
|
|
while (left_to_copy) {
|
|
800ff12: e064 b.n 800ffde <ip4_frag+0x1b6>
|
|
struct pbuf_custom_ref *pcr;
|
|
u16_t plen = (u16_t)(p->len - poff);
|
|
800ff14: 68fb ldr r3, [r7, #12]
|
|
800ff16: 895a ldrh r2, [r3, #10]
|
|
800ff18: 8ffb ldrh r3, [r7, #62] ; 0x3e
|
|
800ff1a: 1ad3 subs r3, r2, r3
|
|
800ff1c: 83fb strh r3, [r7, #30]
|
|
LWIP_ASSERT("p->len >= poff", p->len >= poff);
|
|
800ff1e: 68fb ldr r3, [r7, #12]
|
|
800ff20: 895b ldrh r3, [r3, #10]
|
|
800ff22: 8ffa ldrh r2, [r7, #62] ; 0x3e
|
|
800ff24: 429a cmp r2, r3
|
|
800ff26: d906 bls.n 800ff36 <ip4_frag+0x10e>
|
|
800ff28: 4b5c ldr r3, [pc, #368] ; (801009c <ip4_frag+0x274>)
|
|
800ff2a: f240 322d movw r2, #813 ; 0x32d
|
|
800ff2e: 495f ldr r1, [pc, #380] ; (80100ac <ip4_frag+0x284>)
|
|
800ff30: 485c ldr r0, [pc, #368] ; (80100a4 <ip4_frag+0x27c>)
|
|
800ff32: f000 fe49 bl 8010bc8 <iprintf>
|
|
newpbuflen = LWIP_MIN(left_to_copy, plen);
|
|
800ff36: 8bfa ldrh r2, [r7, #30]
|
|
800ff38: f8b7 3044 ldrh.w r3, [r7, #68] ; 0x44
|
|
800ff3c: 4293 cmp r3, r2
|
|
800ff3e: bf28 it cs
|
|
800ff40: 4613 movcs r3, r2
|
|
800ff42: f8a7 3046 strh.w r3, [r7, #70] ; 0x46
|
|
/* Is this pbuf already empty? */
|
|
if (!newpbuflen) {
|
|
800ff46: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800ff4a: 2b00 cmp r3, #0
|
|
800ff4c: d105 bne.n 800ff5a <ip4_frag+0x132>
|
|
poff = 0;
|
|
800ff4e: 2300 movs r3, #0
|
|
800ff50: 87fb strh r3, [r7, #62] ; 0x3e
|
|
p = p->next;
|
|
800ff52: 68fb ldr r3, [r7, #12]
|
|
800ff54: 681b ldr r3, [r3, #0]
|
|
800ff56: 60fb str r3, [r7, #12]
|
|
continue;
|
|
800ff58: e041 b.n 800ffde <ip4_frag+0x1b6>
|
|
}
|
|
pcr = ip_frag_alloc_pbuf_custom_ref();
|
|
800ff5a: f7ff ff0d bl 800fd78 <ip_frag_alloc_pbuf_custom_ref>
|
|
800ff5e: 61b8 str r0, [r7, #24]
|
|
if (pcr == NULL) {
|
|
800ff60: 69bb ldr r3, [r7, #24]
|
|
800ff62: 2b00 cmp r3, #0
|
|
800ff64: d103 bne.n 800ff6e <ip4_frag+0x146>
|
|
pbuf_free(rambuf);
|
|
800ff66: 6a78 ldr r0, [r7, #36] ; 0x24
|
|
800ff68: f7f7 f834 bl 8006fd4 <pbuf_free>
|
|
goto memerr;
|
|
800ff6c: e08f b.n 801008e <ip4_frag+0x266>
|
|
}
|
|
/* Mirror this pbuf, although we might not need all of it. */
|
|
newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc,
|
|
800ff6e: 69b8 ldr r0, [r7, #24]
|
|
(u8_t *)p->payload + poff, newpbuflen);
|
|
800ff70: 68fb ldr r3, [r7, #12]
|
|
800ff72: 685a ldr r2, [r3, #4]
|
|
newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc,
|
|
800ff74: 8ffb ldrh r3, [r7, #62] ; 0x3e
|
|
800ff76: 4413 add r3, r2
|
|
800ff78: f8b7 1046 ldrh.w r1, [r7, #70] ; 0x46
|
|
800ff7c: f8b7 2046 ldrh.w r2, [r7, #70] ; 0x46
|
|
800ff80: 9201 str r2, [sp, #4]
|
|
800ff82: 9300 str r3, [sp, #0]
|
|
800ff84: 4603 mov r3, r0
|
|
800ff86: 2241 movs r2, #65 ; 0x41
|
|
800ff88: 2000 movs r0, #0
|
|
800ff8a: f7f6 fe69 bl 8006c60 <pbuf_alloced_custom>
|
|
800ff8e: 6178 str r0, [r7, #20]
|
|
if (newpbuf == NULL) {
|
|
800ff90: 697b ldr r3, [r7, #20]
|
|
800ff92: 2b00 cmp r3, #0
|
|
800ff94: d106 bne.n 800ffa4 <ip4_frag+0x17c>
|
|
ip_frag_free_pbuf_custom_ref(pcr);
|
|
800ff96: 69b8 ldr r0, [r7, #24]
|
|
800ff98: f7ff fef6 bl 800fd88 <ip_frag_free_pbuf_custom_ref>
|
|
pbuf_free(rambuf);
|
|
800ff9c: 6a78 ldr r0, [r7, #36] ; 0x24
|
|
800ff9e: f7f7 f819 bl 8006fd4 <pbuf_free>
|
|
goto memerr;
|
|
800ffa2: e074 b.n 801008e <ip4_frag+0x266>
|
|
}
|
|
pbuf_ref(p);
|
|
800ffa4: 68f8 ldr r0, [r7, #12]
|
|
800ffa6: f7f7 f8b5 bl 8007114 <pbuf_ref>
|
|
pcr->original = p;
|
|
800ffaa: 69bb ldr r3, [r7, #24]
|
|
800ffac: 68fa ldr r2, [r7, #12]
|
|
800ffae: 615a str r2, [r3, #20]
|
|
pcr->pc.custom_free_function = ipfrag_free_pbuf_custom;
|
|
800ffb0: 69bb ldr r3, [r7, #24]
|
|
800ffb2: 4a3f ldr r2, [pc, #252] ; (80100b0 <ip4_frag+0x288>)
|
|
800ffb4: 611a str r2, [r3, #16]
|
|
|
|
/* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain
|
|
* so that it is removed when pbuf_dechain is later called on rambuf.
|
|
*/
|
|
pbuf_cat(rambuf, newpbuf);
|
|
800ffb6: 6979 ldr r1, [r7, #20]
|
|
800ffb8: 6a78 ldr r0, [r7, #36] ; 0x24
|
|
800ffba: f7f7 f8cd bl 8007158 <pbuf_cat>
|
|
left_to_copy = (u16_t)(left_to_copy - newpbuflen);
|
|
800ffbe: f8b7 2044 ldrh.w r2, [r7, #68] ; 0x44
|
|
800ffc2: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800ffc6: 1ad3 subs r3, r2, r3
|
|
800ffc8: f8a7 3044 strh.w r3, [r7, #68] ; 0x44
|
|
if (left_to_copy) {
|
|
800ffcc: f8b7 3044 ldrh.w r3, [r7, #68] ; 0x44
|
|
800ffd0: 2b00 cmp r3, #0
|
|
800ffd2: d004 beq.n 800ffde <ip4_frag+0x1b6>
|
|
poff = 0;
|
|
800ffd4: 2300 movs r3, #0
|
|
800ffd6: 87fb strh r3, [r7, #62] ; 0x3e
|
|
p = p->next;
|
|
800ffd8: 68fb ldr r3, [r7, #12]
|
|
800ffda: 681b ldr r3, [r3, #0]
|
|
800ffdc: 60fb str r3, [r7, #12]
|
|
while (left_to_copy) {
|
|
800ffde: f8b7 3044 ldrh.w r3, [r7, #68] ; 0x44
|
|
800ffe2: 2b00 cmp r3, #0
|
|
800ffe4: d196 bne.n 800ff14 <ip4_frag+0xec>
|
|
}
|
|
}
|
|
poff = (u16_t)(poff + newpbuflen);
|
|
800ffe6: 8ffa ldrh r2, [r7, #62] ; 0x3e
|
|
800ffe8: f8b7 3046 ldrh.w r3, [r7, #70] ; 0x46
|
|
800ffec: 4413 add r3, r2
|
|
800ffee: 87fb strh r3, [r7, #62] ; 0x3e
|
|
#endif /* LWIP_NETIF_TX_SINGLE_PBUF */
|
|
|
|
/* Correct header */
|
|
last = (left <= netif->mtu - IP_HLEN);
|
|
800fff0: 68bb ldr r3, [r7, #8]
|
|
800fff2: 8c9b ldrh r3, [r3, #36] ; 0x24
|
|
800fff4: f1a3 0213 sub.w r2, r3, #19
|
|
800fff8: f8b7 3042 ldrh.w r3, [r7, #66] ; 0x42
|
|
800fffc: 429a cmp r2, r3
|
|
800fffe: bfcc ite gt
|
|
8010000: 2301 movgt r3, #1
|
|
8010002: 2300 movle r3, #0
|
|
8010004: b2db uxtb r3, r3
|
|
8010006: 623b str r3, [r7, #32]
|
|
|
|
/* Set new offset and MF flag */
|
|
tmp = (IP_OFFMASK & (ofo));
|
|
8010008: f8b7 3040 ldrh.w r3, [r7, #64] ; 0x40
|
|
801000c: f3c3 030c ubfx r3, r3, #0, #13
|
|
8010010: 87bb strh r3, [r7, #60] ; 0x3c
|
|
if (!last || mf_set) {
|
|
8010012: 6a3b ldr r3, [r7, #32]
|
|
8010014: 2b00 cmp r3, #0
|
|
8010016: d002 beq.n 801001e <ip4_frag+0x1f6>
|
|
8010018: 6afb ldr r3, [r7, #44] ; 0x2c
|
|
801001a: 2b00 cmp r3, #0
|
|
801001c: d003 beq.n 8010026 <ip4_frag+0x1fe>
|
|
/* the last fragment has MF set if the input frame had it */
|
|
tmp = tmp | IP_MF;
|
|
801001e: 8fbb ldrh r3, [r7, #60] ; 0x3c
|
|
8010020: f443 5300 orr.w r3, r3, #8192 ; 0x2000
|
|
8010024: 87bb strh r3, [r7, #60] ; 0x3c
|
|
}
|
|
IPH_OFFSET_SET(iphdr, lwip_htons(tmp));
|
|
8010026: 8fbb ldrh r3, [r7, #60] ; 0x3c
|
|
8010028: 4618 mov r0, r3
|
|
801002a: f7f5 fa8f bl 800554c <lwip_htons>
|
|
801002e: 4603 mov r3, r0
|
|
8010030: 461a mov r2, r3
|
|
8010032: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
8010034: 80da strh r2, [r3, #6]
|
|
IPH_LEN_SET(iphdr, lwip_htons((u16_t)(fragsize + IP_HLEN)));
|
|
8010036: 8d7b ldrh r3, [r7, #42] ; 0x2a
|
|
8010038: 3314 adds r3, #20
|
|
801003a: b29b uxth r3, r3
|
|
801003c: 4618 mov r0, r3
|
|
801003e: f7f5 fa85 bl 800554c <lwip_htons>
|
|
8010042: 4603 mov r3, r0
|
|
8010044: 461a mov r2, r3
|
|
8010046: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
8010048: 805a strh r2, [r3, #2]
|
|
IPH_CHKSUM_SET(iphdr, 0);
|
|
801004a: 6b3b ldr r3, [r7, #48] ; 0x30
|
|
801004c: 2200 movs r2, #0
|
|
801004e: 729a strb r2, [r3, #10]
|
|
8010050: 2200 movs r2, #0
|
|
8010052: 72da strb r2, [r3, #11]
|
|
#endif /* CHECKSUM_GEN_IP */
|
|
|
|
/* No need for separate header pbuf - we allowed room for it in rambuf
|
|
* when allocated.
|
|
*/
|
|
netif->output(netif, rambuf, dest);
|
|
8010054: 68bb ldr r3, [r7, #8]
|
|
8010056: 695b ldr r3, [r3, #20]
|
|
8010058: 687a ldr r2, [r7, #4]
|
|
801005a: 6a79 ldr r1, [r7, #36] ; 0x24
|
|
801005c: 68b8 ldr r0, [r7, #8]
|
|
801005e: 4798 blx r3
|
|
* recreate it next time round the loop. If we're lucky the hardware
|
|
* will have already sent the packet, the free will really free, and
|
|
* there will be zero memory penalty.
|
|
*/
|
|
|
|
pbuf_free(rambuf);
|
|
8010060: 6a78 ldr r0, [r7, #36] ; 0x24
|
|
8010062: f7f6 ffb7 bl 8006fd4 <pbuf_free>
|
|
left = (u16_t)(left - fragsize);
|
|
8010066: f8b7 2042 ldrh.w r2, [r7, #66] ; 0x42
|
|
801006a: 8d7b ldrh r3, [r7, #42] ; 0x2a
|
|
801006c: 1ad3 subs r3, r2, r3
|
|
801006e: f8a7 3042 strh.w r3, [r7, #66] ; 0x42
|
|
ofo = (u16_t)(ofo + nfb);
|
|
8010072: f8b7 2040 ldrh.w r2, [r7, #64] ; 0x40
|
|
8010076: 8f7b ldrh r3, [r7, #58] ; 0x3a
|
|
8010078: 4413 add r3, r2
|
|
801007a: f8a7 3040 strh.w r3, [r7, #64] ; 0x40
|
|
while (left) {
|
|
801007e: f8b7 3042 ldrh.w r3, [r7, #66] ; 0x42
|
|
8010082: 2b00 cmp r3, #0
|
|
8010084: f47f af19 bne.w 800feba <ip4_frag+0x92>
|
|
}
|
|
MIB2_STATS_INC(mib2.ipfragoks);
|
|
return ERR_OK;
|
|
8010088: 2300 movs r3, #0
|
|
801008a: e002 b.n 8010092 <ip4_frag+0x26a>
|
|
goto memerr;
|
|
801008c: bf00 nop
|
|
memerr:
|
|
MIB2_STATS_INC(mib2.ipfragfails);
|
|
return ERR_MEM;
|
|
801008e: f04f 33ff mov.w r3, #4294967295
|
|
}
|
|
8010092: 4618 mov r0, r3
|
|
8010094: 3748 adds r7, #72 ; 0x48
|
|
8010096: 46bd mov sp, r7
|
|
8010098: bd80 pop {r7, pc}
|
|
801009a: bf00 nop
|
|
801009c: 080149bc .word 0x080149bc
|
|
80100a0: 08014b98 .word 0x08014b98
|
|
80100a4: 08014a04 .word 0x08014a04
|
|
80100a8: 08014bb4 .word 0x08014bb4
|
|
80100ac: 08014bd4 .word 0x08014bd4
|
|
80100b0: 0800fdc1 .word 0x0800fdc1
|
|
|
|
080100b4 <ethernet_input>:
|
|
* @see ETHARP_SUPPORT_VLAN
|
|
* @see LWIP_HOOK_VLAN_CHECK
|
|
*/
|
|
err_t
|
|
ethernet_input(struct pbuf *p, struct netif *netif)
|
|
{
|
|
80100b4: b580 push {r7, lr}
|
|
80100b6: b086 sub sp, #24
|
|
80100b8: af00 add r7, sp, #0
|
|
80100ba: 6078 str r0, [r7, #4]
|
|
80100bc: 6039 str r1, [r7, #0]
|
|
struct eth_hdr *ethhdr;
|
|
u16_t type;
|
|
#if LWIP_ARP || ETHARP_SUPPORT_VLAN || LWIP_IPV6
|
|
u16_t next_hdr_offset = SIZEOF_ETH_HDR;
|
|
80100be: 230e movs r3, #14
|
|
80100c0: 82fb strh r3, [r7, #22]
|
|
#endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
if (p->len <= SIZEOF_ETH_HDR) {
|
|
80100c2: 687b ldr r3, [r7, #4]
|
|
80100c4: 895b ldrh r3, [r3, #10]
|
|
80100c6: 2b0e cmp r3, #14
|
|
80100c8: d96e bls.n 80101a8 <ethernet_input+0xf4>
|
|
ETHARP_STATS_INC(etharp.drop);
|
|
MIB2_STATS_NETIF_INC(netif, ifinerrors);
|
|
goto free_and_return;
|
|
}
|
|
|
|
if (p->if_idx == NETIF_NO_INDEX) {
|
|
80100ca: 687b ldr r3, [r7, #4]
|
|
80100cc: 7bdb ldrb r3, [r3, #15]
|
|
80100ce: 2b00 cmp r3, #0
|
|
80100d0: d106 bne.n 80100e0 <ethernet_input+0x2c>
|
|
p->if_idx = netif_get_index(netif);
|
|
80100d2: 683b ldr r3, [r7, #0]
|
|
80100d4: f893 3030 ldrb.w r3, [r3, #48] ; 0x30
|
|
80100d8: 3301 adds r3, #1
|
|
80100da: b2da uxtb r2, r3
|
|
80100dc: 687b ldr r3, [r7, #4]
|
|
80100de: 73da strb r2, [r3, #15]
|
|
}
|
|
|
|
/* points to packet payload, which starts with an Ethernet header */
|
|
ethhdr = (struct eth_hdr *)p->payload;
|
|
80100e0: 687b ldr r3, [r7, #4]
|
|
80100e2: 685b ldr r3, [r3, #4]
|
|
80100e4: 613b str r3, [r7, #16]
|
|
(unsigned char)ethhdr->dest.addr[3], (unsigned char)ethhdr->dest.addr[4], (unsigned char)ethhdr->dest.addr[5],
|
|
(unsigned char)ethhdr->src.addr[0], (unsigned char)ethhdr->src.addr[1], (unsigned char)ethhdr->src.addr[2],
|
|
(unsigned char)ethhdr->src.addr[3], (unsigned char)ethhdr->src.addr[4], (unsigned char)ethhdr->src.addr[5],
|
|
lwip_htons(ethhdr->type)));
|
|
|
|
type = ethhdr->type;
|
|
80100e6: 693b ldr r3, [r7, #16]
|
|
80100e8: 7b1a ldrb r2, [r3, #12]
|
|
80100ea: 7b5b ldrb r3, [r3, #13]
|
|
80100ec: 021b lsls r3, r3, #8
|
|
80100ee: 4313 orrs r3, r2
|
|
80100f0: 81fb strh r3, [r7, #14]
|
|
|
|
#if LWIP_ARP_FILTER_NETIF
|
|
netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, lwip_htons(type));
|
|
#endif /* LWIP_ARP_FILTER_NETIF*/
|
|
|
|
if (ethhdr->dest.addr[0] & 1) {
|
|
80100f2: 693b ldr r3, [r7, #16]
|
|
80100f4: 781b ldrb r3, [r3, #0]
|
|
80100f6: f003 0301 and.w r3, r3, #1
|
|
80100fa: 2b00 cmp r3, #0
|
|
80100fc: d023 beq.n 8010146 <ethernet_input+0x92>
|
|
/* this might be a multicast or broadcast packet */
|
|
if (ethhdr->dest.addr[0] == LL_IP4_MULTICAST_ADDR_0) {
|
|
80100fe: 693b ldr r3, [r7, #16]
|
|
8010100: 781b ldrb r3, [r3, #0]
|
|
8010102: 2b01 cmp r3, #1
|
|
8010104: d10f bne.n 8010126 <ethernet_input+0x72>
|
|
#if LWIP_IPV4
|
|
if ((ethhdr->dest.addr[1] == LL_IP4_MULTICAST_ADDR_1) &&
|
|
8010106: 693b ldr r3, [r7, #16]
|
|
8010108: 785b ldrb r3, [r3, #1]
|
|
801010a: 2b00 cmp r3, #0
|
|
801010c: d11b bne.n 8010146 <ethernet_input+0x92>
|
|
(ethhdr->dest.addr[2] == LL_IP4_MULTICAST_ADDR_2)) {
|
|
801010e: 693b ldr r3, [r7, #16]
|
|
8010110: 789b ldrb r3, [r3, #2]
|
|
if ((ethhdr->dest.addr[1] == LL_IP4_MULTICAST_ADDR_1) &&
|
|
8010112: 2b5e cmp r3, #94 ; 0x5e
|
|
8010114: d117 bne.n 8010146 <ethernet_input+0x92>
|
|
/* mark the pbuf as link-layer multicast */
|
|
p->flags |= PBUF_FLAG_LLMCAST;
|
|
8010116: 687b ldr r3, [r7, #4]
|
|
8010118: 7b5b ldrb r3, [r3, #13]
|
|
801011a: f043 0310 orr.w r3, r3, #16
|
|
801011e: b2da uxtb r2, r3
|
|
8010120: 687b ldr r3, [r7, #4]
|
|
8010122: 735a strb r2, [r3, #13]
|
|
8010124: e00f b.n 8010146 <ethernet_input+0x92>
|
|
(ethhdr->dest.addr[1] == LL_IP6_MULTICAST_ADDR_1)) {
|
|
/* mark the pbuf as link-layer multicast */
|
|
p->flags |= PBUF_FLAG_LLMCAST;
|
|
}
|
|
#endif /* LWIP_IPV6 */
|
|
else if (eth_addr_cmp(ðhdr->dest, ðbroadcast)) {
|
|
8010126: 693b ldr r3, [r7, #16]
|
|
8010128: 2206 movs r2, #6
|
|
801012a: 4928 ldr r1, [pc, #160] ; (80101cc <ethernet_input+0x118>)
|
|
801012c: 4618 mov r0, r3
|
|
801012e: f000 fe99 bl 8010e64 <memcmp>
|
|
8010132: 4603 mov r3, r0
|
|
8010134: 2b00 cmp r3, #0
|
|
8010136: d106 bne.n 8010146 <ethernet_input+0x92>
|
|
/* mark the pbuf as link-layer broadcast */
|
|
p->flags |= PBUF_FLAG_LLBCAST;
|
|
8010138: 687b ldr r3, [r7, #4]
|
|
801013a: 7b5b ldrb r3, [r3, #13]
|
|
801013c: f043 0308 orr.w r3, r3, #8
|
|
8010140: b2da uxtb r2, r3
|
|
8010142: 687b ldr r3, [r7, #4]
|
|
8010144: 735a strb r2, [r3, #13]
|
|
}
|
|
}
|
|
|
|
switch (type) {
|
|
8010146: 89fb ldrh r3, [r7, #14]
|
|
8010148: 2b08 cmp r3, #8
|
|
801014a: d003 beq.n 8010154 <ethernet_input+0xa0>
|
|
801014c: f5b3 6fc1 cmp.w r3, #1544 ; 0x608
|
|
8010150: d014 beq.n 801017c <ethernet_input+0xc8>
|
|
}
|
|
#endif
|
|
ETHARP_STATS_INC(etharp.proterr);
|
|
ETHARP_STATS_INC(etharp.drop);
|
|
MIB2_STATS_NETIF_INC(netif, ifinunknownprotos);
|
|
goto free_and_return;
|
|
8010152: e032 b.n 80101ba <ethernet_input+0x106>
|
|
if (!(netif->flags & NETIF_FLAG_ETHARP)) {
|
|
8010154: 683b ldr r3, [r7, #0]
|
|
8010156: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
801015a: f003 0308 and.w r3, r3, #8
|
|
801015e: 2b00 cmp r3, #0
|
|
8010160: d024 beq.n 80101ac <ethernet_input+0xf8>
|
|
if (pbuf_remove_header(p, next_hdr_offset)) {
|
|
8010162: 8afb ldrh r3, [r7, #22]
|
|
8010164: 4619 mov r1, r3
|
|
8010166: 6878 ldr r0, [r7, #4]
|
|
8010168: f7f6 feae bl 8006ec8 <pbuf_remove_header>
|
|
801016c: 4603 mov r3, r0
|
|
801016e: 2b00 cmp r3, #0
|
|
8010170: d11e bne.n 80101b0 <ethernet_input+0xfc>
|
|
ip4_input(p, netif);
|
|
8010172: 6839 ldr r1, [r7, #0]
|
|
8010174: 6878 ldr r0, [r7, #4]
|
|
8010176: f7fe ff21 bl 800efbc <ip4_input>
|
|
break;
|
|
801017a: e013 b.n 80101a4 <ethernet_input+0xf0>
|
|
if (!(netif->flags & NETIF_FLAG_ETHARP)) {
|
|
801017c: 683b ldr r3, [r7, #0]
|
|
801017e: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
|
|
8010182: f003 0308 and.w r3, r3, #8
|
|
8010186: 2b00 cmp r3, #0
|
|
8010188: d014 beq.n 80101b4 <ethernet_input+0x100>
|
|
if (pbuf_remove_header(p, next_hdr_offset)) {
|
|
801018a: 8afb ldrh r3, [r7, #22]
|
|
801018c: 4619 mov r1, r3
|
|
801018e: 6878 ldr r0, [r7, #4]
|
|
8010190: f7f6 fe9a bl 8006ec8 <pbuf_remove_header>
|
|
8010194: 4603 mov r3, r0
|
|
8010196: 2b00 cmp r3, #0
|
|
8010198: d10e bne.n 80101b8 <ethernet_input+0x104>
|
|
etharp_input(p, netif);
|
|
801019a: 6839 ldr r1, [r7, #0]
|
|
801019c: 6878 ldr r0, [r7, #4]
|
|
801019e: f7fe f805 bl 800e1ac <etharp_input>
|
|
break;
|
|
80101a2: bf00 nop
|
|
}
|
|
|
|
/* This means the pbuf is freed or consumed,
|
|
so the caller doesn't have to free it again */
|
|
return ERR_OK;
|
|
80101a4: 2300 movs r3, #0
|
|
80101a6: e00c b.n 80101c2 <ethernet_input+0x10e>
|
|
goto free_and_return;
|
|
80101a8: bf00 nop
|
|
80101aa: e006 b.n 80101ba <ethernet_input+0x106>
|
|
goto free_and_return;
|
|
80101ac: bf00 nop
|
|
80101ae: e004 b.n 80101ba <ethernet_input+0x106>
|
|
goto free_and_return;
|
|
80101b0: bf00 nop
|
|
80101b2: e002 b.n 80101ba <ethernet_input+0x106>
|
|
goto free_and_return;
|
|
80101b4: bf00 nop
|
|
80101b6: e000 b.n 80101ba <ethernet_input+0x106>
|
|
goto free_and_return;
|
|
80101b8: bf00 nop
|
|
|
|
free_and_return:
|
|
pbuf_free(p);
|
|
80101ba: 6878 ldr r0, [r7, #4]
|
|
80101bc: f7f6 ff0a bl 8006fd4 <pbuf_free>
|
|
return ERR_OK;
|
|
80101c0: 2300 movs r3, #0
|
|
}
|
|
80101c2: 4618 mov r0, r3
|
|
80101c4: 3718 adds r7, #24
|
|
80101c6: 46bd mov sp, r7
|
|
80101c8: bd80 pop {r7, pc}
|
|
80101ca: bf00 nop
|
|
80101cc: 08014d98 .word 0x08014d98
|
|
|
|
080101d0 <ethernet_output>:
|
|
* @return ERR_OK if the packet was sent, any other err_t on failure
|
|
*/
|
|
err_t
|
|
ethernet_output(struct netif * netif, struct pbuf * p,
|
|
const struct eth_addr * src, const struct eth_addr * dst,
|
|
u16_t eth_type) {
|
|
80101d0: b580 push {r7, lr}
|
|
80101d2: b086 sub sp, #24
|
|
80101d4: af00 add r7, sp, #0
|
|
80101d6: 60f8 str r0, [r7, #12]
|
|
80101d8: 60b9 str r1, [r7, #8]
|
|
80101da: 607a str r2, [r7, #4]
|
|
80101dc: 603b str r3, [r7, #0]
|
|
struct eth_hdr *ethhdr;
|
|
u16_t eth_type_be = lwip_htons(eth_type);
|
|
80101de: 8c3b ldrh r3, [r7, #32]
|
|
80101e0: 4618 mov r0, r3
|
|
80101e2: f7f5 f9b3 bl 800554c <lwip_htons>
|
|
80101e6: 4603 mov r3, r0
|
|
80101e8: 82fb strh r3, [r7, #22]
|
|
|
|
eth_type_be = PP_HTONS(ETHTYPE_VLAN);
|
|
} else
|
|
#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
|
|
{
|
|
if (pbuf_add_header(p, SIZEOF_ETH_HDR) != 0) {
|
|
80101ea: 210e movs r1, #14
|
|
80101ec: 68b8 ldr r0, [r7, #8]
|
|
80101ee: f7f6 fe5b bl 8006ea8 <pbuf_add_header>
|
|
80101f2: 4603 mov r3, r0
|
|
80101f4: 2b00 cmp r3, #0
|
|
80101f6: d125 bne.n 8010244 <ethernet_output+0x74>
|
|
}
|
|
}
|
|
|
|
LWIP_ASSERT_CORE_LOCKED();
|
|
|
|
ethhdr = (struct eth_hdr *)p->payload;
|
|
80101f8: 68bb ldr r3, [r7, #8]
|
|
80101fa: 685b ldr r3, [r3, #4]
|
|
80101fc: 613b str r3, [r7, #16]
|
|
ethhdr->type = eth_type_be;
|
|
80101fe: 693b ldr r3, [r7, #16]
|
|
8010200: 8afa ldrh r2, [r7, #22]
|
|
8010202: 819a strh r2, [r3, #12]
|
|
SMEMCPY(ðhdr->dest, dst, ETH_HWADDR_LEN);
|
|
8010204: 693b ldr r3, [r7, #16]
|
|
8010206: 2206 movs r2, #6
|
|
8010208: 6839 ldr r1, [r7, #0]
|
|
801020a: 4618 mov r0, r3
|
|
801020c: f000 febd bl 8010f8a <memcpy>
|
|
SMEMCPY(ðhdr->src, src, ETH_HWADDR_LEN);
|
|
8010210: 693b ldr r3, [r7, #16]
|
|
8010212: 3306 adds r3, #6
|
|
8010214: 2206 movs r2, #6
|
|
8010216: 6879 ldr r1, [r7, #4]
|
|
8010218: 4618 mov r0, r3
|
|
801021a: f000 feb6 bl 8010f8a <memcpy>
|
|
|
|
LWIP_ASSERT("netif->hwaddr_len must be 6 for ethernet_output!",
|
|
801021e: 68fb ldr r3, [r7, #12]
|
|
8010220: f893 302c ldrb.w r3, [r3, #44] ; 0x2c
|
|
8010224: 2b06 cmp r3, #6
|
|
8010226: d006 beq.n 8010236 <ethernet_output+0x66>
|
|
8010228: 4b0a ldr r3, [pc, #40] ; (8010254 <ethernet_output+0x84>)
|
|
801022a: f44f 7299 mov.w r2, #306 ; 0x132
|
|
801022e: 490a ldr r1, [pc, #40] ; (8010258 <ethernet_output+0x88>)
|
|
8010230: 480a ldr r0, [pc, #40] ; (801025c <ethernet_output+0x8c>)
|
|
8010232: f000 fcc9 bl 8010bc8 <iprintf>
|
|
(netif->hwaddr_len == ETH_HWADDR_LEN));
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE,
|
|
("ethernet_output: sending packet %p\n", (void *)p));
|
|
|
|
/* send the packet */
|
|
return netif->linkoutput(netif, p);
|
|
8010236: 68fb ldr r3, [r7, #12]
|
|
8010238: 699b ldr r3, [r3, #24]
|
|
801023a: 68b9 ldr r1, [r7, #8]
|
|
801023c: 68f8 ldr r0, [r7, #12]
|
|
801023e: 4798 blx r3
|
|
8010240: 4603 mov r3, r0
|
|
8010242: e002 b.n 801024a <ethernet_output+0x7a>
|
|
goto pbuf_header_failed;
|
|
8010244: bf00 nop
|
|
|
|
pbuf_header_failed:
|
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
|
|
("ethernet_output: could not allocate room for header.\n"));
|
|
LINK_STATS_INC(link.lenerr);
|
|
return ERR_BUF;
|
|
8010246: f06f 0301 mvn.w r3, #1
|
|
}
|
|
801024a: 4618 mov r0, r3
|
|
801024c: 3718 adds r7, #24
|
|
801024e: 46bd mov sp, r7
|
|
8010250: bd80 pop {r7, pc}
|
|
8010252: bf00 nop
|
|
8010254: 08014be4 .word 0x08014be4
|
|
8010258: 08014c1c .word 0x08014c1c
|
|
801025c: 08014c50 .word 0x08014c50
|
|
|
|
08010260 <rand>:
|
|
8010260: 4b16 ldr r3, [pc, #88] ; (80102bc <rand+0x5c>)
|
|
8010262: b510 push {r4, lr}
|
|
8010264: 681c ldr r4, [r3, #0]
|
|
8010266: 6b23 ldr r3, [r4, #48] ; 0x30
|
|
8010268: b9b3 cbnz r3, 8010298 <rand+0x38>
|
|
801026a: 2018 movs r0, #24
|
|
801026c: f000 ff06 bl 801107c <malloc>
|
|
8010270: 4602 mov r2, r0
|
|
8010272: 6320 str r0, [r4, #48] ; 0x30
|
|
8010274: b920 cbnz r0, 8010280 <rand+0x20>
|
|
8010276: 4b12 ldr r3, [pc, #72] ; (80102c0 <rand+0x60>)
|
|
8010278: 4812 ldr r0, [pc, #72] ; (80102c4 <rand+0x64>)
|
|
801027a: 2152 movs r1, #82 ; 0x52
|
|
801027c: f000 fe94 bl 8010fa8 <__assert_func>
|
|
8010280: 4911 ldr r1, [pc, #68] ; (80102c8 <rand+0x68>)
|
|
8010282: 4b12 ldr r3, [pc, #72] ; (80102cc <rand+0x6c>)
|
|
8010284: e9c0 1300 strd r1, r3, [r0]
|
|
8010288: 4b11 ldr r3, [pc, #68] ; (80102d0 <rand+0x70>)
|
|
801028a: 6083 str r3, [r0, #8]
|
|
801028c: 230b movs r3, #11
|
|
801028e: 8183 strh r3, [r0, #12]
|
|
8010290: 2100 movs r1, #0
|
|
8010292: 2001 movs r0, #1
|
|
8010294: e9c2 0104 strd r0, r1, [r2, #16]
|
|
8010298: 6b21 ldr r1, [r4, #48] ; 0x30
|
|
801029a: 480e ldr r0, [pc, #56] ; (80102d4 <rand+0x74>)
|
|
801029c: 690b ldr r3, [r1, #16]
|
|
801029e: 694c ldr r4, [r1, #20]
|
|
80102a0: 4a0d ldr r2, [pc, #52] ; (80102d8 <rand+0x78>)
|
|
80102a2: 4358 muls r0, r3
|
|
80102a4: fb02 0004 mla r0, r2, r4, r0
|
|
80102a8: fba3 3202 umull r3, r2, r3, r2
|
|
80102ac: 3301 adds r3, #1
|
|
80102ae: eb40 0002 adc.w r0, r0, r2
|
|
80102b2: e9c1 3004 strd r3, r0, [r1, #16]
|
|
80102b6: f020 4000 bic.w r0, r0, #2147483648 ; 0x80000000
|
|
80102ba: bd10 pop {r4, pc}
|
|
80102bc: 240000cc .word 0x240000cc
|
|
80102c0: 08014da6 .word 0x08014da6
|
|
80102c4: 08014dbd .word 0x08014dbd
|
|
80102c8: abcd330e .word 0xabcd330e
|
|
80102cc: e66d1234 .word 0xe66d1234
|
|
80102d0: 0005deec .word 0x0005deec
|
|
80102d4: 5851f42d .word 0x5851f42d
|
|
80102d8: 4c957f2d .word 0x4c957f2d
|
|
|
|
080102dc <_strtoul_l.constprop.0>:
|
|
80102dc: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
|
|
80102e0: 4f36 ldr r7, [pc, #216] ; (80103bc <_strtoul_l.constprop.0+0xe0>)
|
|
80102e2: 4686 mov lr, r0
|
|
80102e4: 460d mov r5, r1
|
|
80102e6: 4628 mov r0, r5
|
|
80102e8: f815 4b01 ldrb.w r4, [r5], #1
|
|
80102ec: 5d3e ldrb r6, [r7, r4]
|
|
80102ee: f016 0608 ands.w r6, r6, #8
|
|
80102f2: d1f8 bne.n 80102e6 <_strtoul_l.constprop.0+0xa>
|
|
80102f4: 2c2d cmp r4, #45 ; 0x2d
|
|
80102f6: d130 bne.n 801035a <_strtoul_l.constprop.0+0x7e>
|
|
80102f8: 782c ldrb r4, [r5, #0]
|
|
80102fa: 2601 movs r6, #1
|
|
80102fc: 1c85 adds r5, r0, #2
|
|
80102fe: 2b00 cmp r3, #0
|
|
8010300: d057 beq.n 80103b2 <_strtoul_l.constprop.0+0xd6>
|
|
8010302: 2b10 cmp r3, #16
|
|
8010304: d109 bne.n 801031a <_strtoul_l.constprop.0+0x3e>
|
|
8010306: 2c30 cmp r4, #48 ; 0x30
|
|
8010308: d107 bne.n 801031a <_strtoul_l.constprop.0+0x3e>
|
|
801030a: 7828 ldrb r0, [r5, #0]
|
|
801030c: f000 00df and.w r0, r0, #223 ; 0xdf
|
|
8010310: 2858 cmp r0, #88 ; 0x58
|
|
8010312: d149 bne.n 80103a8 <_strtoul_l.constprop.0+0xcc>
|
|
8010314: 786c ldrb r4, [r5, #1]
|
|
8010316: 2310 movs r3, #16
|
|
8010318: 3502 adds r5, #2
|
|
801031a: f04f 38ff mov.w r8, #4294967295
|
|
801031e: 2700 movs r7, #0
|
|
8010320: fbb8 f8f3 udiv r8, r8, r3
|
|
8010324: fb03 f908 mul.w r9, r3, r8
|
|
8010328: ea6f 0909 mvn.w r9, r9
|
|
801032c: 4638 mov r0, r7
|
|
801032e: f1a4 0c30 sub.w ip, r4, #48 ; 0x30
|
|
8010332: f1bc 0f09 cmp.w ip, #9
|
|
8010336: d815 bhi.n 8010364 <_strtoul_l.constprop.0+0x88>
|
|
8010338: 4664 mov r4, ip
|
|
801033a: 42a3 cmp r3, r4
|
|
801033c: dd23 ble.n 8010386 <_strtoul_l.constprop.0+0xaa>
|
|
801033e: f1b7 3fff cmp.w r7, #4294967295
|
|
8010342: d007 beq.n 8010354 <_strtoul_l.constprop.0+0x78>
|
|
8010344: 4580 cmp r8, r0
|
|
8010346: d31b bcc.n 8010380 <_strtoul_l.constprop.0+0xa4>
|
|
8010348: d101 bne.n 801034e <_strtoul_l.constprop.0+0x72>
|
|
801034a: 45a1 cmp r9, r4
|
|
801034c: db18 blt.n 8010380 <_strtoul_l.constprop.0+0xa4>
|
|
801034e: fb00 4003 mla r0, r0, r3, r4
|
|
8010352: 2701 movs r7, #1
|
|
8010354: f815 4b01 ldrb.w r4, [r5], #1
|
|
8010358: e7e9 b.n 801032e <_strtoul_l.constprop.0+0x52>
|
|
801035a: 2c2b cmp r4, #43 ; 0x2b
|
|
801035c: bf04 itt eq
|
|
801035e: 782c ldrbeq r4, [r5, #0]
|
|
8010360: 1c85 addeq r5, r0, #2
|
|
8010362: e7cc b.n 80102fe <_strtoul_l.constprop.0+0x22>
|
|
8010364: f1a4 0c41 sub.w ip, r4, #65 ; 0x41
|
|
8010368: f1bc 0f19 cmp.w ip, #25
|
|
801036c: d801 bhi.n 8010372 <_strtoul_l.constprop.0+0x96>
|
|
801036e: 3c37 subs r4, #55 ; 0x37
|
|
8010370: e7e3 b.n 801033a <_strtoul_l.constprop.0+0x5e>
|
|
8010372: f1a4 0c61 sub.w ip, r4, #97 ; 0x61
|
|
8010376: f1bc 0f19 cmp.w ip, #25
|
|
801037a: d804 bhi.n 8010386 <_strtoul_l.constprop.0+0xaa>
|
|
801037c: 3c57 subs r4, #87 ; 0x57
|
|
801037e: e7dc b.n 801033a <_strtoul_l.constprop.0+0x5e>
|
|
8010380: f04f 37ff mov.w r7, #4294967295
|
|
8010384: e7e6 b.n 8010354 <_strtoul_l.constprop.0+0x78>
|
|
8010386: 1c7b adds r3, r7, #1
|
|
8010388: d106 bne.n 8010398 <_strtoul_l.constprop.0+0xbc>
|
|
801038a: 2322 movs r3, #34 ; 0x22
|
|
801038c: f8ce 3000 str.w r3, [lr]
|
|
8010390: 4638 mov r0, r7
|
|
8010392: b932 cbnz r2, 80103a2 <_strtoul_l.constprop.0+0xc6>
|
|
8010394: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
|
|
8010398: b106 cbz r6, 801039c <_strtoul_l.constprop.0+0xc0>
|
|
801039a: 4240 negs r0, r0
|
|
801039c: 2a00 cmp r2, #0
|
|
801039e: d0f9 beq.n 8010394 <_strtoul_l.constprop.0+0xb8>
|
|
80103a0: b107 cbz r7, 80103a4 <_strtoul_l.constprop.0+0xc8>
|
|
80103a2: 1e69 subs r1, r5, #1
|
|
80103a4: 6011 str r1, [r2, #0]
|
|
80103a6: e7f5 b.n 8010394 <_strtoul_l.constprop.0+0xb8>
|
|
80103a8: 2430 movs r4, #48 ; 0x30
|
|
80103aa: 2b00 cmp r3, #0
|
|
80103ac: d1b5 bne.n 801031a <_strtoul_l.constprop.0+0x3e>
|
|
80103ae: 2308 movs r3, #8
|
|
80103b0: e7b3 b.n 801031a <_strtoul_l.constprop.0+0x3e>
|
|
80103b2: 2c30 cmp r4, #48 ; 0x30
|
|
80103b4: d0a9 beq.n 801030a <_strtoul_l.constprop.0+0x2e>
|
|
80103b6: 230a movs r3, #10
|
|
80103b8: e7af b.n 801031a <_strtoul_l.constprop.0+0x3e>
|
|
80103ba: bf00 nop
|
|
80103bc: 08014e16 .word 0x08014e16
|
|
|
|
080103c0 <strtoul>:
|
|
80103c0: 4613 mov r3, r2
|
|
80103c2: 460a mov r2, r1
|
|
80103c4: 4601 mov r1, r0
|
|
80103c6: 4802 ldr r0, [pc, #8] ; (80103d0 <strtoul+0x10>)
|
|
80103c8: 6800 ldr r0, [r0, #0]
|
|
80103ca: f7ff bf87 b.w 80102dc <_strtoul_l.constprop.0>
|
|
80103ce: bf00 nop
|
|
80103d0: 240000cc .word 0x240000cc
|
|
|
|
080103d4 <__sfputc_r>:
|
|
80103d4: 6893 ldr r3, [r2, #8]
|
|
80103d6: 3b01 subs r3, #1
|
|
80103d8: 2b00 cmp r3, #0
|
|
80103da: b410 push {r4}
|
|
80103dc: 6093 str r3, [r2, #8]
|
|
80103de: da08 bge.n 80103f2 <__sfputc_r+0x1e>
|
|
80103e0: 6994 ldr r4, [r2, #24]
|
|
80103e2: 42a3 cmp r3, r4
|
|
80103e4: db01 blt.n 80103ea <__sfputc_r+0x16>
|
|
80103e6: 290a cmp r1, #10
|
|
80103e8: d103 bne.n 80103f2 <__sfputc_r+0x1e>
|
|
80103ea: f85d 4b04 ldr.w r4, [sp], #4
|
|
80103ee: f000 bca4 b.w 8010d3a <__swbuf_r>
|
|
80103f2: 6813 ldr r3, [r2, #0]
|
|
80103f4: 1c58 adds r0, r3, #1
|
|
80103f6: 6010 str r0, [r2, #0]
|
|
80103f8: 7019 strb r1, [r3, #0]
|
|
80103fa: 4608 mov r0, r1
|
|
80103fc: f85d 4b04 ldr.w r4, [sp], #4
|
|
8010400: 4770 bx lr
|
|
|
|
08010402 <__sfputs_r>:
|
|
8010402: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
8010404: 4606 mov r6, r0
|
|
8010406: 460f mov r7, r1
|
|
8010408: 4614 mov r4, r2
|
|
801040a: 18d5 adds r5, r2, r3
|
|
801040c: 42ac cmp r4, r5
|
|
801040e: d101 bne.n 8010414 <__sfputs_r+0x12>
|
|
8010410: 2000 movs r0, #0
|
|
8010412: e007 b.n 8010424 <__sfputs_r+0x22>
|
|
8010414: f814 1b01 ldrb.w r1, [r4], #1
|
|
8010418: 463a mov r2, r7
|
|
801041a: 4630 mov r0, r6
|
|
801041c: f7ff ffda bl 80103d4 <__sfputc_r>
|
|
8010420: 1c43 adds r3, r0, #1
|
|
8010422: d1f3 bne.n 801040c <__sfputs_r+0xa>
|
|
8010424: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
...
|
|
|
|
08010428 <_vfiprintf_r>:
|
|
8010428: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
|
|
801042c: 460d mov r5, r1
|
|
801042e: b09d sub sp, #116 ; 0x74
|
|
8010430: 4614 mov r4, r2
|
|
8010432: 4698 mov r8, r3
|
|
8010434: 4606 mov r6, r0
|
|
8010436: b118 cbz r0, 8010440 <_vfiprintf_r+0x18>
|
|
8010438: 6a03 ldr r3, [r0, #32]
|
|
801043a: b90b cbnz r3, 8010440 <_vfiprintf_r+0x18>
|
|
801043c: f000 fb34 bl 8010aa8 <__sinit>
|
|
8010440: 6e6b ldr r3, [r5, #100] ; 0x64
|
|
8010442: 07d9 lsls r1, r3, #31
|
|
8010444: d405 bmi.n 8010452 <_vfiprintf_r+0x2a>
|
|
8010446: 89ab ldrh r3, [r5, #12]
|
|
8010448: 059a lsls r2, r3, #22
|
|
801044a: d402 bmi.n 8010452 <_vfiprintf_r+0x2a>
|
|
801044c: 6da8 ldr r0, [r5, #88] ; 0x58
|
|
801044e: f000 fd9a bl 8010f86 <__retarget_lock_acquire_recursive>
|
|
8010452: 89ab ldrh r3, [r5, #12]
|
|
8010454: 071b lsls r3, r3, #28
|
|
8010456: d501 bpl.n 801045c <_vfiprintf_r+0x34>
|
|
8010458: 692b ldr r3, [r5, #16]
|
|
801045a: b99b cbnz r3, 8010484 <_vfiprintf_r+0x5c>
|
|
801045c: 4629 mov r1, r5
|
|
801045e: 4630 mov r0, r6
|
|
8010460: f000 fca8 bl 8010db4 <__swsetup_r>
|
|
8010464: b170 cbz r0, 8010484 <_vfiprintf_r+0x5c>
|
|
8010466: 6e6b ldr r3, [r5, #100] ; 0x64
|
|
8010468: 07dc lsls r4, r3, #31
|
|
801046a: d504 bpl.n 8010476 <_vfiprintf_r+0x4e>
|
|
801046c: f04f 30ff mov.w r0, #4294967295
|
|
8010470: b01d add sp, #116 ; 0x74
|
|
8010472: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
|
|
8010476: 89ab ldrh r3, [r5, #12]
|
|
8010478: 0598 lsls r0, r3, #22
|
|
801047a: d4f7 bmi.n 801046c <_vfiprintf_r+0x44>
|
|
801047c: 6da8 ldr r0, [r5, #88] ; 0x58
|
|
801047e: f000 fd83 bl 8010f88 <__retarget_lock_release_recursive>
|
|
8010482: e7f3 b.n 801046c <_vfiprintf_r+0x44>
|
|
8010484: 2300 movs r3, #0
|
|
8010486: 9309 str r3, [sp, #36] ; 0x24
|
|
8010488: 2320 movs r3, #32
|
|
801048a: f88d 3029 strb.w r3, [sp, #41] ; 0x29
|
|
801048e: f8cd 800c str.w r8, [sp, #12]
|
|
8010492: 2330 movs r3, #48 ; 0x30
|
|
8010494: f8df 81b0 ldr.w r8, [pc, #432] ; 8010648 <_vfiprintf_r+0x220>
|
|
8010498: f88d 302a strb.w r3, [sp, #42] ; 0x2a
|
|
801049c: f04f 0901 mov.w r9, #1
|
|
80104a0: 4623 mov r3, r4
|
|
80104a2: 469a mov sl, r3
|
|
80104a4: f813 2b01 ldrb.w r2, [r3], #1
|
|
80104a8: b10a cbz r2, 80104ae <_vfiprintf_r+0x86>
|
|
80104aa: 2a25 cmp r2, #37 ; 0x25
|
|
80104ac: d1f9 bne.n 80104a2 <_vfiprintf_r+0x7a>
|
|
80104ae: ebba 0b04 subs.w fp, sl, r4
|
|
80104b2: d00b beq.n 80104cc <_vfiprintf_r+0xa4>
|
|
80104b4: 465b mov r3, fp
|
|
80104b6: 4622 mov r2, r4
|
|
80104b8: 4629 mov r1, r5
|
|
80104ba: 4630 mov r0, r6
|
|
80104bc: f7ff ffa1 bl 8010402 <__sfputs_r>
|
|
80104c0: 3001 adds r0, #1
|
|
80104c2: f000 80a9 beq.w 8010618 <_vfiprintf_r+0x1f0>
|
|
80104c6: 9a09 ldr r2, [sp, #36] ; 0x24
|
|
80104c8: 445a add r2, fp
|
|
80104ca: 9209 str r2, [sp, #36] ; 0x24
|
|
80104cc: f89a 3000 ldrb.w r3, [sl]
|
|
80104d0: 2b00 cmp r3, #0
|
|
80104d2: f000 80a1 beq.w 8010618 <_vfiprintf_r+0x1f0>
|
|
80104d6: 2300 movs r3, #0
|
|
80104d8: f04f 32ff mov.w r2, #4294967295
|
|
80104dc: e9cd 2305 strd r2, r3, [sp, #20]
|
|
80104e0: f10a 0a01 add.w sl, sl, #1
|
|
80104e4: 9304 str r3, [sp, #16]
|
|
80104e6: 9307 str r3, [sp, #28]
|
|
80104e8: f88d 3053 strb.w r3, [sp, #83] ; 0x53
|
|
80104ec: 931a str r3, [sp, #104] ; 0x68
|
|
80104ee: 4654 mov r4, sl
|
|
80104f0: 2205 movs r2, #5
|
|
80104f2: f814 1b01 ldrb.w r1, [r4], #1
|
|
80104f6: 4854 ldr r0, [pc, #336] ; (8010648 <_vfiprintf_r+0x220>)
|
|
80104f8: f7ef ff0a bl 8000310 <memchr>
|
|
80104fc: 9a04 ldr r2, [sp, #16]
|
|
80104fe: b9d8 cbnz r0, 8010538 <_vfiprintf_r+0x110>
|
|
8010500: 06d1 lsls r1, r2, #27
|
|
8010502: bf44 itt mi
|
|
8010504: 2320 movmi r3, #32
|
|
8010506: f88d 3053 strbmi.w r3, [sp, #83] ; 0x53
|
|
801050a: 0713 lsls r3, r2, #28
|
|
801050c: bf44 itt mi
|
|
801050e: 232b movmi r3, #43 ; 0x2b
|
|
8010510: f88d 3053 strbmi.w r3, [sp, #83] ; 0x53
|
|
8010514: f89a 3000 ldrb.w r3, [sl]
|
|
8010518: 2b2a cmp r3, #42 ; 0x2a
|
|
801051a: d015 beq.n 8010548 <_vfiprintf_r+0x120>
|
|
801051c: 9a07 ldr r2, [sp, #28]
|
|
801051e: 4654 mov r4, sl
|
|
8010520: 2000 movs r0, #0
|
|
8010522: f04f 0c0a mov.w ip, #10
|
|
8010526: 4621 mov r1, r4
|
|
8010528: f811 3b01 ldrb.w r3, [r1], #1
|
|
801052c: 3b30 subs r3, #48 ; 0x30
|
|
801052e: 2b09 cmp r3, #9
|
|
8010530: d94d bls.n 80105ce <_vfiprintf_r+0x1a6>
|
|
8010532: b1b0 cbz r0, 8010562 <_vfiprintf_r+0x13a>
|
|
8010534: 9207 str r2, [sp, #28]
|
|
8010536: e014 b.n 8010562 <_vfiprintf_r+0x13a>
|
|
8010538: eba0 0308 sub.w r3, r0, r8
|
|
801053c: fa09 f303 lsl.w r3, r9, r3
|
|
8010540: 4313 orrs r3, r2
|
|
8010542: 9304 str r3, [sp, #16]
|
|
8010544: 46a2 mov sl, r4
|
|
8010546: e7d2 b.n 80104ee <_vfiprintf_r+0xc6>
|
|
8010548: 9b03 ldr r3, [sp, #12]
|
|
801054a: 1d19 adds r1, r3, #4
|
|
801054c: 681b ldr r3, [r3, #0]
|
|
801054e: 9103 str r1, [sp, #12]
|
|
8010550: 2b00 cmp r3, #0
|
|
8010552: bfbb ittet lt
|
|
8010554: 425b neglt r3, r3
|
|
8010556: f042 0202 orrlt.w r2, r2, #2
|
|
801055a: 9307 strge r3, [sp, #28]
|
|
801055c: 9307 strlt r3, [sp, #28]
|
|
801055e: bfb8 it lt
|
|
8010560: 9204 strlt r2, [sp, #16]
|
|
8010562: 7823 ldrb r3, [r4, #0]
|
|
8010564: 2b2e cmp r3, #46 ; 0x2e
|
|
8010566: d10c bne.n 8010582 <_vfiprintf_r+0x15a>
|
|
8010568: 7863 ldrb r3, [r4, #1]
|
|
801056a: 2b2a cmp r3, #42 ; 0x2a
|
|
801056c: d134 bne.n 80105d8 <_vfiprintf_r+0x1b0>
|
|
801056e: 9b03 ldr r3, [sp, #12]
|
|
8010570: 1d1a adds r2, r3, #4
|
|
8010572: 681b ldr r3, [r3, #0]
|
|
8010574: 9203 str r2, [sp, #12]
|
|
8010576: 2b00 cmp r3, #0
|
|
8010578: bfb8 it lt
|
|
801057a: f04f 33ff movlt.w r3, #4294967295
|
|
801057e: 3402 adds r4, #2
|
|
8010580: 9305 str r3, [sp, #20]
|
|
8010582: f8df a0d4 ldr.w sl, [pc, #212] ; 8010658 <_vfiprintf_r+0x230>
|
|
8010586: 7821 ldrb r1, [r4, #0]
|
|
8010588: 2203 movs r2, #3
|
|
801058a: 4650 mov r0, sl
|
|
801058c: f7ef fec0 bl 8000310 <memchr>
|
|
8010590: b138 cbz r0, 80105a2 <_vfiprintf_r+0x17a>
|
|
8010592: 9b04 ldr r3, [sp, #16]
|
|
8010594: eba0 000a sub.w r0, r0, sl
|
|
8010598: 2240 movs r2, #64 ; 0x40
|
|
801059a: 4082 lsls r2, r0
|
|
801059c: 4313 orrs r3, r2
|
|
801059e: 3401 adds r4, #1
|
|
80105a0: 9304 str r3, [sp, #16]
|
|
80105a2: f814 1b01 ldrb.w r1, [r4], #1
|
|
80105a6: 4829 ldr r0, [pc, #164] ; (801064c <_vfiprintf_r+0x224>)
|
|
80105a8: f88d 1028 strb.w r1, [sp, #40] ; 0x28
|
|
80105ac: 2206 movs r2, #6
|
|
80105ae: f7ef feaf bl 8000310 <memchr>
|
|
80105b2: 2800 cmp r0, #0
|
|
80105b4: d03f beq.n 8010636 <_vfiprintf_r+0x20e>
|
|
80105b6: 4b26 ldr r3, [pc, #152] ; (8010650 <_vfiprintf_r+0x228>)
|
|
80105b8: bb1b cbnz r3, 8010602 <_vfiprintf_r+0x1da>
|
|
80105ba: 9b03 ldr r3, [sp, #12]
|
|
80105bc: 3307 adds r3, #7
|
|
80105be: f023 0307 bic.w r3, r3, #7
|
|
80105c2: 3308 adds r3, #8
|
|
80105c4: 9303 str r3, [sp, #12]
|
|
80105c6: 9b09 ldr r3, [sp, #36] ; 0x24
|
|
80105c8: 443b add r3, r7
|
|
80105ca: 9309 str r3, [sp, #36] ; 0x24
|
|
80105cc: e768 b.n 80104a0 <_vfiprintf_r+0x78>
|
|
80105ce: fb0c 3202 mla r2, ip, r2, r3
|
|
80105d2: 460c mov r4, r1
|
|
80105d4: 2001 movs r0, #1
|
|
80105d6: e7a6 b.n 8010526 <_vfiprintf_r+0xfe>
|
|
80105d8: 2300 movs r3, #0
|
|
80105da: 3401 adds r4, #1
|
|
80105dc: 9305 str r3, [sp, #20]
|
|
80105de: 4619 mov r1, r3
|
|
80105e0: f04f 0c0a mov.w ip, #10
|
|
80105e4: 4620 mov r0, r4
|
|
80105e6: f810 2b01 ldrb.w r2, [r0], #1
|
|
80105ea: 3a30 subs r2, #48 ; 0x30
|
|
80105ec: 2a09 cmp r2, #9
|
|
80105ee: d903 bls.n 80105f8 <_vfiprintf_r+0x1d0>
|
|
80105f0: 2b00 cmp r3, #0
|
|
80105f2: d0c6 beq.n 8010582 <_vfiprintf_r+0x15a>
|
|
80105f4: 9105 str r1, [sp, #20]
|
|
80105f6: e7c4 b.n 8010582 <_vfiprintf_r+0x15a>
|
|
80105f8: fb0c 2101 mla r1, ip, r1, r2
|
|
80105fc: 4604 mov r4, r0
|
|
80105fe: 2301 movs r3, #1
|
|
8010600: e7f0 b.n 80105e4 <_vfiprintf_r+0x1bc>
|
|
8010602: ab03 add r3, sp, #12
|
|
8010604: 9300 str r3, [sp, #0]
|
|
8010606: 462a mov r2, r5
|
|
8010608: 4b12 ldr r3, [pc, #72] ; (8010654 <_vfiprintf_r+0x22c>)
|
|
801060a: a904 add r1, sp, #16
|
|
801060c: 4630 mov r0, r6
|
|
801060e: f3af 8000 nop.w
|
|
8010612: 4607 mov r7, r0
|
|
8010614: 1c78 adds r0, r7, #1
|
|
8010616: d1d6 bne.n 80105c6 <_vfiprintf_r+0x19e>
|
|
8010618: 6e6b ldr r3, [r5, #100] ; 0x64
|
|
801061a: 07d9 lsls r1, r3, #31
|
|
801061c: d405 bmi.n 801062a <_vfiprintf_r+0x202>
|
|
801061e: 89ab ldrh r3, [r5, #12]
|
|
8010620: 059a lsls r2, r3, #22
|
|
8010622: d402 bmi.n 801062a <_vfiprintf_r+0x202>
|
|
8010624: 6da8 ldr r0, [r5, #88] ; 0x58
|
|
8010626: f000 fcaf bl 8010f88 <__retarget_lock_release_recursive>
|
|
801062a: 89ab ldrh r3, [r5, #12]
|
|
801062c: 065b lsls r3, r3, #25
|
|
801062e: f53f af1d bmi.w 801046c <_vfiprintf_r+0x44>
|
|
8010632: 9809 ldr r0, [sp, #36] ; 0x24
|
|
8010634: e71c b.n 8010470 <_vfiprintf_r+0x48>
|
|
8010636: ab03 add r3, sp, #12
|
|
8010638: 9300 str r3, [sp, #0]
|
|
801063a: 462a mov r2, r5
|
|
801063c: 4b05 ldr r3, [pc, #20] ; (8010654 <_vfiprintf_r+0x22c>)
|
|
801063e: a904 add r1, sp, #16
|
|
8010640: 4630 mov r0, r6
|
|
8010642: f000 f883 bl 801074c <_printf_i>
|
|
8010646: e7e4 b.n 8010612 <_vfiprintf_r+0x1ea>
|
|
8010648: 08014f16 .word 0x08014f16
|
|
801064c: 08014f20 .word 0x08014f20
|
|
8010650: 00000000 .word 0x00000000
|
|
8010654: 08010403 .word 0x08010403
|
|
8010658: 08014f1c .word 0x08014f1c
|
|
|
|
0801065c <vfiprintf>:
|
|
801065c: 4613 mov r3, r2
|
|
801065e: 460a mov r2, r1
|
|
8010660: 4601 mov r1, r0
|
|
8010662: 4802 ldr r0, [pc, #8] ; (801066c <vfiprintf+0x10>)
|
|
8010664: 6800 ldr r0, [r0, #0]
|
|
8010666: f7ff bedf b.w 8010428 <_vfiprintf_r>
|
|
801066a: bf00 nop
|
|
801066c: 240000cc .word 0x240000cc
|
|
|
|
08010670 <_printf_common>:
|
|
8010670: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
|
|
8010674: 4616 mov r6, r2
|
|
8010676: 4699 mov r9, r3
|
|
8010678: 688a ldr r2, [r1, #8]
|
|
801067a: 690b ldr r3, [r1, #16]
|
|
801067c: f8dd 8020 ldr.w r8, [sp, #32]
|
|
8010680: 4293 cmp r3, r2
|
|
8010682: bfb8 it lt
|
|
8010684: 4613 movlt r3, r2
|
|
8010686: 6033 str r3, [r6, #0]
|
|
8010688: f891 2043 ldrb.w r2, [r1, #67] ; 0x43
|
|
801068c: 4607 mov r7, r0
|
|
801068e: 460c mov r4, r1
|
|
8010690: b10a cbz r2, 8010696 <_printf_common+0x26>
|
|
8010692: 3301 adds r3, #1
|
|
8010694: 6033 str r3, [r6, #0]
|
|
8010696: 6823 ldr r3, [r4, #0]
|
|
8010698: 0699 lsls r1, r3, #26
|
|
801069a: bf42 ittt mi
|
|
801069c: 6833 ldrmi r3, [r6, #0]
|
|
801069e: 3302 addmi r3, #2
|
|
80106a0: 6033 strmi r3, [r6, #0]
|
|
80106a2: 6825 ldr r5, [r4, #0]
|
|
80106a4: f015 0506 ands.w r5, r5, #6
|
|
80106a8: d106 bne.n 80106b8 <_printf_common+0x48>
|
|
80106aa: f104 0a19 add.w sl, r4, #25
|
|
80106ae: 68e3 ldr r3, [r4, #12]
|
|
80106b0: 6832 ldr r2, [r6, #0]
|
|
80106b2: 1a9b subs r3, r3, r2
|
|
80106b4: 42ab cmp r3, r5
|
|
80106b6: dc26 bgt.n 8010706 <_printf_common+0x96>
|
|
80106b8: f894 2043 ldrb.w r2, [r4, #67] ; 0x43
|
|
80106bc: 1e13 subs r3, r2, #0
|
|
80106be: 6822 ldr r2, [r4, #0]
|
|
80106c0: bf18 it ne
|
|
80106c2: 2301 movne r3, #1
|
|
80106c4: 0692 lsls r2, r2, #26
|
|
80106c6: d42b bmi.n 8010720 <_printf_common+0xb0>
|
|
80106c8: f104 0243 add.w r2, r4, #67 ; 0x43
|
|
80106cc: 4649 mov r1, r9
|
|
80106ce: 4638 mov r0, r7
|
|
80106d0: 47c0 blx r8
|
|
80106d2: 3001 adds r0, #1
|
|
80106d4: d01e beq.n 8010714 <_printf_common+0xa4>
|
|
80106d6: 6823 ldr r3, [r4, #0]
|
|
80106d8: 6922 ldr r2, [r4, #16]
|
|
80106da: f003 0306 and.w r3, r3, #6
|
|
80106de: 2b04 cmp r3, #4
|
|
80106e0: bf02 ittt eq
|
|
80106e2: 68e5 ldreq r5, [r4, #12]
|
|
80106e4: 6833 ldreq r3, [r6, #0]
|
|
80106e6: 1aed subeq r5, r5, r3
|
|
80106e8: 68a3 ldr r3, [r4, #8]
|
|
80106ea: bf0c ite eq
|
|
80106ec: ea25 75e5 biceq.w r5, r5, r5, asr #31
|
|
80106f0: 2500 movne r5, #0
|
|
80106f2: 4293 cmp r3, r2
|
|
80106f4: bfc4 itt gt
|
|
80106f6: 1a9b subgt r3, r3, r2
|
|
80106f8: 18ed addgt r5, r5, r3
|
|
80106fa: 2600 movs r6, #0
|
|
80106fc: 341a adds r4, #26
|
|
80106fe: 42b5 cmp r5, r6
|
|
8010700: d11a bne.n 8010738 <_printf_common+0xc8>
|
|
8010702: 2000 movs r0, #0
|
|
8010704: e008 b.n 8010718 <_printf_common+0xa8>
|
|
8010706: 2301 movs r3, #1
|
|
8010708: 4652 mov r2, sl
|
|
801070a: 4649 mov r1, r9
|
|
801070c: 4638 mov r0, r7
|
|
801070e: 47c0 blx r8
|
|
8010710: 3001 adds r0, #1
|
|
8010712: d103 bne.n 801071c <_printf_common+0xac>
|
|
8010714: f04f 30ff mov.w r0, #4294967295
|
|
8010718: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
|
|
801071c: 3501 adds r5, #1
|
|
801071e: e7c6 b.n 80106ae <_printf_common+0x3e>
|
|
8010720: 18e1 adds r1, r4, r3
|
|
8010722: 1c5a adds r2, r3, #1
|
|
8010724: 2030 movs r0, #48 ; 0x30
|
|
8010726: f881 0043 strb.w r0, [r1, #67] ; 0x43
|
|
801072a: 4422 add r2, r4
|
|
801072c: f894 1045 ldrb.w r1, [r4, #69] ; 0x45
|
|
8010730: f882 1043 strb.w r1, [r2, #67] ; 0x43
|
|
8010734: 3302 adds r3, #2
|
|
8010736: e7c7 b.n 80106c8 <_printf_common+0x58>
|
|
8010738: 2301 movs r3, #1
|
|
801073a: 4622 mov r2, r4
|
|
801073c: 4649 mov r1, r9
|
|
801073e: 4638 mov r0, r7
|
|
8010740: 47c0 blx r8
|
|
8010742: 3001 adds r0, #1
|
|
8010744: d0e6 beq.n 8010714 <_printf_common+0xa4>
|
|
8010746: 3601 adds r6, #1
|
|
8010748: e7d9 b.n 80106fe <_printf_common+0x8e>
|
|
...
|
|
|
|
0801074c <_printf_i>:
|
|
801074c: e92d 47ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr}
|
|
8010750: 7e0f ldrb r7, [r1, #24]
|
|
8010752: 9d0c ldr r5, [sp, #48] ; 0x30
|
|
8010754: 2f78 cmp r7, #120 ; 0x78
|
|
8010756: 4691 mov r9, r2
|
|
8010758: 4680 mov r8, r0
|
|
801075a: 460c mov r4, r1
|
|
801075c: 469a mov sl, r3
|
|
801075e: f101 0243 add.w r2, r1, #67 ; 0x43
|
|
8010762: d807 bhi.n 8010774 <_printf_i+0x28>
|
|
8010764: 2f62 cmp r7, #98 ; 0x62
|
|
8010766: d80a bhi.n 801077e <_printf_i+0x32>
|
|
8010768: 2f00 cmp r7, #0
|
|
801076a: f000 80d4 beq.w 8010916 <_printf_i+0x1ca>
|
|
801076e: 2f58 cmp r7, #88 ; 0x58
|
|
8010770: f000 80c0 beq.w 80108f4 <_printf_i+0x1a8>
|
|
8010774: f104 0542 add.w r5, r4, #66 ; 0x42
|
|
8010778: f884 7042 strb.w r7, [r4, #66] ; 0x42
|
|
801077c: e03a b.n 80107f4 <_printf_i+0xa8>
|
|
801077e: f1a7 0363 sub.w r3, r7, #99 ; 0x63
|
|
8010782: 2b15 cmp r3, #21
|
|
8010784: d8f6 bhi.n 8010774 <_printf_i+0x28>
|
|
8010786: a101 add r1, pc, #4 ; (adr r1, 801078c <_printf_i+0x40>)
|
|
8010788: f851 f023 ldr.w pc, [r1, r3, lsl #2]
|
|
801078c: 080107e5 .word 0x080107e5
|
|
8010790: 080107f9 .word 0x080107f9
|
|
8010794: 08010775 .word 0x08010775
|
|
8010798: 08010775 .word 0x08010775
|
|
801079c: 08010775 .word 0x08010775
|
|
80107a0: 08010775 .word 0x08010775
|
|
80107a4: 080107f9 .word 0x080107f9
|
|
80107a8: 08010775 .word 0x08010775
|
|
80107ac: 08010775 .word 0x08010775
|
|
80107b0: 08010775 .word 0x08010775
|
|
80107b4: 08010775 .word 0x08010775
|
|
80107b8: 080108fd .word 0x080108fd
|
|
80107bc: 08010825 .word 0x08010825
|
|
80107c0: 080108b7 .word 0x080108b7
|
|
80107c4: 08010775 .word 0x08010775
|
|
80107c8: 08010775 .word 0x08010775
|
|
80107cc: 0801091f .word 0x0801091f
|
|
80107d0: 08010775 .word 0x08010775
|
|
80107d4: 08010825 .word 0x08010825
|
|
80107d8: 08010775 .word 0x08010775
|
|
80107dc: 08010775 .word 0x08010775
|
|
80107e0: 080108bf .word 0x080108bf
|
|
80107e4: 682b ldr r3, [r5, #0]
|
|
80107e6: 1d1a adds r2, r3, #4
|
|
80107e8: 681b ldr r3, [r3, #0]
|
|
80107ea: 602a str r2, [r5, #0]
|
|
80107ec: f104 0542 add.w r5, r4, #66 ; 0x42
|
|
80107f0: f884 3042 strb.w r3, [r4, #66] ; 0x42
|
|
80107f4: 2301 movs r3, #1
|
|
80107f6: e09f b.n 8010938 <_printf_i+0x1ec>
|
|
80107f8: 6820 ldr r0, [r4, #0]
|
|
80107fa: 682b ldr r3, [r5, #0]
|
|
80107fc: 0607 lsls r7, r0, #24
|
|
80107fe: f103 0104 add.w r1, r3, #4
|
|
8010802: 6029 str r1, [r5, #0]
|
|
8010804: d501 bpl.n 801080a <_printf_i+0xbe>
|
|
8010806: 681e ldr r6, [r3, #0]
|
|
8010808: e003 b.n 8010812 <_printf_i+0xc6>
|
|
801080a: 0646 lsls r6, r0, #25
|
|
801080c: d5fb bpl.n 8010806 <_printf_i+0xba>
|
|
801080e: f9b3 6000 ldrsh.w r6, [r3]
|
|
8010812: 2e00 cmp r6, #0
|
|
8010814: da03 bge.n 801081e <_printf_i+0xd2>
|
|
8010816: 232d movs r3, #45 ; 0x2d
|
|
8010818: 4276 negs r6, r6
|
|
801081a: f884 3043 strb.w r3, [r4, #67] ; 0x43
|
|
801081e: 485a ldr r0, [pc, #360] ; (8010988 <_printf_i+0x23c>)
|
|
8010820: 230a movs r3, #10
|
|
8010822: e012 b.n 801084a <_printf_i+0xfe>
|
|
8010824: 682b ldr r3, [r5, #0]
|
|
8010826: 6820 ldr r0, [r4, #0]
|
|
8010828: 1d19 adds r1, r3, #4
|
|
801082a: 6029 str r1, [r5, #0]
|
|
801082c: 0605 lsls r5, r0, #24
|
|
801082e: d501 bpl.n 8010834 <_printf_i+0xe8>
|
|
8010830: 681e ldr r6, [r3, #0]
|
|
8010832: e002 b.n 801083a <_printf_i+0xee>
|
|
8010834: 0641 lsls r1, r0, #25
|
|
8010836: d5fb bpl.n 8010830 <_printf_i+0xe4>
|
|
8010838: 881e ldrh r6, [r3, #0]
|
|
801083a: 4853 ldr r0, [pc, #332] ; (8010988 <_printf_i+0x23c>)
|
|
801083c: 2f6f cmp r7, #111 ; 0x6f
|
|
801083e: bf0c ite eq
|
|
8010840: 2308 moveq r3, #8
|
|
8010842: 230a movne r3, #10
|
|
8010844: 2100 movs r1, #0
|
|
8010846: f884 1043 strb.w r1, [r4, #67] ; 0x43
|
|
801084a: 6865 ldr r5, [r4, #4]
|
|
801084c: 60a5 str r5, [r4, #8]
|
|
801084e: 2d00 cmp r5, #0
|
|
8010850: bfa2 ittt ge
|
|
8010852: 6821 ldrge r1, [r4, #0]
|
|
8010854: f021 0104 bicge.w r1, r1, #4
|
|
8010858: 6021 strge r1, [r4, #0]
|
|
801085a: b90e cbnz r6, 8010860 <_printf_i+0x114>
|
|
801085c: 2d00 cmp r5, #0
|
|
801085e: d04b beq.n 80108f8 <_printf_i+0x1ac>
|
|
8010860: 4615 mov r5, r2
|
|
8010862: fbb6 f1f3 udiv r1, r6, r3
|
|
8010866: fb03 6711 mls r7, r3, r1, r6
|
|
801086a: 5dc7 ldrb r7, [r0, r7]
|
|
801086c: f805 7d01 strb.w r7, [r5, #-1]!
|
|
8010870: 4637 mov r7, r6
|
|
8010872: 42bb cmp r3, r7
|
|
8010874: 460e mov r6, r1
|
|
8010876: d9f4 bls.n 8010862 <_printf_i+0x116>
|
|
8010878: 2b08 cmp r3, #8
|
|
801087a: d10b bne.n 8010894 <_printf_i+0x148>
|
|
801087c: 6823 ldr r3, [r4, #0]
|
|
801087e: 07de lsls r6, r3, #31
|
|
8010880: d508 bpl.n 8010894 <_printf_i+0x148>
|
|
8010882: 6923 ldr r3, [r4, #16]
|
|
8010884: 6861 ldr r1, [r4, #4]
|
|
8010886: 4299 cmp r1, r3
|
|
8010888: bfde ittt le
|
|
801088a: 2330 movle r3, #48 ; 0x30
|
|
801088c: f805 3c01 strble.w r3, [r5, #-1]
|
|
8010890: f105 35ff addle.w r5, r5, #4294967295
|
|
8010894: 1b52 subs r2, r2, r5
|
|
8010896: 6122 str r2, [r4, #16]
|
|
8010898: f8cd a000 str.w sl, [sp]
|
|
801089c: 464b mov r3, r9
|
|
801089e: aa03 add r2, sp, #12
|
|
80108a0: 4621 mov r1, r4
|
|
80108a2: 4640 mov r0, r8
|
|
80108a4: f7ff fee4 bl 8010670 <_printf_common>
|
|
80108a8: 3001 adds r0, #1
|
|
80108aa: d14a bne.n 8010942 <_printf_i+0x1f6>
|
|
80108ac: f04f 30ff mov.w r0, #4294967295
|
|
80108b0: b004 add sp, #16
|
|
80108b2: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
|
|
80108b6: 6823 ldr r3, [r4, #0]
|
|
80108b8: f043 0320 orr.w r3, r3, #32
|
|
80108bc: 6023 str r3, [r4, #0]
|
|
80108be: 4833 ldr r0, [pc, #204] ; (801098c <_printf_i+0x240>)
|
|
80108c0: 2778 movs r7, #120 ; 0x78
|
|
80108c2: f884 7045 strb.w r7, [r4, #69] ; 0x45
|
|
80108c6: 6823 ldr r3, [r4, #0]
|
|
80108c8: 6829 ldr r1, [r5, #0]
|
|
80108ca: 061f lsls r7, r3, #24
|
|
80108cc: f851 6b04 ldr.w r6, [r1], #4
|
|
80108d0: d402 bmi.n 80108d8 <_printf_i+0x18c>
|
|
80108d2: 065f lsls r7, r3, #25
|
|
80108d4: bf48 it mi
|
|
80108d6: b2b6 uxthmi r6, r6
|
|
80108d8: 07df lsls r7, r3, #31
|
|
80108da: bf48 it mi
|
|
80108dc: f043 0320 orrmi.w r3, r3, #32
|
|
80108e0: 6029 str r1, [r5, #0]
|
|
80108e2: bf48 it mi
|
|
80108e4: 6023 strmi r3, [r4, #0]
|
|
80108e6: b91e cbnz r6, 80108f0 <_printf_i+0x1a4>
|
|
80108e8: 6823 ldr r3, [r4, #0]
|
|
80108ea: f023 0320 bic.w r3, r3, #32
|
|
80108ee: 6023 str r3, [r4, #0]
|
|
80108f0: 2310 movs r3, #16
|
|
80108f2: e7a7 b.n 8010844 <_printf_i+0xf8>
|
|
80108f4: 4824 ldr r0, [pc, #144] ; (8010988 <_printf_i+0x23c>)
|
|
80108f6: e7e4 b.n 80108c2 <_printf_i+0x176>
|
|
80108f8: 4615 mov r5, r2
|
|
80108fa: e7bd b.n 8010878 <_printf_i+0x12c>
|
|
80108fc: 682b ldr r3, [r5, #0]
|
|
80108fe: 6826 ldr r6, [r4, #0]
|
|
8010900: 6961 ldr r1, [r4, #20]
|
|
8010902: 1d18 adds r0, r3, #4
|
|
8010904: 6028 str r0, [r5, #0]
|
|
8010906: 0635 lsls r5, r6, #24
|
|
8010908: 681b ldr r3, [r3, #0]
|
|
801090a: d501 bpl.n 8010910 <_printf_i+0x1c4>
|
|
801090c: 6019 str r1, [r3, #0]
|
|
801090e: e002 b.n 8010916 <_printf_i+0x1ca>
|
|
8010910: 0670 lsls r0, r6, #25
|
|
8010912: d5fb bpl.n 801090c <_printf_i+0x1c0>
|
|
8010914: 8019 strh r1, [r3, #0]
|
|
8010916: 2300 movs r3, #0
|
|
8010918: 6123 str r3, [r4, #16]
|
|
801091a: 4615 mov r5, r2
|
|
801091c: e7bc b.n 8010898 <_printf_i+0x14c>
|
|
801091e: 682b ldr r3, [r5, #0]
|
|
8010920: 1d1a adds r2, r3, #4
|
|
8010922: 602a str r2, [r5, #0]
|
|
8010924: 681d ldr r5, [r3, #0]
|
|
8010926: 6862 ldr r2, [r4, #4]
|
|
8010928: 2100 movs r1, #0
|
|
801092a: 4628 mov r0, r5
|
|
801092c: f7ef fcf0 bl 8000310 <memchr>
|
|
8010930: b108 cbz r0, 8010936 <_printf_i+0x1ea>
|
|
8010932: 1b40 subs r0, r0, r5
|
|
8010934: 6060 str r0, [r4, #4]
|
|
8010936: 6863 ldr r3, [r4, #4]
|
|
8010938: 6123 str r3, [r4, #16]
|
|
801093a: 2300 movs r3, #0
|
|
801093c: f884 3043 strb.w r3, [r4, #67] ; 0x43
|
|
8010940: e7aa b.n 8010898 <_printf_i+0x14c>
|
|
8010942: 6923 ldr r3, [r4, #16]
|
|
8010944: 462a mov r2, r5
|
|
8010946: 4649 mov r1, r9
|
|
8010948: 4640 mov r0, r8
|
|
801094a: 47d0 blx sl
|
|
801094c: 3001 adds r0, #1
|
|
801094e: d0ad beq.n 80108ac <_printf_i+0x160>
|
|
8010950: 6823 ldr r3, [r4, #0]
|
|
8010952: 079b lsls r3, r3, #30
|
|
8010954: d413 bmi.n 801097e <_printf_i+0x232>
|
|
8010956: 68e0 ldr r0, [r4, #12]
|
|
8010958: 9b03 ldr r3, [sp, #12]
|
|
801095a: 4298 cmp r0, r3
|
|
801095c: bfb8 it lt
|
|
801095e: 4618 movlt r0, r3
|
|
8010960: e7a6 b.n 80108b0 <_printf_i+0x164>
|
|
8010962: 2301 movs r3, #1
|
|
8010964: 4632 mov r2, r6
|
|
8010966: 4649 mov r1, r9
|
|
8010968: 4640 mov r0, r8
|
|
801096a: 47d0 blx sl
|
|
801096c: 3001 adds r0, #1
|
|
801096e: d09d beq.n 80108ac <_printf_i+0x160>
|
|
8010970: 3501 adds r5, #1
|
|
8010972: 68e3 ldr r3, [r4, #12]
|
|
8010974: 9903 ldr r1, [sp, #12]
|
|
8010976: 1a5b subs r3, r3, r1
|
|
8010978: 42ab cmp r3, r5
|
|
801097a: dcf2 bgt.n 8010962 <_printf_i+0x216>
|
|
801097c: e7eb b.n 8010956 <_printf_i+0x20a>
|
|
801097e: 2500 movs r5, #0
|
|
8010980: f104 0619 add.w r6, r4, #25
|
|
8010984: e7f5 b.n 8010972 <_printf_i+0x226>
|
|
8010986: bf00 nop
|
|
8010988: 08014f27 .word 0x08014f27
|
|
801098c: 08014f38 .word 0x08014f38
|
|
|
|
08010990 <std>:
|
|
8010990: 2300 movs r3, #0
|
|
8010992: b510 push {r4, lr}
|
|
8010994: 4604 mov r4, r0
|
|
8010996: e9c0 3300 strd r3, r3, [r0]
|
|
801099a: e9c0 3304 strd r3, r3, [r0, #16]
|
|
801099e: 6083 str r3, [r0, #8]
|
|
80109a0: 8181 strh r1, [r0, #12]
|
|
80109a2: 6643 str r3, [r0, #100] ; 0x64
|
|
80109a4: 81c2 strh r2, [r0, #14]
|
|
80109a6: 6183 str r3, [r0, #24]
|
|
80109a8: 4619 mov r1, r3
|
|
80109aa: 2208 movs r2, #8
|
|
80109ac: 305c adds r0, #92 ; 0x5c
|
|
80109ae: f000 fa69 bl 8010e84 <memset>
|
|
80109b2: 4b0d ldr r3, [pc, #52] ; (80109e8 <std+0x58>)
|
|
80109b4: 6263 str r3, [r4, #36] ; 0x24
|
|
80109b6: 4b0d ldr r3, [pc, #52] ; (80109ec <std+0x5c>)
|
|
80109b8: 62a3 str r3, [r4, #40] ; 0x28
|
|
80109ba: 4b0d ldr r3, [pc, #52] ; (80109f0 <std+0x60>)
|
|
80109bc: 62e3 str r3, [r4, #44] ; 0x2c
|
|
80109be: 4b0d ldr r3, [pc, #52] ; (80109f4 <std+0x64>)
|
|
80109c0: 6323 str r3, [r4, #48] ; 0x30
|
|
80109c2: 4b0d ldr r3, [pc, #52] ; (80109f8 <std+0x68>)
|
|
80109c4: 6224 str r4, [r4, #32]
|
|
80109c6: 429c cmp r4, r3
|
|
80109c8: d006 beq.n 80109d8 <std+0x48>
|
|
80109ca: f103 0268 add.w r2, r3, #104 ; 0x68
|
|
80109ce: 4294 cmp r4, r2
|
|
80109d0: d002 beq.n 80109d8 <std+0x48>
|
|
80109d2: 33d0 adds r3, #208 ; 0xd0
|
|
80109d4: 429c cmp r4, r3
|
|
80109d6: d105 bne.n 80109e4 <std+0x54>
|
|
80109d8: f104 0058 add.w r0, r4, #88 ; 0x58
|
|
80109dc: e8bd 4010 ldmia.w sp!, {r4, lr}
|
|
80109e0: f000 bad0 b.w 8010f84 <__retarget_lock_init_recursive>
|
|
80109e4: bd10 pop {r4, pc}
|
|
80109e6: bf00 nop
|
|
80109e8: 08010cb5 .word 0x08010cb5
|
|
80109ec: 08010cd7 .word 0x08010cd7
|
|
80109f0: 08010d0f .word 0x08010d0f
|
|
80109f4: 08010d33 .word 0x08010d33
|
|
80109f8: 24007ccc .word 0x24007ccc
|
|
|
|
080109fc <stdio_exit_handler>:
|
|
80109fc: 4a02 ldr r2, [pc, #8] ; (8010a08 <stdio_exit_handler+0xc>)
|
|
80109fe: 4903 ldr r1, [pc, #12] ; (8010a0c <stdio_exit_handler+0x10>)
|
|
8010a00: 4803 ldr r0, [pc, #12] ; (8010a10 <stdio_exit_handler+0x14>)
|
|
8010a02: f000 b869 b.w 8010ad8 <_fwalk_sglue>
|
|
8010a06: bf00 nop
|
|
8010a08: 24000074 .word 0x24000074
|
|
8010a0c: 080112f1 .word 0x080112f1
|
|
8010a10: 24000080 .word 0x24000080
|
|
|
|
08010a14 <cleanup_stdio>:
|
|
8010a14: 6841 ldr r1, [r0, #4]
|
|
8010a16: 4b0c ldr r3, [pc, #48] ; (8010a48 <cleanup_stdio+0x34>)
|
|
8010a18: 4299 cmp r1, r3
|
|
8010a1a: b510 push {r4, lr}
|
|
8010a1c: 4604 mov r4, r0
|
|
8010a1e: d001 beq.n 8010a24 <cleanup_stdio+0x10>
|
|
8010a20: f000 fc66 bl 80112f0 <_fflush_r>
|
|
8010a24: 68a1 ldr r1, [r4, #8]
|
|
8010a26: 4b09 ldr r3, [pc, #36] ; (8010a4c <cleanup_stdio+0x38>)
|
|
8010a28: 4299 cmp r1, r3
|
|
8010a2a: d002 beq.n 8010a32 <cleanup_stdio+0x1e>
|
|
8010a2c: 4620 mov r0, r4
|
|
8010a2e: f000 fc5f bl 80112f0 <_fflush_r>
|
|
8010a32: 68e1 ldr r1, [r4, #12]
|
|
8010a34: 4b06 ldr r3, [pc, #24] ; (8010a50 <cleanup_stdio+0x3c>)
|
|
8010a36: 4299 cmp r1, r3
|
|
8010a38: d004 beq.n 8010a44 <cleanup_stdio+0x30>
|
|
8010a3a: 4620 mov r0, r4
|
|
8010a3c: e8bd 4010 ldmia.w sp!, {r4, lr}
|
|
8010a40: f000 bc56 b.w 80112f0 <_fflush_r>
|
|
8010a44: bd10 pop {r4, pc}
|
|
8010a46: bf00 nop
|
|
8010a48: 24007ccc .word 0x24007ccc
|
|
8010a4c: 24007d34 .word 0x24007d34
|
|
8010a50: 24007d9c .word 0x24007d9c
|
|
|
|
08010a54 <global_stdio_init.part.0>:
|
|
8010a54: b510 push {r4, lr}
|
|
8010a56: 4b0b ldr r3, [pc, #44] ; (8010a84 <global_stdio_init.part.0+0x30>)
|
|
8010a58: 4c0b ldr r4, [pc, #44] ; (8010a88 <global_stdio_init.part.0+0x34>)
|
|
8010a5a: 4a0c ldr r2, [pc, #48] ; (8010a8c <global_stdio_init.part.0+0x38>)
|
|
8010a5c: 601a str r2, [r3, #0]
|
|
8010a5e: 4620 mov r0, r4
|
|
8010a60: 2200 movs r2, #0
|
|
8010a62: 2104 movs r1, #4
|
|
8010a64: f7ff ff94 bl 8010990 <std>
|
|
8010a68: f104 0068 add.w r0, r4, #104 ; 0x68
|
|
8010a6c: 2201 movs r2, #1
|
|
8010a6e: 2109 movs r1, #9
|
|
8010a70: f7ff ff8e bl 8010990 <std>
|
|
8010a74: f104 00d0 add.w r0, r4, #208 ; 0xd0
|
|
8010a78: 2202 movs r2, #2
|
|
8010a7a: e8bd 4010 ldmia.w sp!, {r4, lr}
|
|
8010a7e: 2112 movs r1, #18
|
|
8010a80: f7ff bf86 b.w 8010990 <std>
|
|
8010a84: 24007e04 .word 0x24007e04
|
|
8010a88: 24007ccc .word 0x24007ccc
|
|
8010a8c: 080109fd .word 0x080109fd
|
|
|
|
08010a90 <__sfp_lock_acquire>:
|
|
8010a90: 4801 ldr r0, [pc, #4] ; (8010a98 <__sfp_lock_acquire+0x8>)
|
|
8010a92: f000 ba78 b.w 8010f86 <__retarget_lock_acquire_recursive>
|
|
8010a96: bf00 nop
|
|
8010a98: 24007e0d .word 0x24007e0d
|
|
|
|
08010a9c <__sfp_lock_release>:
|
|
8010a9c: 4801 ldr r0, [pc, #4] ; (8010aa4 <__sfp_lock_release+0x8>)
|
|
8010a9e: f000 ba73 b.w 8010f88 <__retarget_lock_release_recursive>
|
|
8010aa2: bf00 nop
|
|
8010aa4: 24007e0d .word 0x24007e0d
|
|
|
|
08010aa8 <__sinit>:
|
|
8010aa8: b510 push {r4, lr}
|
|
8010aaa: 4604 mov r4, r0
|
|
8010aac: f7ff fff0 bl 8010a90 <__sfp_lock_acquire>
|
|
8010ab0: 6a23 ldr r3, [r4, #32]
|
|
8010ab2: b11b cbz r3, 8010abc <__sinit+0x14>
|
|
8010ab4: e8bd 4010 ldmia.w sp!, {r4, lr}
|
|
8010ab8: f7ff bff0 b.w 8010a9c <__sfp_lock_release>
|
|
8010abc: 4b04 ldr r3, [pc, #16] ; (8010ad0 <__sinit+0x28>)
|
|
8010abe: 6223 str r3, [r4, #32]
|
|
8010ac0: 4b04 ldr r3, [pc, #16] ; (8010ad4 <__sinit+0x2c>)
|
|
8010ac2: 681b ldr r3, [r3, #0]
|
|
8010ac4: 2b00 cmp r3, #0
|
|
8010ac6: d1f5 bne.n 8010ab4 <__sinit+0xc>
|
|
8010ac8: f7ff ffc4 bl 8010a54 <global_stdio_init.part.0>
|
|
8010acc: e7f2 b.n 8010ab4 <__sinit+0xc>
|
|
8010ace: bf00 nop
|
|
8010ad0: 08010a15 .word 0x08010a15
|
|
8010ad4: 24007e04 .word 0x24007e04
|
|
|
|
08010ad8 <_fwalk_sglue>:
|
|
8010ad8: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
|
|
8010adc: 4607 mov r7, r0
|
|
8010ade: 4688 mov r8, r1
|
|
8010ae0: 4614 mov r4, r2
|
|
8010ae2: 2600 movs r6, #0
|
|
8010ae4: e9d4 9501 ldrd r9, r5, [r4, #4]
|
|
8010ae8: f1b9 0901 subs.w r9, r9, #1
|
|
8010aec: d505 bpl.n 8010afa <_fwalk_sglue+0x22>
|
|
8010aee: 6824 ldr r4, [r4, #0]
|
|
8010af0: 2c00 cmp r4, #0
|
|
8010af2: d1f7 bne.n 8010ae4 <_fwalk_sglue+0xc>
|
|
8010af4: 4630 mov r0, r6
|
|
8010af6: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
|
|
8010afa: 89ab ldrh r3, [r5, #12]
|
|
8010afc: 2b01 cmp r3, #1
|
|
8010afe: d907 bls.n 8010b10 <_fwalk_sglue+0x38>
|
|
8010b00: f9b5 300e ldrsh.w r3, [r5, #14]
|
|
8010b04: 3301 adds r3, #1
|
|
8010b06: d003 beq.n 8010b10 <_fwalk_sglue+0x38>
|
|
8010b08: 4629 mov r1, r5
|
|
8010b0a: 4638 mov r0, r7
|
|
8010b0c: 47c0 blx r8
|
|
8010b0e: 4306 orrs r6, r0
|
|
8010b10: 3568 adds r5, #104 ; 0x68
|
|
8010b12: e7e9 b.n 8010ae8 <_fwalk_sglue+0x10>
|
|
|
|
08010b14 <_fwrite_r>:
|
|
8010b14: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
|
|
8010b18: 9c08 ldr r4, [sp, #32]
|
|
8010b1a: 468a mov sl, r1
|
|
8010b1c: 4690 mov r8, r2
|
|
8010b1e: fb02 f903 mul.w r9, r2, r3
|
|
8010b22: 4606 mov r6, r0
|
|
8010b24: b118 cbz r0, 8010b2e <_fwrite_r+0x1a>
|
|
8010b26: 6a03 ldr r3, [r0, #32]
|
|
8010b28: b90b cbnz r3, 8010b2e <_fwrite_r+0x1a>
|
|
8010b2a: f7ff ffbd bl 8010aa8 <__sinit>
|
|
8010b2e: 6e63 ldr r3, [r4, #100] ; 0x64
|
|
8010b30: 07dd lsls r5, r3, #31
|
|
8010b32: d405 bmi.n 8010b40 <_fwrite_r+0x2c>
|
|
8010b34: 89a3 ldrh r3, [r4, #12]
|
|
8010b36: 0598 lsls r0, r3, #22
|
|
8010b38: d402 bmi.n 8010b40 <_fwrite_r+0x2c>
|
|
8010b3a: 6da0 ldr r0, [r4, #88] ; 0x58
|
|
8010b3c: f000 fa23 bl 8010f86 <__retarget_lock_acquire_recursive>
|
|
8010b40: 89a3 ldrh r3, [r4, #12]
|
|
8010b42: 0719 lsls r1, r3, #28
|
|
8010b44: d516 bpl.n 8010b74 <_fwrite_r+0x60>
|
|
8010b46: 6923 ldr r3, [r4, #16]
|
|
8010b48: b1a3 cbz r3, 8010b74 <_fwrite_r+0x60>
|
|
8010b4a: 2500 movs r5, #0
|
|
8010b4c: 454d cmp r5, r9
|
|
8010b4e: d01f beq.n 8010b90 <_fwrite_r+0x7c>
|
|
8010b50: 68a7 ldr r7, [r4, #8]
|
|
8010b52: f81a 1005 ldrb.w r1, [sl, r5]
|
|
8010b56: 3f01 subs r7, #1
|
|
8010b58: 2f00 cmp r7, #0
|
|
8010b5a: 60a7 str r7, [r4, #8]
|
|
8010b5c: da04 bge.n 8010b68 <_fwrite_r+0x54>
|
|
8010b5e: 69a3 ldr r3, [r4, #24]
|
|
8010b60: 429f cmp r7, r3
|
|
8010b62: db0f blt.n 8010b84 <_fwrite_r+0x70>
|
|
8010b64: 290a cmp r1, #10
|
|
8010b66: d00d beq.n 8010b84 <_fwrite_r+0x70>
|
|
8010b68: 6823 ldr r3, [r4, #0]
|
|
8010b6a: 1c5a adds r2, r3, #1
|
|
8010b6c: 6022 str r2, [r4, #0]
|
|
8010b6e: 7019 strb r1, [r3, #0]
|
|
8010b70: 3501 adds r5, #1
|
|
8010b72: e7eb b.n 8010b4c <_fwrite_r+0x38>
|
|
8010b74: 4621 mov r1, r4
|
|
8010b76: 4630 mov r0, r6
|
|
8010b78: f000 f91c bl 8010db4 <__swsetup_r>
|
|
8010b7c: 2800 cmp r0, #0
|
|
8010b7e: d0e4 beq.n 8010b4a <_fwrite_r+0x36>
|
|
8010b80: 2500 movs r5, #0
|
|
8010b82: e005 b.n 8010b90 <_fwrite_r+0x7c>
|
|
8010b84: 4622 mov r2, r4
|
|
8010b86: 4630 mov r0, r6
|
|
8010b88: f000 f8d7 bl 8010d3a <__swbuf_r>
|
|
8010b8c: 3001 adds r0, #1
|
|
8010b8e: d1ef bne.n 8010b70 <_fwrite_r+0x5c>
|
|
8010b90: 6e63 ldr r3, [r4, #100] ; 0x64
|
|
8010b92: 07da lsls r2, r3, #31
|
|
8010b94: d405 bmi.n 8010ba2 <_fwrite_r+0x8e>
|
|
8010b96: 89a3 ldrh r3, [r4, #12]
|
|
8010b98: 059b lsls r3, r3, #22
|
|
8010b9a: d402 bmi.n 8010ba2 <_fwrite_r+0x8e>
|
|
8010b9c: 6da0 ldr r0, [r4, #88] ; 0x58
|
|
8010b9e: f000 f9f3 bl 8010f88 <__retarget_lock_release_recursive>
|
|
8010ba2: fbb5 f0f8 udiv r0, r5, r8
|
|
8010ba6: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
|
|
...
|
|
|
|
08010bac <fwrite>:
|
|
8010bac: b507 push {r0, r1, r2, lr}
|
|
8010bae: 9300 str r3, [sp, #0]
|
|
8010bb0: 4613 mov r3, r2
|
|
8010bb2: 460a mov r2, r1
|
|
8010bb4: 4601 mov r1, r0
|
|
8010bb6: 4803 ldr r0, [pc, #12] ; (8010bc4 <fwrite+0x18>)
|
|
8010bb8: 6800 ldr r0, [r0, #0]
|
|
8010bba: f7ff ffab bl 8010b14 <_fwrite_r>
|
|
8010bbe: b003 add sp, #12
|
|
8010bc0: f85d fb04 ldr.w pc, [sp], #4
|
|
8010bc4: 240000cc .word 0x240000cc
|
|
|
|
08010bc8 <iprintf>:
|
|
8010bc8: b40f push {r0, r1, r2, r3}
|
|
8010bca: b507 push {r0, r1, r2, lr}
|
|
8010bcc: 4906 ldr r1, [pc, #24] ; (8010be8 <iprintf+0x20>)
|
|
8010bce: ab04 add r3, sp, #16
|
|
8010bd0: 6808 ldr r0, [r1, #0]
|
|
8010bd2: f853 2b04 ldr.w r2, [r3], #4
|
|
8010bd6: 6881 ldr r1, [r0, #8]
|
|
8010bd8: 9301 str r3, [sp, #4]
|
|
8010bda: f7ff fc25 bl 8010428 <_vfiprintf_r>
|
|
8010bde: b003 add sp, #12
|
|
8010be0: f85d eb04 ldr.w lr, [sp], #4
|
|
8010be4: b004 add sp, #16
|
|
8010be6: 4770 bx lr
|
|
8010be8: 240000cc .word 0x240000cc
|
|
|
|
08010bec <putchar>:
|
|
8010bec: 4b02 ldr r3, [pc, #8] ; (8010bf8 <putchar+0xc>)
|
|
8010bee: 4601 mov r1, r0
|
|
8010bf0: 6818 ldr r0, [r3, #0]
|
|
8010bf2: 6882 ldr r2, [r0, #8]
|
|
8010bf4: f000 bc18 b.w 8011428 <_putc_r>
|
|
8010bf8: 240000cc .word 0x240000cc
|
|
|
|
08010bfc <_puts_r>:
|
|
8010bfc: 6a03 ldr r3, [r0, #32]
|
|
8010bfe: b570 push {r4, r5, r6, lr}
|
|
8010c00: 6884 ldr r4, [r0, #8]
|
|
8010c02: 4605 mov r5, r0
|
|
8010c04: 460e mov r6, r1
|
|
8010c06: b90b cbnz r3, 8010c0c <_puts_r+0x10>
|
|
8010c08: f7ff ff4e bl 8010aa8 <__sinit>
|
|
8010c0c: 6e63 ldr r3, [r4, #100] ; 0x64
|
|
8010c0e: 07db lsls r3, r3, #31
|
|
8010c10: d405 bmi.n 8010c1e <_puts_r+0x22>
|
|
8010c12: 89a3 ldrh r3, [r4, #12]
|
|
8010c14: 0598 lsls r0, r3, #22
|
|
8010c16: d402 bmi.n 8010c1e <_puts_r+0x22>
|
|
8010c18: 6da0 ldr r0, [r4, #88] ; 0x58
|
|
8010c1a: f000 f9b4 bl 8010f86 <__retarget_lock_acquire_recursive>
|
|
8010c1e: 89a3 ldrh r3, [r4, #12]
|
|
8010c20: 0719 lsls r1, r3, #28
|
|
8010c22: d513 bpl.n 8010c4c <_puts_r+0x50>
|
|
8010c24: 6923 ldr r3, [r4, #16]
|
|
8010c26: b18b cbz r3, 8010c4c <_puts_r+0x50>
|
|
8010c28: 3e01 subs r6, #1
|
|
8010c2a: 68a3 ldr r3, [r4, #8]
|
|
8010c2c: f816 1f01 ldrb.w r1, [r6, #1]!
|
|
8010c30: 3b01 subs r3, #1
|
|
8010c32: 60a3 str r3, [r4, #8]
|
|
8010c34: b9e9 cbnz r1, 8010c72 <_puts_r+0x76>
|
|
8010c36: 2b00 cmp r3, #0
|
|
8010c38: da2e bge.n 8010c98 <_puts_r+0x9c>
|
|
8010c3a: 4622 mov r2, r4
|
|
8010c3c: 210a movs r1, #10
|
|
8010c3e: 4628 mov r0, r5
|
|
8010c40: f000 f87b bl 8010d3a <__swbuf_r>
|
|
8010c44: 3001 adds r0, #1
|
|
8010c46: d007 beq.n 8010c58 <_puts_r+0x5c>
|
|
8010c48: 250a movs r5, #10
|
|
8010c4a: e007 b.n 8010c5c <_puts_r+0x60>
|
|
8010c4c: 4621 mov r1, r4
|
|
8010c4e: 4628 mov r0, r5
|
|
8010c50: f000 f8b0 bl 8010db4 <__swsetup_r>
|
|
8010c54: 2800 cmp r0, #0
|
|
8010c56: d0e7 beq.n 8010c28 <_puts_r+0x2c>
|
|
8010c58: f04f 35ff mov.w r5, #4294967295
|
|
8010c5c: 6e63 ldr r3, [r4, #100] ; 0x64
|
|
8010c5e: 07da lsls r2, r3, #31
|
|
8010c60: d405 bmi.n 8010c6e <_puts_r+0x72>
|
|
8010c62: 89a3 ldrh r3, [r4, #12]
|
|
8010c64: 059b lsls r3, r3, #22
|
|
8010c66: d402 bmi.n 8010c6e <_puts_r+0x72>
|
|
8010c68: 6da0 ldr r0, [r4, #88] ; 0x58
|
|
8010c6a: f000 f98d bl 8010f88 <__retarget_lock_release_recursive>
|
|
8010c6e: 4628 mov r0, r5
|
|
8010c70: bd70 pop {r4, r5, r6, pc}
|
|
8010c72: 2b00 cmp r3, #0
|
|
8010c74: da04 bge.n 8010c80 <_puts_r+0x84>
|
|
8010c76: 69a2 ldr r2, [r4, #24]
|
|
8010c78: 429a cmp r2, r3
|
|
8010c7a: dc06 bgt.n 8010c8a <_puts_r+0x8e>
|
|
8010c7c: 290a cmp r1, #10
|
|
8010c7e: d004 beq.n 8010c8a <_puts_r+0x8e>
|
|
8010c80: 6823 ldr r3, [r4, #0]
|
|
8010c82: 1c5a adds r2, r3, #1
|
|
8010c84: 6022 str r2, [r4, #0]
|
|
8010c86: 7019 strb r1, [r3, #0]
|
|
8010c88: e7cf b.n 8010c2a <_puts_r+0x2e>
|
|
8010c8a: 4622 mov r2, r4
|
|
8010c8c: 4628 mov r0, r5
|
|
8010c8e: f000 f854 bl 8010d3a <__swbuf_r>
|
|
8010c92: 3001 adds r0, #1
|
|
8010c94: d1c9 bne.n 8010c2a <_puts_r+0x2e>
|
|
8010c96: e7df b.n 8010c58 <_puts_r+0x5c>
|
|
8010c98: 6823 ldr r3, [r4, #0]
|
|
8010c9a: 250a movs r5, #10
|
|
8010c9c: 1c5a adds r2, r3, #1
|
|
8010c9e: 6022 str r2, [r4, #0]
|
|
8010ca0: 701d strb r5, [r3, #0]
|
|
8010ca2: e7db b.n 8010c5c <_puts_r+0x60>
|
|
|
|
08010ca4 <puts>:
|
|
8010ca4: 4b02 ldr r3, [pc, #8] ; (8010cb0 <puts+0xc>)
|
|
8010ca6: 4601 mov r1, r0
|
|
8010ca8: 6818 ldr r0, [r3, #0]
|
|
8010caa: f7ff bfa7 b.w 8010bfc <_puts_r>
|
|
8010cae: bf00 nop
|
|
8010cb0: 240000cc .word 0x240000cc
|
|
|
|
08010cb4 <__sread>:
|
|
8010cb4: b510 push {r4, lr}
|
|
8010cb6: 460c mov r4, r1
|
|
8010cb8: f9b1 100e ldrsh.w r1, [r1, #14]
|
|
8010cbc: f000 f91a bl 8010ef4 <_read_r>
|
|
8010cc0: 2800 cmp r0, #0
|
|
8010cc2: bfab itete ge
|
|
8010cc4: 6d63 ldrge r3, [r4, #84] ; 0x54
|
|
8010cc6: 89a3 ldrhlt r3, [r4, #12]
|
|
8010cc8: 181b addge r3, r3, r0
|
|
8010cca: f423 5380 biclt.w r3, r3, #4096 ; 0x1000
|
|
8010cce: bfac ite ge
|
|
8010cd0: 6563 strge r3, [r4, #84] ; 0x54
|
|
8010cd2: 81a3 strhlt r3, [r4, #12]
|
|
8010cd4: bd10 pop {r4, pc}
|
|
|
|
08010cd6 <__swrite>:
|
|
8010cd6: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
|
|
8010cda: 461f mov r7, r3
|
|
8010cdc: 898b ldrh r3, [r1, #12]
|
|
8010cde: 05db lsls r3, r3, #23
|
|
8010ce0: 4605 mov r5, r0
|
|
8010ce2: 460c mov r4, r1
|
|
8010ce4: 4616 mov r6, r2
|
|
8010ce6: d505 bpl.n 8010cf4 <__swrite+0x1e>
|
|
8010ce8: f9b1 100e ldrsh.w r1, [r1, #14]
|
|
8010cec: 2302 movs r3, #2
|
|
8010cee: 2200 movs r2, #0
|
|
8010cf0: f000 f8ee bl 8010ed0 <_lseek_r>
|
|
8010cf4: 89a3 ldrh r3, [r4, #12]
|
|
8010cf6: f9b4 100e ldrsh.w r1, [r4, #14]
|
|
8010cfa: f423 5380 bic.w r3, r3, #4096 ; 0x1000
|
|
8010cfe: 81a3 strh r3, [r4, #12]
|
|
8010d00: 4632 mov r2, r6
|
|
8010d02: 463b mov r3, r7
|
|
8010d04: 4628 mov r0, r5
|
|
8010d06: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
|
|
8010d0a: f000 b905 b.w 8010f18 <_write_r>
|
|
|
|
08010d0e <__sseek>:
|
|
8010d0e: b510 push {r4, lr}
|
|
8010d10: 460c mov r4, r1
|
|
8010d12: f9b1 100e ldrsh.w r1, [r1, #14]
|
|
8010d16: f000 f8db bl 8010ed0 <_lseek_r>
|
|
8010d1a: 1c43 adds r3, r0, #1
|
|
8010d1c: 89a3 ldrh r3, [r4, #12]
|
|
8010d1e: bf15 itete ne
|
|
8010d20: 6560 strne r0, [r4, #84] ; 0x54
|
|
8010d22: f423 5380 biceq.w r3, r3, #4096 ; 0x1000
|
|
8010d26: f443 5380 orrne.w r3, r3, #4096 ; 0x1000
|
|
8010d2a: 81a3 strheq r3, [r4, #12]
|
|
8010d2c: bf18 it ne
|
|
8010d2e: 81a3 strhne r3, [r4, #12]
|
|
8010d30: bd10 pop {r4, pc}
|
|
|
|
08010d32 <__sclose>:
|
|
8010d32: f9b1 100e ldrsh.w r1, [r1, #14]
|
|
8010d36: f000 b8bb b.w 8010eb0 <_close_r>
|
|
|
|
08010d3a <__swbuf_r>:
|
|
8010d3a: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
8010d3c: 460e mov r6, r1
|
|
8010d3e: 4614 mov r4, r2
|
|
8010d40: 4605 mov r5, r0
|
|
8010d42: b118 cbz r0, 8010d4c <__swbuf_r+0x12>
|
|
8010d44: 6a03 ldr r3, [r0, #32]
|
|
8010d46: b90b cbnz r3, 8010d4c <__swbuf_r+0x12>
|
|
8010d48: f7ff feae bl 8010aa8 <__sinit>
|
|
8010d4c: 69a3 ldr r3, [r4, #24]
|
|
8010d4e: 60a3 str r3, [r4, #8]
|
|
8010d50: 89a3 ldrh r3, [r4, #12]
|
|
8010d52: 071a lsls r2, r3, #28
|
|
8010d54: d525 bpl.n 8010da2 <__swbuf_r+0x68>
|
|
8010d56: 6923 ldr r3, [r4, #16]
|
|
8010d58: b31b cbz r3, 8010da2 <__swbuf_r+0x68>
|
|
8010d5a: 6823 ldr r3, [r4, #0]
|
|
8010d5c: 6922 ldr r2, [r4, #16]
|
|
8010d5e: 1a98 subs r0, r3, r2
|
|
8010d60: 6963 ldr r3, [r4, #20]
|
|
8010d62: b2f6 uxtb r6, r6
|
|
8010d64: 4283 cmp r3, r0
|
|
8010d66: 4637 mov r7, r6
|
|
8010d68: dc04 bgt.n 8010d74 <__swbuf_r+0x3a>
|
|
8010d6a: 4621 mov r1, r4
|
|
8010d6c: 4628 mov r0, r5
|
|
8010d6e: f000 fabf bl 80112f0 <_fflush_r>
|
|
8010d72: b9e0 cbnz r0, 8010dae <__swbuf_r+0x74>
|
|
8010d74: 68a3 ldr r3, [r4, #8]
|
|
8010d76: 3b01 subs r3, #1
|
|
8010d78: 60a3 str r3, [r4, #8]
|
|
8010d7a: 6823 ldr r3, [r4, #0]
|
|
8010d7c: 1c5a adds r2, r3, #1
|
|
8010d7e: 6022 str r2, [r4, #0]
|
|
8010d80: 701e strb r6, [r3, #0]
|
|
8010d82: 6962 ldr r2, [r4, #20]
|
|
8010d84: 1c43 adds r3, r0, #1
|
|
8010d86: 429a cmp r2, r3
|
|
8010d88: d004 beq.n 8010d94 <__swbuf_r+0x5a>
|
|
8010d8a: 89a3 ldrh r3, [r4, #12]
|
|
8010d8c: 07db lsls r3, r3, #31
|
|
8010d8e: d506 bpl.n 8010d9e <__swbuf_r+0x64>
|
|
8010d90: 2e0a cmp r6, #10
|
|
8010d92: d104 bne.n 8010d9e <__swbuf_r+0x64>
|
|
8010d94: 4621 mov r1, r4
|
|
8010d96: 4628 mov r0, r5
|
|
8010d98: f000 faaa bl 80112f0 <_fflush_r>
|
|
8010d9c: b938 cbnz r0, 8010dae <__swbuf_r+0x74>
|
|
8010d9e: 4638 mov r0, r7
|
|
8010da0: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
8010da2: 4621 mov r1, r4
|
|
8010da4: 4628 mov r0, r5
|
|
8010da6: f000 f805 bl 8010db4 <__swsetup_r>
|
|
8010daa: 2800 cmp r0, #0
|
|
8010dac: d0d5 beq.n 8010d5a <__swbuf_r+0x20>
|
|
8010dae: f04f 37ff mov.w r7, #4294967295
|
|
8010db2: e7f4 b.n 8010d9e <__swbuf_r+0x64>
|
|
|
|
08010db4 <__swsetup_r>:
|
|
8010db4: b538 push {r3, r4, r5, lr}
|
|
8010db6: 4b2a ldr r3, [pc, #168] ; (8010e60 <__swsetup_r+0xac>)
|
|
8010db8: 4605 mov r5, r0
|
|
8010dba: 6818 ldr r0, [r3, #0]
|
|
8010dbc: 460c mov r4, r1
|
|
8010dbe: b118 cbz r0, 8010dc8 <__swsetup_r+0x14>
|
|
8010dc0: 6a03 ldr r3, [r0, #32]
|
|
8010dc2: b90b cbnz r3, 8010dc8 <__swsetup_r+0x14>
|
|
8010dc4: f7ff fe70 bl 8010aa8 <__sinit>
|
|
8010dc8: 89a3 ldrh r3, [r4, #12]
|
|
8010dca: f9b4 200c ldrsh.w r2, [r4, #12]
|
|
8010dce: 0718 lsls r0, r3, #28
|
|
8010dd0: d422 bmi.n 8010e18 <__swsetup_r+0x64>
|
|
8010dd2: 06d9 lsls r1, r3, #27
|
|
8010dd4: d407 bmi.n 8010de6 <__swsetup_r+0x32>
|
|
8010dd6: 2309 movs r3, #9
|
|
8010dd8: 602b str r3, [r5, #0]
|
|
8010dda: f042 0340 orr.w r3, r2, #64 ; 0x40
|
|
8010dde: 81a3 strh r3, [r4, #12]
|
|
8010de0: f04f 30ff mov.w r0, #4294967295
|
|
8010de4: e034 b.n 8010e50 <__swsetup_r+0x9c>
|
|
8010de6: 0758 lsls r0, r3, #29
|
|
8010de8: d512 bpl.n 8010e10 <__swsetup_r+0x5c>
|
|
8010dea: 6b61 ldr r1, [r4, #52] ; 0x34
|
|
8010dec: b141 cbz r1, 8010e00 <__swsetup_r+0x4c>
|
|
8010dee: f104 0344 add.w r3, r4, #68 ; 0x44
|
|
8010df2: 4299 cmp r1, r3
|
|
8010df4: d002 beq.n 8010dfc <__swsetup_r+0x48>
|
|
8010df6: 4628 mov r0, r5
|
|
8010df8: f000 f8f4 bl 8010fe4 <_free_r>
|
|
8010dfc: 2300 movs r3, #0
|
|
8010dfe: 6363 str r3, [r4, #52] ; 0x34
|
|
8010e00: 89a3 ldrh r3, [r4, #12]
|
|
8010e02: f023 0324 bic.w r3, r3, #36 ; 0x24
|
|
8010e06: 81a3 strh r3, [r4, #12]
|
|
8010e08: 2300 movs r3, #0
|
|
8010e0a: 6063 str r3, [r4, #4]
|
|
8010e0c: 6923 ldr r3, [r4, #16]
|
|
8010e0e: 6023 str r3, [r4, #0]
|
|
8010e10: 89a3 ldrh r3, [r4, #12]
|
|
8010e12: f043 0308 orr.w r3, r3, #8
|
|
8010e16: 81a3 strh r3, [r4, #12]
|
|
8010e18: 6923 ldr r3, [r4, #16]
|
|
8010e1a: b94b cbnz r3, 8010e30 <__swsetup_r+0x7c>
|
|
8010e1c: 89a3 ldrh r3, [r4, #12]
|
|
8010e1e: f403 7320 and.w r3, r3, #640 ; 0x280
|
|
8010e22: f5b3 7f00 cmp.w r3, #512 ; 0x200
|
|
8010e26: d003 beq.n 8010e30 <__swsetup_r+0x7c>
|
|
8010e28: 4621 mov r1, r4
|
|
8010e2a: 4628 mov r0, r5
|
|
8010e2c: f000 fac0 bl 80113b0 <__smakebuf_r>
|
|
8010e30: 89a0 ldrh r0, [r4, #12]
|
|
8010e32: f9b4 200c ldrsh.w r2, [r4, #12]
|
|
8010e36: f010 0301 ands.w r3, r0, #1
|
|
8010e3a: d00a beq.n 8010e52 <__swsetup_r+0x9e>
|
|
8010e3c: 2300 movs r3, #0
|
|
8010e3e: 60a3 str r3, [r4, #8]
|
|
8010e40: 6963 ldr r3, [r4, #20]
|
|
8010e42: 425b negs r3, r3
|
|
8010e44: 61a3 str r3, [r4, #24]
|
|
8010e46: 6923 ldr r3, [r4, #16]
|
|
8010e48: b943 cbnz r3, 8010e5c <__swsetup_r+0xa8>
|
|
8010e4a: f010 0080 ands.w r0, r0, #128 ; 0x80
|
|
8010e4e: d1c4 bne.n 8010dda <__swsetup_r+0x26>
|
|
8010e50: bd38 pop {r3, r4, r5, pc}
|
|
8010e52: 0781 lsls r1, r0, #30
|
|
8010e54: bf58 it pl
|
|
8010e56: 6963 ldrpl r3, [r4, #20]
|
|
8010e58: 60a3 str r3, [r4, #8]
|
|
8010e5a: e7f4 b.n 8010e46 <__swsetup_r+0x92>
|
|
8010e5c: 2000 movs r0, #0
|
|
8010e5e: e7f7 b.n 8010e50 <__swsetup_r+0x9c>
|
|
8010e60: 240000cc .word 0x240000cc
|
|
|
|
08010e64 <memcmp>:
|
|
8010e64: b510 push {r4, lr}
|
|
8010e66: 3901 subs r1, #1
|
|
8010e68: 4402 add r2, r0
|
|
8010e6a: 4290 cmp r0, r2
|
|
8010e6c: d101 bne.n 8010e72 <memcmp+0xe>
|
|
8010e6e: 2000 movs r0, #0
|
|
8010e70: e005 b.n 8010e7e <memcmp+0x1a>
|
|
8010e72: 7803 ldrb r3, [r0, #0]
|
|
8010e74: f811 4f01 ldrb.w r4, [r1, #1]!
|
|
8010e78: 42a3 cmp r3, r4
|
|
8010e7a: d001 beq.n 8010e80 <memcmp+0x1c>
|
|
8010e7c: 1b18 subs r0, r3, r4
|
|
8010e7e: bd10 pop {r4, pc}
|
|
8010e80: 3001 adds r0, #1
|
|
8010e82: e7f2 b.n 8010e6a <memcmp+0x6>
|
|
|
|
08010e84 <memset>:
|
|
8010e84: 4402 add r2, r0
|
|
8010e86: 4603 mov r3, r0
|
|
8010e88: 4293 cmp r3, r2
|
|
8010e8a: d100 bne.n 8010e8e <memset+0xa>
|
|
8010e8c: 4770 bx lr
|
|
8010e8e: f803 1b01 strb.w r1, [r3], #1
|
|
8010e92: e7f9 b.n 8010e88 <memset+0x4>
|
|
|
|
08010e94 <strchr>:
|
|
8010e94: b2c9 uxtb r1, r1
|
|
8010e96: 4603 mov r3, r0
|
|
8010e98: f810 2b01 ldrb.w r2, [r0], #1
|
|
8010e9c: b11a cbz r2, 8010ea6 <strchr+0x12>
|
|
8010e9e: 428a cmp r2, r1
|
|
8010ea0: d1f9 bne.n 8010e96 <strchr+0x2>
|
|
8010ea2: 4618 mov r0, r3
|
|
8010ea4: 4770 bx lr
|
|
8010ea6: 2900 cmp r1, #0
|
|
8010ea8: bf18 it ne
|
|
8010eaa: 2300 movne r3, #0
|
|
8010eac: e7f9 b.n 8010ea2 <strchr+0xe>
|
|
...
|
|
|
|
08010eb0 <_close_r>:
|
|
8010eb0: b538 push {r3, r4, r5, lr}
|
|
8010eb2: 4d06 ldr r5, [pc, #24] ; (8010ecc <_close_r+0x1c>)
|
|
8010eb4: 2300 movs r3, #0
|
|
8010eb6: 4604 mov r4, r0
|
|
8010eb8: 4608 mov r0, r1
|
|
8010eba: 602b str r3, [r5, #0]
|
|
8010ebc: f7ef fda1 bl 8000a02 <_close>
|
|
8010ec0: 1c43 adds r3, r0, #1
|
|
8010ec2: d102 bne.n 8010eca <_close_r+0x1a>
|
|
8010ec4: 682b ldr r3, [r5, #0]
|
|
8010ec6: b103 cbz r3, 8010eca <_close_r+0x1a>
|
|
8010ec8: 6023 str r3, [r4, #0]
|
|
8010eca: bd38 pop {r3, r4, r5, pc}
|
|
8010ecc: 24007e08 .word 0x24007e08
|
|
|
|
08010ed0 <_lseek_r>:
|
|
8010ed0: b538 push {r3, r4, r5, lr}
|
|
8010ed2: 4d07 ldr r5, [pc, #28] ; (8010ef0 <_lseek_r+0x20>)
|
|
8010ed4: 4604 mov r4, r0
|
|
8010ed6: 4608 mov r0, r1
|
|
8010ed8: 4611 mov r1, r2
|
|
8010eda: 2200 movs r2, #0
|
|
8010edc: 602a str r2, [r5, #0]
|
|
8010ede: 461a mov r2, r3
|
|
8010ee0: f7ef fdb6 bl 8000a50 <_lseek>
|
|
8010ee4: 1c43 adds r3, r0, #1
|
|
8010ee6: d102 bne.n 8010eee <_lseek_r+0x1e>
|
|
8010ee8: 682b ldr r3, [r5, #0]
|
|
8010eea: b103 cbz r3, 8010eee <_lseek_r+0x1e>
|
|
8010eec: 6023 str r3, [r4, #0]
|
|
8010eee: bd38 pop {r3, r4, r5, pc}
|
|
8010ef0: 24007e08 .word 0x24007e08
|
|
|
|
08010ef4 <_read_r>:
|
|
8010ef4: b538 push {r3, r4, r5, lr}
|
|
8010ef6: 4d07 ldr r5, [pc, #28] ; (8010f14 <_read_r+0x20>)
|
|
8010ef8: 4604 mov r4, r0
|
|
8010efa: 4608 mov r0, r1
|
|
8010efc: 4611 mov r1, r2
|
|
8010efe: 2200 movs r2, #0
|
|
8010f00: 602a str r2, [r5, #0]
|
|
8010f02: 461a mov r2, r3
|
|
8010f04: f7ef fd60 bl 80009c8 <_read>
|
|
8010f08: 1c43 adds r3, r0, #1
|
|
8010f0a: d102 bne.n 8010f12 <_read_r+0x1e>
|
|
8010f0c: 682b ldr r3, [r5, #0]
|
|
8010f0e: b103 cbz r3, 8010f12 <_read_r+0x1e>
|
|
8010f10: 6023 str r3, [r4, #0]
|
|
8010f12: bd38 pop {r3, r4, r5, pc}
|
|
8010f14: 24007e08 .word 0x24007e08
|
|
|
|
08010f18 <_write_r>:
|
|
8010f18: b538 push {r3, r4, r5, lr}
|
|
8010f1a: 4d07 ldr r5, [pc, #28] ; (8010f38 <_write_r+0x20>)
|
|
8010f1c: 4604 mov r4, r0
|
|
8010f1e: 4608 mov r0, r1
|
|
8010f20: 4611 mov r1, r2
|
|
8010f22: 2200 movs r2, #0
|
|
8010f24: 602a str r2, [r5, #0]
|
|
8010f26: 461a mov r2, r3
|
|
8010f28: f7ef fa71 bl 800040e <_write>
|
|
8010f2c: 1c43 adds r3, r0, #1
|
|
8010f2e: d102 bne.n 8010f36 <_write_r+0x1e>
|
|
8010f30: 682b ldr r3, [r5, #0]
|
|
8010f32: b103 cbz r3, 8010f36 <_write_r+0x1e>
|
|
8010f34: 6023 str r3, [r4, #0]
|
|
8010f36: bd38 pop {r3, r4, r5, pc}
|
|
8010f38: 24007e08 .word 0x24007e08
|
|
|
|
08010f3c <__libc_init_array>:
|
|
8010f3c: b570 push {r4, r5, r6, lr}
|
|
8010f3e: 4d0d ldr r5, [pc, #52] ; (8010f74 <__libc_init_array+0x38>)
|
|
8010f40: 4c0d ldr r4, [pc, #52] ; (8010f78 <__libc_init_array+0x3c>)
|
|
8010f42: 1b64 subs r4, r4, r5
|
|
8010f44: 10a4 asrs r4, r4, #2
|
|
8010f46: 2600 movs r6, #0
|
|
8010f48: 42a6 cmp r6, r4
|
|
8010f4a: d109 bne.n 8010f60 <__libc_init_array+0x24>
|
|
8010f4c: 4d0b ldr r5, [pc, #44] ; (8010f7c <__libc_init_array+0x40>)
|
|
8010f4e: 4c0c ldr r4, [pc, #48] ; (8010f80 <__libc_init_array+0x44>)
|
|
8010f50: f000 fb1c bl 801158c <_init>
|
|
8010f54: 1b64 subs r4, r4, r5
|
|
8010f56: 10a4 asrs r4, r4, #2
|
|
8010f58: 2600 movs r6, #0
|
|
8010f5a: 42a6 cmp r6, r4
|
|
8010f5c: d105 bne.n 8010f6a <__libc_init_array+0x2e>
|
|
8010f5e: bd70 pop {r4, r5, r6, pc}
|
|
8010f60: f855 3b04 ldr.w r3, [r5], #4
|
|
8010f64: 4798 blx r3
|
|
8010f66: 3601 adds r6, #1
|
|
8010f68: e7ee b.n 8010f48 <__libc_init_array+0xc>
|
|
8010f6a: f855 3b04 ldr.w r3, [r5], #4
|
|
8010f6e: 4798 blx r3
|
|
8010f70: 3601 adds r6, #1
|
|
8010f72: e7f2 b.n 8010f5a <__libc_init_array+0x1e>
|
|
8010f74: 08014f88 .word 0x08014f88
|
|
8010f78: 08014f88 .word 0x08014f88
|
|
8010f7c: 08014f88 .word 0x08014f88
|
|
8010f80: 08014f8c .word 0x08014f8c
|
|
|
|
08010f84 <__retarget_lock_init_recursive>:
|
|
8010f84: 4770 bx lr
|
|
|
|
08010f86 <__retarget_lock_acquire_recursive>:
|
|
8010f86: 4770 bx lr
|
|
|
|
08010f88 <__retarget_lock_release_recursive>:
|
|
8010f88: 4770 bx lr
|
|
|
|
08010f8a <memcpy>:
|
|
8010f8a: 440a add r2, r1
|
|
8010f8c: 4291 cmp r1, r2
|
|
8010f8e: f100 33ff add.w r3, r0, #4294967295
|
|
8010f92: d100 bne.n 8010f96 <memcpy+0xc>
|
|
8010f94: 4770 bx lr
|
|
8010f96: b510 push {r4, lr}
|
|
8010f98: f811 4b01 ldrb.w r4, [r1], #1
|
|
8010f9c: f803 4f01 strb.w r4, [r3, #1]!
|
|
8010fa0: 4291 cmp r1, r2
|
|
8010fa2: d1f9 bne.n 8010f98 <memcpy+0xe>
|
|
8010fa4: bd10 pop {r4, pc}
|
|
...
|
|
|
|
08010fa8 <__assert_func>:
|
|
8010fa8: b51f push {r0, r1, r2, r3, r4, lr}
|
|
8010faa: 4614 mov r4, r2
|
|
8010fac: 461a mov r2, r3
|
|
8010fae: 4b09 ldr r3, [pc, #36] ; (8010fd4 <__assert_func+0x2c>)
|
|
8010fb0: 681b ldr r3, [r3, #0]
|
|
8010fb2: 4605 mov r5, r0
|
|
8010fb4: 68d8 ldr r0, [r3, #12]
|
|
8010fb6: b14c cbz r4, 8010fcc <__assert_func+0x24>
|
|
8010fb8: 4b07 ldr r3, [pc, #28] ; (8010fd8 <__assert_func+0x30>)
|
|
8010fba: 9100 str r1, [sp, #0]
|
|
8010fbc: e9cd 3401 strd r3, r4, [sp, #4]
|
|
8010fc0: 4906 ldr r1, [pc, #24] ; (8010fdc <__assert_func+0x34>)
|
|
8010fc2: 462b mov r3, r5
|
|
8010fc4: f000 f9bc bl 8011340 <fiprintf>
|
|
8010fc8: f000 fa94 bl 80114f4 <abort>
|
|
8010fcc: 4b04 ldr r3, [pc, #16] ; (8010fe0 <__assert_func+0x38>)
|
|
8010fce: 461c mov r4, r3
|
|
8010fd0: e7f3 b.n 8010fba <__assert_func+0x12>
|
|
8010fd2: bf00 nop
|
|
8010fd4: 240000cc .word 0x240000cc
|
|
8010fd8: 08014f49 .word 0x08014f49
|
|
8010fdc: 08014f56 .word 0x08014f56
|
|
8010fe0: 08014f84 .word 0x08014f84
|
|
|
|
08010fe4 <_free_r>:
|
|
8010fe4: b537 push {r0, r1, r2, r4, r5, lr}
|
|
8010fe6: 2900 cmp r1, #0
|
|
8010fe8: d044 beq.n 8011074 <_free_r+0x90>
|
|
8010fea: f851 3c04 ldr.w r3, [r1, #-4]
|
|
8010fee: 9001 str r0, [sp, #4]
|
|
8010ff0: 2b00 cmp r3, #0
|
|
8010ff2: f1a1 0404 sub.w r4, r1, #4
|
|
8010ff6: bfb8 it lt
|
|
8010ff8: 18e4 addlt r4, r4, r3
|
|
8010ffa: f000 f8e7 bl 80111cc <__malloc_lock>
|
|
8010ffe: 4a1e ldr r2, [pc, #120] ; (8011078 <_free_r+0x94>)
|
|
8011000: 9801 ldr r0, [sp, #4]
|
|
8011002: 6813 ldr r3, [r2, #0]
|
|
8011004: b933 cbnz r3, 8011014 <_free_r+0x30>
|
|
8011006: 6063 str r3, [r4, #4]
|
|
8011008: 6014 str r4, [r2, #0]
|
|
801100a: b003 add sp, #12
|
|
801100c: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
|
|
8011010: f000 b8e2 b.w 80111d8 <__malloc_unlock>
|
|
8011014: 42a3 cmp r3, r4
|
|
8011016: d908 bls.n 801102a <_free_r+0x46>
|
|
8011018: 6825 ldr r5, [r4, #0]
|
|
801101a: 1961 adds r1, r4, r5
|
|
801101c: 428b cmp r3, r1
|
|
801101e: bf01 itttt eq
|
|
8011020: 6819 ldreq r1, [r3, #0]
|
|
8011022: 685b ldreq r3, [r3, #4]
|
|
8011024: 1949 addeq r1, r1, r5
|
|
8011026: 6021 streq r1, [r4, #0]
|
|
8011028: e7ed b.n 8011006 <_free_r+0x22>
|
|
801102a: 461a mov r2, r3
|
|
801102c: 685b ldr r3, [r3, #4]
|
|
801102e: b10b cbz r3, 8011034 <_free_r+0x50>
|
|
8011030: 42a3 cmp r3, r4
|
|
8011032: d9fa bls.n 801102a <_free_r+0x46>
|
|
8011034: 6811 ldr r1, [r2, #0]
|
|
8011036: 1855 adds r5, r2, r1
|
|
8011038: 42a5 cmp r5, r4
|
|
801103a: d10b bne.n 8011054 <_free_r+0x70>
|
|
801103c: 6824 ldr r4, [r4, #0]
|
|
801103e: 4421 add r1, r4
|
|
8011040: 1854 adds r4, r2, r1
|
|
8011042: 42a3 cmp r3, r4
|
|
8011044: 6011 str r1, [r2, #0]
|
|
8011046: d1e0 bne.n 801100a <_free_r+0x26>
|
|
8011048: 681c ldr r4, [r3, #0]
|
|
801104a: 685b ldr r3, [r3, #4]
|
|
801104c: 6053 str r3, [r2, #4]
|
|
801104e: 440c add r4, r1
|
|
8011050: 6014 str r4, [r2, #0]
|
|
8011052: e7da b.n 801100a <_free_r+0x26>
|
|
8011054: d902 bls.n 801105c <_free_r+0x78>
|
|
8011056: 230c movs r3, #12
|
|
8011058: 6003 str r3, [r0, #0]
|
|
801105a: e7d6 b.n 801100a <_free_r+0x26>
|
|
801105c: 6825 ldr r5, [r4, #0]
|
|
801105e: 1961 adds r1, r4, r5
|
|
8011060: 428b cmp r3, r1
|
|
8011062: bf04 itt eq
|
|
8011064: 6819 ldreq r1, [r3, #0]
|
|
8011066: 685b ldreq r3, [r3, #4]
|
|
8011068: 6063 str r3, [r4, #4]
|
|
801106a: bf04 itt eq
|
|
801106c: 1949 addeq r1, r1, r5
|
|
801106e: 6021 streq r1, [r4, #0]
|
|
8011070: 6054 str r4, [r2, #4]
|
|
8011072: e7ca b.n 801100a <_free_r+0x26>
|
|
8011074: b003 add sp, #12
|
|
8011076: bd30 pop {r4, r5, pc}
|
|
8011078: 24007e10 .word 0x24007e10
|
|
|
|
0801107c <malloc>:
|
|
801107c: 4b02 ldr r3, [pc, #8] ; (8011088 <malloc+0xc>)
|
|
801107e: 4601 mov r1, r0
|
|
8011080: 6818 ldr r0, [r3, #0]
|
|
8011082: f000 b823 b.w 80110cc <_malloc_r>
|
|
8011086: bf00 nop
|
|
8011088: 240000cc .word 0x240000cc
|
|
|
|
0801108c <sbrk_aligned>:
|
|
801108c: b570 push {r4, r5, r6, lr}
|
|
801108e: 4e0e ldr r6, [pc, #56] ; (80110c8 <sbrk_aligned+0x3c>)
|
|
8011090: 460c mov r4, r1
|
|
8011092: 6831 ldr r1, [r6, #0]
|
|
8011094: 4605 mov r5, r0
|
|
8011096: b911 cbnz r1, 801109e <sbrk_aligned+0x12>
|
|
8011098: f000 fa1c bl 80114d4 <_sbrk_r>
|
|
801109c: 6030 str r0, [r6, #0]
|
|
801109e: 4621 mov r1, r4
|
|
80110a0: 4628 mov r0, r5
|
|
80110a2: f000 fa17 bl 80114d4 <_sbrk_r>
|
|
80110a6: 1c43 adds r3, r0, #1
|
|
80110a8: d00a beq.n 80110c0 <sbrk_aligned+0x34>
|
|
80110aa: 1cc4 adds r4, r0, #3
|
|
80110ac: f024 0403 bic.w r4, r4, #3
|
|
80110b0: 42a0 cmp r0, r4
|
|
80110b2: d007 beq.n 80110c4 <sbrk_aligned+0x38>
|
|
80110b4: 1a21 subs r1, r4, r0
|
|
80110b6: 4628 mov r0, r5
|
|
80110b8: f000 fa0c bl 80114d4 <_sbrk_r>
|
|
80110bc: 3001 adds r0, #1
|
|
80110be: d101 bne.n 80110c4 <sbrk_aligned+0x38>
|
|
80110c0: f04f 34ff mov.w r4, #4294967295
|
|
80110c4: 4620 mov r0, r4
|
|
80110c6: bd70 pop {r4, r5, r6, pc}
|
|
80110c8: 24007e14 .word 0x24007e14
|
|
|
|
080110cc <_malloc_r>:
|
|
80110cc: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
|
|
80110d0: 1ccd adds r5, r1, #3
|
|
80110d2: f025 0503 bic.w r5, r5, #3
|
|
80110d6: 3508 adds r5, #8
|
|
80110d8: 2d0c cmp r5, #12
|
|
80110da: bf38 it cc
|
|
80110dc: 250c movcc r5, #12
|
|
80110de: 2d00 cmp r5, #0
|
|
80110e0: 4607 mov r7, r0
|
|
80110e2: db01 blt.n 80110e8 <_malloc_r+0x1c>
|
|
80110e4: 42a9 cmp r1, r5
|
|
80110e6: d905 bls.n 80110f4 <_malloc_r+0x28>
|
|
80110e8: 230c movs r3, #12
|
|
80110ea: 603b str r3, [r7, #0]
|
|
80110ec: 2600 movs r6, #0
|
|
80110ee: 4630 mov r0, r6
|
|
80110f0: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
|
|
80110f4: f8df 80d0 ldr.w r8, [pc, #208] ; 80111c8 <_malloc_r+0xfc>
|
|
80110f8: f000 f868 bl 80111cc <__malloc_lock>
|
|
80110fc: f8d8 3000 ldr.w r3, [r8]
|
|
8011100: 461c mov r4, r3
|
|
8011102: bb5c cbnz r4, 801115c <_malloc_r+0x90>
|
|
8011104: 4629 mov r1, r5
|
|
8011106: 4638 mov r0, r7
|
|
8011108: f7ff ffc0 bl 801108c <sbrk_aligned>
|
|
801110c: 1c43 adds r3, r0, #1
|
|
801110e: 4604 mov r4, r0
|
|
8011110: d155 bne.n 80111be <_malloc_r+0xf2>
|
|
8011112: f8d8 4000 ldr.w r4, [r8]
|
|
8011116: 4626 mov r6, r4
|
|
8011118: 2e00 cmp r6, #0
|
|
801111a: d145 bne.n 80111a8 <_malloc_r+0xdc>
|
|
801111c: 2c00 cmp r4, #0
|
|
801111e: d048 beq.n 80111b2 <_malloc_r+0xe6>
|
|
8011120: 6823 ldr r3, [r4, #0]
|
|
8011122: 4631 mov r1, r6
|
|
8011124: 4638 mov r0, r7
|
|
8011126: eb04 0903 add.w r9, r4, r3
|
|
801112a: f000 f9d3 bl 80114d4 <_sbrk_r>
|
|
801112e: 4581 cmp r9, r0
|
|
8011130: d13f bne.n 80111b2 <_malloc_r+0xe6>
|
|
8011132: 6821 ldr r1, [r4, #0]
|
|
8011134: 1a6d subs r5, r5, r1
|
|
8011136: 4629 mov r1, r5
|
|
8011138: 4638 mov r0, r7
|
|
801113a: f7ff ffa7 bl 801108c <sbrk_aligned>
|
|
801113e: 3001 adds r0, #1
|
|
8011140: d037 beq.n 80111b2 <_malloc_r+0xe6>
|
|
8011142: 6823 ldr r3, [r4, #0]
|
|
8011144: 442b add r3, r5
|
|
8011146: 6023 str r3, [r4, #0]
|
|
8011148: f8d8 3000 ldr.w r3, [r8]
|
|
801114c: 2b00 cmp r3, #0
|
|
801114e: d038 beq.n 80111c2 <_malloc_r+0xf6>
|
|
8011150: 685a ldr r2, [r3, #4]
|
|
8011152: 42a2 cmp r2, r4
|
|
8011154: d12b bne.n 80111ae <_malloc_r+0xe2>
|
|
8011156: 2200 movs r2, #0
|
|
8011158: 605a str r2, [r3, #4]
|
|
801115a: e00f b.n 801117c <_malloc_r+0xb0>
|
|
801115c: 6822 ldr r2, [r4, #0]
|
|
801115e: 1b52 subs r2, r2, r5
|
|
8011160: d41f bmi.n 80111a2 <_malloc_r+0xd6>
|
|
8011162: 2a0b cmp r2, #11
|
|
8011164: d917 bls.n 8011196 <_malloc_r+0xca>
|
|
8011166: 1961 adds r1, r4, r5
|
|
8011168: 42a3 cmp r3, r4
|
|
801116a: 6025 str r5, [r4, #0]
|
|
801116c: bf18 it ne
|
|
801116e: 6059 strne r1, [r3, #4]
|
|
8011170: 6863 ldr r3, [r4, #4]
|
|
8011172: bf08 it eq
|
|
8011174: f8c8 1000 streq.w r1, [r8]
|
|
8011178: 5162 str r2, [r4, r5]
|
|
801117a: 604b str r3, [r1, #4]
|
|
801117c: 4638 mov r0, r7
|
|
801117e: f104 060b add.w r6, r4, #11
|
|
8011182: f000 f829 bl 80111d8 <__malloc_unlock>
|
|
8011186: f026 0607 bic.w r6, r6, #7
|
|
801118a: 1d23 adds r3, r4, #4
|
|
801118c: 1af2 subs r2, r6, r3
|
|
801118e: d0ae beq.n 80110ee <_malloc_r+0x22>
|
|
8011190: 1b9b subs r3, r3, r6
|
|
8011192: 50a3 str r3, [r4, r2]
|
|
8011194: e7ab b.n 80110ee <_malloc_r+0x22>
|
|
8011196: 42a3 cmp r3, r4
|
|
8011198: 6862 ldr r2, [r4, #4]
|
|
801119a: d1dd bne.n 8011158 <_malloc_r+0x8c>
|
|
801119c: f8c8 2000 str.w r2, [r8]
|
|
80111a0: e7ec b.n 801117c <_malloc_r+0xb0>
|
|
80111a2: 4623 mov r3, r4
|
|
80111a4: 6864 ldr r4, [r4, #4]
|
|
80111a6: e7ac b.n 8011102 <_malloc_r+0x36>
|
|
80111a8: 4634 mov r4, r6
|
|
80111aa: 6876 ldr r6, [r6, #4]
|
|
80111ac: e7b4 b.n 8011118 <_malloc_r+0x4c>
|
|
80111ae: 4613 mov r3, r2
|
|
80111b0: e7cc b.n 801114c <_malloc_r+0x80>
|
|
80111b2: 230c movs r3, #12
|
|
80111b4: 603b str r3, [r7, #0]
|
|
80111b6: 4638 mov r0, r7
|
|
80111b8: f000 f80e bl 80111d8 <__malloc_unlock>
|
|
80111bc: e797 b.n 80110ee <_malloc_r+0x22>
|
|
80111be: 6025 str r5, [r4, #0]
|
|
80111c0: e7dc b.n 801117c <_malloc_r+0xb0>
|
|
80111c2: 605b str r3, [r3, #4]
|
|
80111c4: deff udf #255 ; 0xff
|
|
80111c6: bf00 nop
|
|
80111c8: 24007e10 .word 0x24007e10
|
|
|
|
080111cc <__malloc_lock>:
|
|
80111cc: 4801 ldr r0, [pc, #4] ; (80111d4 <__malloc_lock+0x8>)
|
|
80111ce: f7ff beda b.w 8010f86 <__retarget_lock_acquire_recursive>
|
|
80111d2: bf00 nop
|
|
80111d4: 24007e0c .word 0x24007e0c
|
|
|
|
080111d8 <__malloc_unlock>:
|
|
80111d8: 4801 ldr r0, [pc, #4] ; (80111e0 <__malloc_unlock+0x8>)
|
|
80111da: f7ff bed5 b.w 8010f88 <__retarget_lock_release_recursive>
|
|
80111de: bf00 nop
|
|
80111e0: 24007e0c .word 0x24007e0c
|
|
|
|
080111e4 <__sflush_r>:
|
|
80111e4: 898a ldrh r2, [r1, #12]
|
|
80111e6: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
|
|
80111ea: 4605 mov r5, r0
|
|
80111ec: 0710 lsls r0, r2, #28
|
|
80111ee: 460c mov r4, r1
|
|
80111f0: d458 bmi.n 80112a4 <__sflush_r+0xc0>
|
|
80111f2: 684b ldr r3, [r1, #4]
|
|
80111f4: 2b00 cmp r3, #0
|
|
80111f6: dc05 bgt.n 8011204 <__sflush_r+0x20>
|
|
80111f8: 6c0b ldr r3, [r1, #64] ; 0x40
|
|
80111fa: 2b00 cmp r3, #0
|
|
80111fc: dc02 bgt.n 8011204 <__sflush_r+0x20>
|
|
80111fe: 2000 movs r0, #0
|
|
8011200: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
|
|
8011204: 6ae6 ldr r6, [r4, #44] ; 0x2c
|
|
8011206: 2e00 cmp r6, #0
|
|
8011208: d0f9 beq.n 80111fe <__sflush_r+0x1a>
|
|
801120a: 2300 movs r3, #0
|
|
801120c: f412 5280 ands.w r2, r2, #4096 ; 0x1000
|
|
8011210: 682f ldr r7, [r5, #0]
|
|
8011212: 6a21 ldr r1, [r4, #32]
|
|
8011214: 602b str r3, [r5, #0]
|
|
8011216: d032 beq.n 801127e <__sflush_r+0x9a>
|
|
8011218: 6d60 ldr r0, [r4, #84] ; 0x54
|
|
801121a: 89a3 ldrh r3, [r4, #12]
|
|
801121c: 075a lsls r2, r3, #29
|
|
801121e: d505 bpl.n 801122c <__sflush_r+0x48>
|
|
8011220: 6863 ldr r3, [r4, #4]
|
|
8011222: 1ac0 subs r0, r0, r3
|
|
8011224: 6b63 ldr r3, [r4, #52] ; 0x34
|
|
8011226: b10b cbz r3, 801122c <__sflush_r+0x48>
|
|
8011228: 6c23 ldr r3, [r4, #64] ; 0x40
|
|
801122a: 1ac0 subs r0, r0, r3
|
|
801122c: 2300 movs r3, #0
|
|
801122e: 4602 mov r2, r0
|
|
8011230: 6ae6 ldr r6, [r4, #44] ; 0x2c
|
|
8011232: 6a21 ldr r1, [r4, #32]
|
|
8011234: 4628 mov r0, r5
|
|
8011236: 47b0 blx r6
|
|
8011238: 1c43 adds r3, r0, #1
|
|
801123a: 89a3 ldrh r3, [r4, #12]
|
|
801123c: d106 bne.n 801124c <__sflush_r+0x68>
|
|
801123e: 6829 ldr r1, [r5, #0]
|
|
8011240: 291d cmp r1, #29
|
|
8011242: d82b bhi.n 801129c <__sflush_r+0xb8>
|
|
8011244: 4a29 ldr r2, [pc, #164] ; (80112ec <__sflush_r+0x108>)
|
|
8011246: 410a asrs r2, r1
|
|
8011248: 07d6 lsls r6, r2, #31
|
|
801124a: d427 bmi.n 801129c <__sflush_r+0xb8>
|
|
801124c: 2200 movs r2, #0
|
|
801124e: 6062 str r2, [r4, #4]
|
|
8011250: 04d9 lsls r1, r3, #19
|
|
8011252: 6922 ldr r2, [r4, #16]
|
|
8011254: 6022 str r2, [r4, #0]
|
|
8011256: d504 bpl.n 8011262 <__sflush_r+0x7e>
|
|
8011258: 1c42 adds r2, r0, #1
|
|
801125a: d101 bne.n 8011260 <__sflush_r+0x7c>
|
|
801125c: 682b ldr r3, [r5, #0]
|
|
801125e: b903 cbnz r3, 8011262 <__sflush_r+0x7e>
|
|
8011260: 6560 str r0, [r4, #84] ; 0x54
|
|
8011262: 6b61 ldr r1, [r4, #52] ; 0x34
|
|
8011264: 602f str r7, [r5, #0]
|
|
8011266: 2900 cmp r1, #0
|
|
8011268: d0c9 beq.n 80111fe <__sflush_r+0x1a>
|
|
801126a: f104 0344 add.w r3, r4, #68 ; 0x44
|
|
801126e: 4299 cmp r1, r3
|
|
8011270: d002 beq.n 8011278 <__sflush_r+0x94>
|
|
8011272: 4628 mov r0, r5
|
|
8011274: f7ff feb6 bl 8010fe4 <_free_r>
|
|
8011278: 2000 movs r0, #0
|
|
801127a: 6360 str r0, [r4, #52] ; 0x34
|
|
801127c: e7c0 b.n 8011200 <__sflush_r+0x1c>
|
|
801127e: 2301 movs r3, #1
|
|
8011280: 4628 mov r0, r5
|
|
8011282: 47b0 blx r6
|
|
8011284: 1c41 adds r1, r0, #1
|
|
8011286: d1c8 bne.n 801121a <__sflush_r+0x36>
|
|
8011288: 682b ldr r3, [r5, #0]
|
|
801128a: 2b00 cmp r3, #0
|
|
801128c: d0c5 beq.n 801121a <__sflush_r+0x36>
|
|
801128e: 2b1d cmp r3, #29
|
|
8011290: d001 beq.n 8011296 <__sflush_r+0xb2>
|
|
8011292: 2b16 cmp r3, #22
|
|
8011294: d101 bne.n 801129a <__sflush_r+0xb6>
|
|
8011296: 602f str r7, [r5, #0]
|
|
8011298: e7b1 b.n 80111fe <__sflush_r+0x1a>
|
|
801129a: 89a3 ldrh r3, [r4, #12]
|
|
801129c: f043 0340 orr.w r3, r3, #64 ; 0x40
|
|
80112a0: 81a3 strh r3, [r4, #12]
|
|
80112a2: e7ad b.n 8011200 <__sflush_r+0x1c>
|
|
80112a4: 690f ldr r7, [r1, #16]
|
|
80112a6: 2f00 cmp r7, #0
|
|
80112a8: d0a9 beq.n 80111fe <__sflush_r+0x1a>
|
|
80112aa: 0793 lsls r3, r2, #30
|
|
80112ac: 680e ldr r6, [r1, #0]
|
|
80112ae: bf08 it eq
|
|
80112b0: 694b ldreq r3, [r1, #20]
|
|
80112b2: 600f str r7, [r1, #0]
|
|
80112b4: bf18 it ne
|
|
80112b6: 2300 movne r3, #0
|
|
80112b8: eba6 0807 sub.w r8, r6, r7
|
|
80112bc: 608b str r3, [r1, #8]
|
|
80112be: f1b8 0f00 cmp.w r8, #0
|
|
80112c2: dd9c ble.n 80111fe <__sflush_r+0x1a>
|
|
80112c4: 6a21 ldr r1, [r4, #32]
|
|
80112c6: 6aa6 ldr r6, [r4, #40] ; 0x28
|
|
80112c8: 4643 mov r3, r8
|
|
80112ca: 463a mov r2, r7
|
|
80112cc: 4628 mov r0, r5
|
|
80112ce: 47b0 blx r6
|
|
80112d0: 2800 cmp r0, #0
|
|
80112d2: dc06 bgt.n 80112e2 <__sflush_r+0xfe>
|
|
80112d4: 89a3 ldrh r3, [r4, #12]
|
|
80112d6: f043 0340 orr.w r3, r3, #64 ; 0x40
|
|
80112da: 81a3 strh r3, [r4, #12]
|
|
80112dc: f04f 30ff mov.w r0, #4294967295
|
|
80112e0: e78e b.n 8011200 <__sflush_r+0x1c>
|
|
80112e2: 4407 add r7, r0
|
|
80112e4: eba8 0800 sub.w r8, r8, r0
|
|
80112e8: e7e9 b.n 80112be <__sflush_r+0xda>
|
|
80112ea: bf00 nop
|
|
80112ec: dfbffffe .word 0xdfbffffe
|
|
|
|
080112f0 <_fflush_r>:
|
|
80112f0: b538 push {r3, r4, r5, lr}
|
|
80112f2: 690b ldr r3, [r1, #16]
|
|
80112f4: 4605 mov r5, r0
|
|
80112f6: 460c mov r4, r1
|
|
80112f8: b913 cbnz r3, 8011300 <_fflush_r+0x10>
|
|
80112fa: 2500 movs r5, #0
|
|
80112fc: 4628 mov r0, r5
|
|
80112fe: bd38 pop {r3, r4, r5, pc}
|
|
8011300: b118 cbz r0, 801130a <_fflush_r+0x1a>
|
|
8011302: 6a03 ldr r3, [r0, #32]
|
|
8011304: b90b cbnz r3, 801130a <_fflush_r+0x1a>
|
|
8011306: f7ff fbcf bl 8010aa8 <__sinit>
|
|
801130a: f9b4 300c ldrsh.w r3, [r4, #12]
|
|
801130e: 2b00 cmp r3, #0
|
|
8011310: d0f3 beq.n 80112fa <_fflush_r+0xa>
|
|
8011312: 6e62 ldr r2, [r4, #100] ; 0x64
|
|
8011314: 07d0 lsls r0, r2, #31
|
|
8011316: d404 bmi.n 8011322 <_fflush_r+0x32>
|
|
8011318: 0599 lsls r1, r3, #22
|
|
801131a: d402 bmi.n 8011322 <_fflush_r+0x32>
|
|
801131c: 6da0 ldr r0, [r4, #88] ; 0x58
|
|
801131e: f7ff fe32 bl 8010f86 <__retarget_lock_acquire_recursive>
|
|
8011322: 4628 mov r0, r5
|
|
8011324: 4621 mov r1, r4
|
|
8011326: f7ff ff5d bl 80111e4 <__sflush_r>
|
|
801132a: 6e63 ldr r3, [r4, #100] ; 0x64
|
|
801132c: 07da lsls r2, r3, #31
|
|
801132e: 4605 mov r5, r0
|
|
8011330: d4e4 bmi.n 80112fc <_fflush_r+0xc>
|
|
8011332: 89a3 ldrh r3, [r4, #12]
|
|
8011334: 059b lsls r3, r3, #22
|
|
8011336: d4e1 bmi.n 80112fc <_fflush_r+0xc>
|
|
8011338: 6da0 ldr r0, [r4, #88] ; 0x58
|
|
801133a: f7ff fe25 bl 8010f88 <__retarget_lock_release_recursive>
|
|
801133e: e7dd b.n 80112fc <_fflush_r+0xc>
|
|
|
|
08011340 <fiprintf>:
|
|
8011340: b40e push {r1, r2, r3}
|
|
8011342: b503 push {r0, r1, lr}
|
|
8011344: 4601 mov r1, r0
|
|
8011346: ab03 add r3, sp, #12
|
|
8011348: 4805 ldr r0, [pc, #20] ; (8011360 <fiprintf+0x20>)
|
|
801134a: f853 2b04 ldr.w r2, [r3], #4
|
|
801134e: 6800 ldr r0, [r0, #0]
|
|
8011350: 9301 str r3, [sp, #4]
|
|
8011352: f7ff f869 bl 8010428 <_vfiprintf_r>
|
|
8011356: b002 add sp, #8
|
|
8011358: f85d eb04 ldr.w lr, [sp], #4
|
|
801135c: b003 add sp, #12
|
|
801135e: 4770 bx lr
|
|
8011360: 240000cc .word 0x240000cc
|
|
|
|
08011364 <__swhatbuf_r>:
|
|
8011364: b570 push {r4, r5, r6, lr}
|
|
8011366: 460c mov r4, r1
|
|
8011368: f9b1 100e ldrsh.w r1, [r1, #14]
|
|
801136c: 2900 cmp r1, #0
|
|
801136e: b096 sub sp, #88 ; 0x58
|
|
8011370: 4615 mov r5, r2
|
|
8011372: 461e mov r6, r3
|
|
8011374: da0d bge.n 8011392 <__swhatbuf_r+0x2e>
|
|
8011376: 89a3 ldrh r3, [r4, #12]
|
|
8011378: f013 0f80 tst.w r3, #128 ; 0x80
|
|
801137c: f04f 0100 mov.w r1, #0
|
|
8011380: bf0c ite eq
|
|
8011382: f44f 6380 moveq.w r3, #1024 ; 0x400
|
|
8011386: 2340 movne r3, #64 ; 0x40
|
|
8011388: 2000 movs r0, #0
|
|
801138a: 6031 str r1, [r6, #0]
|
|
801138c: 602b str r3, [r5, #0]
|
|
801138e: b016 add sp, #88 ; 0x58
|
|
8011390: bd70 pop {r4, r5, r6, pc}
|
|
8011392: 466a mov r2, sp
|
|
8011394: f000 f87c bl 8011490 <_fstat_r>
|
|
8011398: 2800 cmp r0, #0
|
|
801139a: dbec blt.n 8011376 <__swhatbuf_r+0x12>
|
|
801139c: 9901 ldr r1, [sp, #4]
|
|
801139e: f401 4170 and.w r1, r1, #61440 ; 0xf000
|
|
80113a2: f5a1 5300 sub.w r3, r1, #8192 ; 0x2000
|
|
80113a6: 4259 negs r1, r3
|
|
80113a8: 4159 adcs r1, r3
|
|
80113aa: f44f 6380 mov.w r3, #1024 ; 0x400
|
|
80113ae: e7eb b.n 8011388 <__swhatbuf_r+0x24>
|
|
|
|
080113b0 <__smakebuf_r>:
|
|
80113b0: 898b ldrh r3, [r1, #12]
|
|
80113b2: b573 push {r0, r1, r4, r5, r6, lr}
|
|
80113b4: 079d lsls r5, r3, #30
|
|
80113b6: 4606 mov r6, r0
|
|
80113b8: 460c mov r4, r1
|
|
80113ba: d507 bpl.n 80113cc <__smakebuf_r+0x1c>
|
|
80113bc: f104 0347 add.w r3, r4, #71 ; 0x47
|
|
80113c0: 6023 str r3, [r4, #0]
|
|
80113c2: 6123 str r3, [r4, #16]
|
|
80113c4: 2301 movs r3, #1
|
|
80113c6: 6163 str r3, [r4, #20]
|
|
80113c8: b002 add sp, #8
|
|
80113ca: bd70 pop {r4, r5, r6, pc}
|
|
80113cc: ab01 add r3, sp, #4
|
|
80113ce: 466a mov r2, sp
|
|
80113d0: f7ff ffc8 bl 8011364 <__swhatbuf_r>
|
|
80113d4: 9900 ldr r1, [sp, #0]
|
|
80113d6: 4605 mov r5, r0
|
|
80113d8: 4630 mov r0, r6
|
|
80113da: f7ff fe77 bl 80110cc <_malloc_r>
|
|
80113de: b948 cbnz r0, 80113f4 <__smakebuf_r+0x44>
|
|
80113e0: f9b4 300c ldrsh.w r3, [r4, #12]
|
|
80113e4: 059a lsls r2, r3, #22
|
|
80113e6: d4ef bmi.n 80113c8 <__smakebuf_r+0x18>
|
|
80113e8: f023 0303 bic.w r3, r3, #3
|
|
80113ec: f043 0302 orr.w r3, r3, #2
|
|
80113f0: 81a3 strh r3, [r4, #12]
|
|
80113f2: e7e3 b.n 80113bc <__smakebuf_r+0xc>
|
|
80113f4: 89a3 ldrh r3, [r4, #12]
|
|
80113f6: 6020 str r0, [r4, #0]
|
|
80113f8: f043 0380 orr.w r3, r3, #128 ; 0x80
|
|
80113fc: 81a3 strh r3, [r4, #12]
|
|
80113fe: 9b00 ldr r3, [sp, #0]
|
|
8011400: 6163 str r3, [r4, #20]
|
|
8011402: 9b01 ldr r3, [sp, #4]
|
|
8011404: 6120 str r0, [r4, #16]
|
|
8011406: b15b cbz r3, 8011420 <__smakebuf_r+0x70>
|
|
8011408: f9b4 100e ldrsh.w r1, [r4, #14]
|
|
801140c: 4630 mov r0, r6
|
|
801140e: f000 f851 bl 80114b4 <_isatty_r>
|
|
8011412: b128 cbz r0, 8011420 <__smakebuf_r+0x70>
|
|
8011414: 89a3 ldrh r3, [r4, #12]
|
|
8011416: f023 0303 bic.w r3, r3, #3
|
|
801141a: f043 0301 orr.w r3, r3, #1
|
|
801141e: 81a3 strh r3, [r4, #12]
|
|
8011420: 89a3 ldrh r3, [r4, #12]
|
|
8011422: 431d orrs r5, r3
|
|
8011424: 81a5 strh r5, [r4, #12]
|
|
8011426: e7cf b.n 80113c8 <__smakebuf_r+0x18>
|
|
|
|
08011428 <_putc_r>:
|
|
8011428: b570 push {r4, r5, r6, lr}
|
|
801142a: 460d mov r5, r1
|
|
801142c: 4614 mov r4, r2
|
|
801142e: 4606 mov r6, r0
|
|
8011430: b118 cbz r0, 801143a <_putc_r+0x12>
|
|
8011432: 6a03 ldr r3, [r0, #32]
|
|
8011434: b90b cbnz r3, 801143a <_putc_r+0x12>
|
|
8011436: f7ff fb37 bl 8010aa8 <__sinit>
|
|
801143a: 6e63 ldr r3, [r4, #100] ; 0x64
|
|
801143c: 07d8 lsls r0, r3, #31
|
|
801143e: d405 bmi.n 801144c <_putc_r+0x24>
|
|
8011440: 89a3 ldrh r3, [r4, #12]
|
|
8011442: 0599 lsls r1, r3, #22
|
|
8011444: d402 bmi.n 801144c <_putc_r+0x24>
|
|
8011446: 6da0 ldr r0, [r4, #88] ; 0x58
|
|
8011448: f7ff fd9d bl 8010f86 <__retarget_lock_acquire_recursive>
|
|
801144c: 68a3 ldr r3, [r4, #8]
|
|
801144e: 3b01 subs r3, #1
|
|
8011450: 2b00 cmp r3, #0
|
|
8011452: 60a3 str r3, [r4, #8]
|
|
8011454: da05 bge.n 8011462 <_putc_r+0x3a>
|
|
8011456: 69a2 ldr r2, [r4, #24]
|
|
8011458: 4293 cmp r3, r2
|
|
801145a: db12 blt.n 8011482 <_putc_r+0x5a>
|
|
801145c: b2eb uxtb r3, r5
|
|
801145e: 2b0a cmp r3, #10
|
|
8011460: d00f beq.n 8011482 <_putc_r+0x5a>
|
|
8011462: 6823 ldr r3, [r4, #0]
|
|
8011464: 1c5a adds r2, r3, #1
|
|
8011466: 6022 str r2, [r4, #0]
|
|
8011468: 701d strb r5, [r3, #0]
|
|
801146a: b2ed uxtb r5, r5
|
|
801146c: 6e63 ldr r3, [r4, #100] ; 0x64
|
|
801146e: 07da lsls r2, r3, #31
|
|
8011470: d405 bmi.n 801147e <_putc_r+0x56>
|
|
8011472: 89a3 ldrh r3, [r4, #12]
|
|
8011474: 059b lsls r3, r3, #22
|
|
8011476: d402 bmi.n 801147e <_putc_r+0x56>
|
|
8011478: 6da0 ldr r0, [r4, #88] ; 0x58
|
|
801147a: f7ff fd85 bl 8010f88 <__retarget_lock_release_recursive>
|
|
801147e: 4628 mov r0, r5
|
|
8011480: bd70 pop {r4, r5, r6, pc}
|
|
8011482: 4629 mov r1, r5
|
|
8011484: 4622 mov r2, r4
|
|
8011486: 4630 mov r0, r6
|
|
8011488: f7ff fc57 bl 8010d3a <__swbuf_r>
|
|
801148c: 4605 mov r5, r0
|
|
801148e: e7ed b.n 801146c <_putc_r+0x44>
|
|
|
|
08011490 <_fstat_r>:
|
|
8011490: b538 push {r3, r4, r5, lr}
|
|
8011492: 4d07 ldr r5, [pc, #28] ; (80114b0 <_fstat_r+0x20>)
|
|
8011494: 2300 movs r3, #0
|
|
8011496: 4604 mov r4, r0
|
|
8011498: 4608 mov r0, r1
|
|
801149a: 4611 mov r1, r2
|
|
801149c: 602b str r3, [r5, #0]
|
|
801149e: f7ef fabc bl 8000a1a <_fstat>
|
|
80114a2: 1c43 adds r3, r0, #1
|
|
80114a4: d102 bne.n 80114ac <_fstat_r+0x1c>
|
|
80114a6: 682b ldr r3, [r5, #0]
|
|
80114a8: b103 cbz r3, 80114ac <_fstat_r+0x1c>
|
|
80114aa: 6023 str r3, [r4, #0]
|
|
80114ac: bd38 pop {r3, r4, r5, pc}
|
|
80114ae: bf00 nop
|
|
80114b0: 24007e08 .word 0x24007e08
|
|
|
|
080114b4 <_isatty_r>:
|
|
80114b4: b538 push {r3, r4, r5, lr}
|
|
80114b6: 4d06 ldr r5, [pc, #24] ; (80114d0 <_isatty_r+0x1c>)
|
|
80114b8: 2300 movs r3, #0
|
|
80114ba: 4604 mov r4, r0
|
|
80114bc: 4608 mov r0, r1
|
|
80114be: 602b str r3, [r5, #0]
|
|
80114c0: f7ef fabb bl 8000a3a <_isatty>
|
|
80114c4: 1c43 adds r3, r0, #1
|
|
80114c6: d102 bne.n 80114ce <_isatty_r+0x1a>
|
|
80114c8: 682b ldr r3, [r5, #0]
|
|
80114ca: b103 cbz r3, 80114ce <_isatty_r+0x1a>
|
|
80114cc: 6023 str r3, [r4, #0]
|
|
80114ce: bd38 pop {r3, r4, r5, pc}
|
|
80114d0: 24007e08 .word 0x24007e08
|
|
|
|
080114d4 <_sbrk_r>:
|
|
80114d4: b538 push {r3, r4, r5, lr}
|
|
80114d6: 4d06 ldr r5, [pc, #24] ; (80114f0 <_sbrk_r+0x1c>)
|
|
80114d8: 2300 movs r3, #0
|
|
80114da: 4604 mov r4, r0
|
|
80114dc: 4608 mov r0, r1
|
|
80114de: 602b str r3, [r5, #0]
|
|
80114e0: f7ef fac4 bl 8000a6c <_sbrk>
|
|
80114e4: 1c43 adds r3, r0, #1
|
|
80114e6: d102 bne.n 80114ee <_sbrk_r+0x1a>
|
|
80114e8: 682b ldr r3, [r5, #0]
|
|
80114ea: b103 cbz r3, 80114ee <_sbrk_r+0x1a>
|
|
80114ec: 6023 str r3, [r4, #0]
|
|
80114ee: bd38 pop {r3, r4, r5, pc}
|
|
80114f0: 24007e08 .word 0x24007e08
|
|
|
|
080114f4 <abort>:
|
|
80114f4: b508 push {r3, lr}
|
|
80114f6: 2006 movs r0, #6
|
|
80114f8: f000 f82c bl 8011554 <raise>
|
|
80114fc: 2001 movs r0, #1
|
|
80114fe: f7ef fa59 bl 80009b4 <_exit>
|
|
|
|
08011502 <_raise_r>:
|
|
8011502: 291f cmp r1, #31
|
|
8011504: b538 push {r3, r4, r5, lr}
|
|
8011506: 4604 mov r4, r0
|
|
8011508: 460d mov r5, r1
|
|
801150a: d904 bls.n 8011516 <_raise_r+0x14>
|
|
801150c: 2316 movs r3, #22
|
|
801150e: 6003 str r3, [r0, #0]
|
|
8011510: f04f 30ff mov.w r0, #4294967295
|
|
8011514: bd38 pop {r3, r4, r5, pc}
|
|
8011516: 6bc2 ldr r2, [r0, #60] ; 0x3c
|
|
8011518: b112 cbz r2, 8011520 <_raise_r+0x1e>
|
|
801151a: f852 3021 ldr.w r3, [r2, r1, lsl #2]
|
|
801151e: b94b cbnz r3, 8011534 <_raise_r+0x32>
|
|
8011520: 4620 mov r0, r4
|
|
8011522: f000 f831 bl 8011588 <_getpid_r>
|
|
8011526: 462a mov r2, r5
|
|
8011528: 4601 mov r1, r0
|
|
801152a: 4620 mov r0, r4
|
|
801152c: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
|
|
8011530: f000 b818 b.w 8011564 <_kill_r>
|
|
8011534: 2b01 cmp r3, #1
|
|
8011536: d00a beq.n 801154e <_raise_r+0x4c>
|
|
8011538: 1c59 adds r1, r3, #1
|
|
801153a: d103 bne.n 8011544 <_raise_r+0x42>
|
|
801153c: 2316 movs r3, #22
|
|
801153e: 6003 str r3, [r0, #0]
|
|
8011540: 2001 movs r0, #1
|
|
8011542: e7e7 b.n 8011514 <_raise_r+0x12>
|
|
8011544: 2400 movs r4, #0
|
|
8011546: f842 4025 str.w r4, [r2, r5, lsl #2]
|
|
801154a: 4628 mov r0, r5
|
|
801154c: 4798 blx r3
|
|
801154e: 2000 movs r0, #0
|
|
8011550: e7e0 b.n 8011514 <_raise_r+0x12>
|
|
...
|
|
|
|
08011554 <raise>:
|
|
8011554: 4b02 ldr r3, [pc, #8] ; (8011560 <raise+0xc>)
|
|
8011556: 4601 mov r1, r0
|
|
8011558: 6818 ldr r0, [r3, #0]
|
|
801155a: f7ff bfd2 b.w 8011502 <_raise_r>
|
|
801155e: bf00 nop
|
|
8011560: 240000cc .word 0x240000cc
|
|
|
|
08011564 <_kill_r>:
|
|
8011564: b538 push {r3, r4, r5, lr}
|
|
8011566: 4d07 ldr r5, [pc, #28] ; (8011584 <_kill_r+0x20>)
|
|
8011568: 2300 movs r3, #0
|
|
801156a: 4604 mov r4, r0
|
|
801156c: 4608 mov r0, r1
|
|
801156e: 4611 mov r1, r2
|
|
8011570: 602b str r3, [r5, #0]
|
|
8011572: f7ef fa0d bl 8000990 <_kill>
|
|
8011576: 1c43 adds r3, r0, #1
|
|
8011578: d102 bne.n 8011580 <_kill_r+0x1c>
|
|
801157a: 682b ldr r3, [r5, #0]
|
|
801157c: b103 cbz r3, 8011580 <_kill_r+0x1c>
|
|
801157e: 6023 str r3, [r4, #0]
|
|
8011580: bd38 pop {r3, r4, r5, pc}
|
|
8011582: bf00 nop
|
|
8011584: 24007e08 .word 0x24007e08
|
|
|
|
08011588 <_getpid_r>:
|
|
8011588: f7ef b9fa b.w 8000980 <_getpid>
|
|
|
|
0801158c <_init>:
|
|
801158c: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
801158e: bf00 nop
|
|
8011590: bcf8 pop {r3, r4, r5, r6, r7}
|
|
8011592: bc08 pop {r3}
|
|
8011594: 469e mov lr, r3
|
|
8011596: 4770 bx lr
|
|
|
|
08011598 <_fini>:
|
|
8011598: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
801159a: bf00 nop
|
|
801159c: bcf8 pop {r3, r4, r5, r6, r7}
|
|
801159e: bc08 pop {r3}
|
|
80115a0: 469e mov lr, r3
|
|
80115a2: 4770 bx lr
|