📄 icmp.lis
字号:
0100 ; sprintf((char*)ScratchPad, "%u", ntohs(ICMP_Header->SeqNum));
0100 E0910000 lds R30,_ICMP_Header
0104 F0910100 lds R31,_ICMP_Header+1
0108 0681 ldd R16,z+6
010A 1781 ldd R17,z+7
010C 0E940000 xcall _ntohs
0110 1983 std y+1,R17
0112 0883 std y+0,R16
0114 20E0 ldi R18,<L4
0116 30E0 ldi R19,>L4
0118 00E0 ldi R16,<_ScratchPad
011A 10E0 ldi R17,>_ScratchPad
011C 0E940000 xcall _sprintf
0120 .dbline 108
0120 ; if (!SendDebugStr((char*)ScratchPad)) return;
0120 00E0 ldi R16,<_ScratchPad
0122 10E0 ldi R17,>_ScratchPad
0124 0E940000 xcall _SendDebugStr
0128 0023 tst R16
012A 09F4 brne L22
012C .dbline 108
012C 1AC0 xjmp L1
012E L22:
012E .dbline 112
012E ;
012E ; // done
012E ;
012E ; if (!SendDebugRStr(icmp_str6)) return;
012E 00E0 ldi R16,<_icmp_str6
0130 10E0 ldi R17,>_icmp_str6
0132 0E940000 xcall _SendDebugRStr
0136 0023 tst R16
0138 09F4 brne L24
013A .dbline 112
013A 13C0 xjmp L1
013C L24:
013C .dbline 113
013C CB01 movw R24,R22
013E 0896 adiw R24,8
0140 1A01 movw R2,R20
0142 281A sub R2,R24
0144 390A sbc R3,R25
0146 3982 std y+1,R3
0148 2882 std y+0,R2
014A 20E0 ldi R18,<L26
014C 30E0 ldi R19,>L26
014E 00E0 ldi R16,<_ScratchPad
0150 10E0 ldi R17,>_ScratchPad
0152 0E940000 xcall _sprintf
0156 .dbline 114
0156 00E0 ldi R16,<_ScratchPad
0158 10E0 ldi R17,>_ScratchPad
015A 0E940000 xcall _SendDebugStr
015E 0023 tst R16
0160 01F4 brne L27
0162 .dbline 114
0162 L27:
0162 .dbline -2
0162 L1:
0162 2296 adiw R28,2
0164 0E940000 xcall pop_gset2
0168 .dbline 0 ; func end
0168 0895 ret
016A .dbsym r TotalBytes 20 I
016A .dbsym r HeaderIdx 22 I
016A .dbend
016A .dbfunc e ICMP_In _ICMP_In fV
016A ; dw -> y+2
016A ; len -> R10,R11
.even
016A _ICMP_In::
016A 0E940000 xcall push_gset3
016E 2697 sbiw R28,6
0170 .dbline -1
0170 .dbline 122
0170 ; sprintf((char*)ScratchPad, "%u\n", TotalBytes - (HeaderIdx + sizeof(T_ICMP_Header)));
0170 ; if (!SendDebugStr((char*)ScratchPad)) return;
0170 ; }
0170 ;
0170 ; #endif
0170 ;
0170 ; // **************************************************************************
0170 ;
0170 ; void ICMP_In(void)
0170 ; {
0170 .dbline 128
0170 ; u16 len;
0170 ; u32 dw;
0170 ;
0170 ; // **********************
0170 ;
0170 ; len = MainBufferWr_Rx - MainBufferRd_Rx; // length of data left
0170 20900000 lds R2,_MainBufferRd_Rx
0174 30900100 lds R3,_MainBufferRd_Rx+1
0178 A0900000 lds R10,_MainBufferWr_Rx
017C B0900100 lds R11,_MainBufferWr_Rx+1
0180 A218 sub R10,R2
0182 B308 sbc R11,R3
0184 .dbline 130
0184 ; //
0184 ; ICMP_Header = (T_ICMP_Header*)(MainBuffer + MainBufferRd_Rx); // point to the ICMP header
0184 80E0 ldi R24,<_MainBuffer
0186 90E0 ldi R25,>_MainBuffer
0188 280E add R2,R24
018A 391E adc R3,R25
018C 30920100 sts _ICMP_Header+1,R3
0190 20920000 sts _ICMP_Header,R2
0194 .dbline 132
0194 ; //
0194 ; if (!ICMP_Header->Checksum) return; // invalid checksum
0194 F101 movw R30,R2
0196 2280 ldd R2,z+2
0198 3380 ldd R3,z+3
019A 2220 tst R2
019C 19F4 brne L30
019E 3320 tst R3
01A0 09F4 brne L30
01A2 X0:
01A2 .dbline 132
01A2 16C1 xjmp L29
01A4 L30:
01A4 .dbline 133
01A4 ; if (IP_Checksum1((char*)ICMP_Header, len)) //
01A4 9501 movw R18,R10
01A6 00910000 lds R16,_ICMP_Header
01AA 10910100 lds R17,_ICMP_Header+1
01AE 0E940000 xcall _IP_Checksum1
01B2 0030 cpi R16,0
01B4 0107 cpc R16,R17
01B6 29F0 breq L32
01B8 X1:
01B8 .dbline 134
01B8 ; { // invalid checksum
01B8 .dbline 136
01B8 ; #ifdef Debug
01B8 ; SendDebugRStr(icmp_str8); //
01B8 00E0 ldi R16,<_icmp_str8
01BA 10E0 ldi R17,>_icmp_str8
01BC 0E940000 xcall _SendDebugRStr
01C0 .dbline 138
01C0 ; #endif
01C0 ; return; //
01C0 07C1 xjmp L29
01C2 L32:
01C2 .dbline 142
01C2 ; }
01C2 ;
01C2 ; #ifdef Debug
01C2 ; ICMP_DisplayHeader(MainBufferRd_Rx, MainBufferWr_Rx); //
01C2 20910000 lds R18,_MainBufferWr_Rx
01C6 30910100 lds R19,_MainBufferWr_Rx+1
01CA 00910000 lds R16,_MainBufferRd_Rx
01CE 10910100 lds R17,_MainBufferRd_Rx+1
01D2 16DF xcall _ICMP_DisplayHeader
01D4 .dbline 145
01D4 ; #endif
01D4 ;
01D4 ; MainBufferRd_Rx += sizeof(T_ICMP_Header); //
01D4 80910000 lds R24,_MainBufferRd_Rx
01D8 90910100 lds R25,_MainBufferRd_Rx+1
01DC 0896 adiw R24,8
01DE 90930100 sts _MainBufferRd_Rx+1,R25
01E2 80930000 sts _MainBufferRd_Rx,R24
01E6 .dbline 149
01E6 ;
01E6 ; // **********************
01E6 ;
01E6 ; if (ICMP_Header->Type == ICMP_ECHO_REQUEST)
01E6 E0910000 lds R30,_ICMP_Header
01EA F0910100 lds R31,_ICMP_Header+1
01EE 8081 ldd R24,z+0
01F0 8830 cpi R24,8
01F2 09F0 breq X3
01F4 92C0 xjmp L34
01F6 X3:
01F6 .dbline 150
01F6 ; { // PING
01F6 .dbline 151
01F6 ; if (IP_FireWalled())
01F6 0E940000 xcall _IP_FireWalled
01FA 0023 tst R16
01FC 29F0 breq L36
01FE .dbline 152
01FE ; {
01FE .dbline 154
01FE ; #ifdef Debug
01FE ; SendDebugRStr(icmp_str7);
01FE 00E0 ldi R16,<_icmp_str7
0200 10E0 ldi R17,>_icmp_str7
0202 0E940000 xcall _SendDebugRStr
0206 .dbline 156
0206 ; #endif
0206 ; return; // firewalled
0206 E4C0 xjmp L29
0208 L36:
0208 .dbline 161
0208 ; }
0208 ;
0208 ; // send a PONG - eeeewwwww
0208 ;
0208 ; IP_Header->ID = htons(IP_ID++);
0208 20900000 lds R2,_IP_ID
020C 30900100 lds R3,_IP_ID+1
0210 C101 movw R24,R2
0212 0196 adiw R24,1
0214 90930100 sts _IP_ID+1,R25
0218 80930000 sts _IP_ID,R24
021C 8101 movw R16,R2
021E 0E940000 xcall _htons
0222 E0910000 lds R30,_IP_Header
0226 F0910100 lds R31,_IP_Header+1
022A 1583 std z+5,R17
022C 0483 std z+4,R16
022E .dbline 164
022E ;
022E ; // first swap the ip addresses
022E ; dw = IP_Header->SourceIP.ip32;
022E 2484 ldd R2,z+12
0230 3584 ldd R3,z+13
0232 4684 ldd R4,z+14
0234 5784 ldd R5,z+15
0236 FE01 movw R30,R28
0238 2282 std z+2,R2
023A 3382 std z+3,R3
023C 4482 std z+4,R4
023E 5582 std z+5,R5
0240 .dbline 165
0240 ; IP_Header->SourceIP.ip32 = IP_Header->DestIP.ip32;
0240 E0910000 lds R30,_IP_Header
0244 F0910100 lds R31,_IP_Header+1
0248 2088 ldd R2,z+16
024A 3188 ldd R3,z+17
024C 4288 ldd R4,z+18
024E 5388 ldd R5,z+19
0250 2486 std z+12,R2
0252 3586 std z+13,R3
0254 4686 std z+14,R4
0256 5786 std z+15,R5
0258 .dbline 166
0258 ; IP_Header->DestIP.ip32 = dw;
0258 FE01 movw R30,R28
025A 2280 ldd R2,z+2
025C 3380 ldd R3,z+3
025E 4480 ldd R4,z+4
0260 5580 ldd R5,z+5
0262 E0910000 lds R30,_IP_Header
0266 F0910100 lds R31,_IP_Header+1
026A 208A std z+16,R2
026C 318A std z+17,R3
026E 428A std z+18,R4
0270 538A std z+19,R5
0272 .dbline 169
0272 ;
0272 ; // now the packet type
0272 ; ICMP_Header->Type = ICMP_ECHO_REPLY;
0272 2224 clr R2
0274 E0910000 lds R30,_ICMP_Header
0278 F0910100 lds R31,_ICMP_Header+1
027C 2082 std z+0,R2
027E .dbline 172
027E ;
027E ; // update checksums
027E ; ICMP_Header->Checksum = 0;
027E 3324 clr R3
0280 E0910000 lds R30,_ICMP_Header
0284 F0910100 lds R31,_ICMP_Header+1
0288 3382 std z+3,R3
028A 2282 std z+2,R2
028C .dbline 173
028C ; ICMP_Header->Checksum = htons(IP_Checksum1((char*)ICMP_Header, len));
028C 9501 movw R18,R10
028E 8F01 movw R16,R30
0290 0E940000 xcall _IP_Checksum1
0294 0E940000 xcall _htons
0298 E0910000 lds R30,_ICMP_Header
029C F0910100 lds R31,_ICMP_Header+1
02A0 1383 std z+3,R17
02A2 0283 std z+2,R16
02A4 .dbline 174
02A4 ; IP_Header->Checksum = 0;
02A4 2224 clr R2
02A6 3324 clr R3
02A8 E0910000 lds R30,_IP_Header
02AC F0910100 lds R31,_IP_Header+1
02B0 3386 std z+11,R3
02B2 2286 std z+10,R2
02B4 .dbline 175
02B4 ; IP_Header->Checksum = htons(IP_Checksum1((char*)IP_Header, (IP_Header->VerLen & 0x0f) << 2));
02B4 2081 ldd R18,z+0
02B6 3327 clr R19
02B8 2F70 andi R18,15
02BA 3070 andi R19,0
02BC 220F lsl R18
02BE 331F rol R19
02C0 220F lsl R18
02C2 331F rol R19
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -