?? ip.s
字號(hào):
ld R17,Z+
movw R10,R30
xcall _ntohs
movw R2,R16
clr R4
clr R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
L123:
.dbline 283
movw R24,R12
adiw R24,1
movw R12,R24
L125:
.dbline 283
;
; for (i = 0; i < (len >> 1); i++) checksum += (u32)ntohs(*q++);
movw R2,R14
lsr R3
ror R2
cp R12,R2
cpc R13,R3
brlo L122
.dbline 284
; if (len & 1) checksum += (u32)(ntohs(*q) & 0xff00);
sbrs R14,0
rjmp L126
.dbline 284
movw R30,R10
ldd R16,z+0
ldd R17,z+1
xcall _ntohs
movw R24,R16
andi R24,0
movw R2,R24
clr R4
clr R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
L126:
.dbline 286
;
; return checksum;
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
.dbline -2
L117:
adiw R28,4
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r q 10 ps
.dbsym l checksum 0 l
.dbsym r i 12 s
.dbsym r len 14 s
.dbsym r p 12 pc
.dbend
.dbfunc e IP_ChecksumFinalize _IP_ChecksumFinalize fs
; checksum -> y+4
.even
_IP_ChecksumFinalize::
xcall push_arg4
xcall push_gset2
.dbline -1
.dbline 290
; }
;
; u16 IP_ChecksumFinalize(u32 checksum)
; {
.dbline 291
; checksum = (checksum & 0x0000ffff) + ((checksum >> 16) & 0x0000ffff);
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
movw R2,R4
clr R4
clr R5
and R2,R20
and R3,R21
and R4,R22
and R5,R23
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R28
ldd R6,z+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
and R6,R20
and R7,R21
and R8,R22
and R9,R23
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+4,R6
std z+5,R7
std z+6,R8
std z+7,R9
.dbline 292
; if (checksum & 0xffff0000) checksum++;
ldi R20,0
ldi R21,0
ldi R22,255
ldi R23,255
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
and R2,R20
and R3,R21
and R4,R22
and R5,R23
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L129
.dbline 292
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
L129:
.dbline 293
; checksum = ~checksum;
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
com R2
com R3
com R4
com R5
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
.dbline 294
; return (u16)(checksum & 0x0000ffff);
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R16,R2
.dbline -2
L128:
xcall pop_gset2
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l checksum 4 l
.dbend
.dbfunc e IP_Checksum1 _IP_Checksum1 fs
; checksum -> y+0
; len -> R22,R23
; p -> R20,R21
.even
_IP_Checksum1::
xcall push_gset2
movw R22,R18
movw R20,R16
sbiw R28,4
.dbline -1
.dbline 298
; }
;
; u16 IP_Checksum1(char *p, u16 len)
; {
.dbline 299
; u32 checksum = IP_Checksum(p, len);
movw R18,R22
movw R16,R20
xcall _IP_Checksum
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 300
; return IP_ChecksumFinalize(checksum);
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
xcall _IP_ChecksumFinalize
.dbline -2
L131:
adiw R28,4
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l checksum 0 l
.dbsym r len 22 s
.dbsym r p 20 pc
.dbend
.dbfunc e IP_Checksum2 _IP_Checksum2 fs
; w -> y+4
; checksum -> y+0
; len -> R20,R21
; p -> R22,R23
.even
_IP_Checksum2::
xcall push_gset2
movw R20,R18
movw R22,R16
sbiw R28,6
.dbline -1
.dbline 304
; }
;
; u16 IP_Checksum2(char *p, u16 len)
; {
.dbline 321
; u16 w;
; u32 checksum;
;
; // the tcp and udp packet checksums needs a pseudo header bringing into the calculation.
; // the header is not sent with the packet though, it's just for checksum calc.
;
; // 0 1 2 3
; // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
; // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
; // | Source address |
; // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
; // | Destination address |
; // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
; // | zero | Protocol | UDP/TCP Length |
; // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
;
; checksum = IP_Checksum(p, len); // checksum the packet
movw R18,R20
movw R16,R22
xcall _IP_Checksum
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 323
; //
; checksum += IP_Checksum((char*)&IP_Header->SourceIP.ip32, 4); // now pull in the pseudo header
ldi R18,4
ldi R19,0
lds R16,_IP_Header
lds R17,_IP_Header+1
subi R16,244 ; offset = 12
sbci R17,255
xcall _IP_Checksum
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 324
; checksum += IP_Checksum((char*)&IP_Header->DestIP.ip32, 4); //
ldi R18,4
ldi R19,0
lds R16,_IP_Header
lds R17,_IP_Header+1
subi R16,240 ; offset = 16
sbci R17,255
xcall _IP_Checksum
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 325
; w = htons(IP_Header->Protocol); checksum += IP_Checksum((char*)&w, 2); //
lds R30,_IP_Header
lds R31,_IP_Header+1
ldd R16,z+9
clr R17
xcall _htons
std y+5,R17
std y+4,R16
.dbline 325
ldi R18,2
ldi R19,0
movw R16,R28
subi R16,252 ; offset = 4
sbci R17,255
xcall _IP_Checksum
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 326
; w = htons(len); checksum += IP_Checksum((char*)&w, 2); //
movw R16,R20
xcall _htons
std y+5,R17
std y+4,R16
.dbline 326
ldi R18,2
ldi R19,0
movw R16,R28
subi R16,252 ; offset = 4
sbci R17,255
xcall _IP_Checksum
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 328
; //
; return IP_ChecksumFinalize(checksum); // return the final checksum value
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
xcall _IP_ChecksumFinalize
.dbline -2
L132:
adiw R28,6
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l w 4 s
.dbsym l checksum 0 l
.dbsym r len 20 s
.dbsym r p 22 pc
.dbend
.dbfunc e IP_dec _IP_dec fV
; w -> R10,R11
; type -> R12
; len -> R14
.even
_IP_dec::
xcall push_gset5
sbiw R28,4
.dbline -1
.dbline 334
; }
;
; // **************************************************************************
;
; void IP_dec(void)
; {
.dbline 343
; // IP packet
;
; // RFC 791
; // http://www.freesoft.org/CIE/Course/Section3/
;
; u8 type, len;
; u16 w;
;
; IP_Header = (T_IP_Header*)(MainBuffer + MainBufferRd_Rx); // point to the IP header
ldi R24,<_MainBuffer
ldi R25,>_MainBuffer
lds R2,_MainBufferRd_Rx
lds R3,_MainBufferRd_Rx+1
add R2,R24
adc R3,R25
sts _IP_Header+1,R3
sts _IP_Header,R2
.dbline 345
; //
; w = MainBufferWr_Rx - MainBufferRd_Rx; // number of bytes we have
lds R2,_MainBufferRd_Rx
lds R3,_MainBufferRd_Rx+1
lds R10,_MainBufferWr_Rx
lds R11,_MainBufferWr_Rx+1
sub R10,R2
sbc R11,R3
.dbline 346
; if (w < sizeof(T_IP_Header)) return; // we don't have enough bytes for the ip header - drop the packet
movw R24,R10
cpi R24,20
ldi R30,0
cpc R25,R30
brsh L134
.dbline 346
xjmp L133
L134:
.dbline 348
; //
; if ((IP_Header->VerLen & 0xf0) != 0x40) return; // drop the packet as we're only programmed to deal with IP V4
lds R30,_IP_Header
lds R31,_IP_Header+1
ldd R24,z+0
andi R24,240
cpi R24,64
breq L136
.dbline 348
xjmp L133
L136:
.dbline 350
; //
; w = (IP_Header->VerLen & 0x0f) << 2; // i = length of header in bytes
lds R30,_IP_Header
lds R31,_IP_Header+1
ldd R24,z+0
clr R25
andi R24,15
andi R25,0
movw R10,R24
lsl R10
rol R11
lsl R10
rol R11
.dbline 351
; if (w < sizeof(T_IP_Header)) return; // error
movw R24,R10
cpi R24,20
ldi R30,0
cpc R25,R30
brsh L138
.dbline 351
xjmp L133
L138:
.dbline 352
; if (MainBufferWr_Rx < (MainBufferRd_Rx + w)) return; // we still don't have enough bytes for the ip header - drop the packet
lds R2,_MainBufferRd_Rx
lds R3,_MainBufferRd_Rx+1
add R2,R10
adc R3,R11
lds R4,_MainBufferWr_Rx
lds R5,_MainBufferWr_Rx+1
cp R4,R2
cpc R5,R3
brsh L140
.dbline 352
xjmp L133
L140:
.dbline 354
; //
; if ((!IP_Header->Checksum) || (IP_Checksum1((char *)IP_Header, w))) //
lds R30,_IP_Header
lds R31,_IP_Header+1
ldd R2,z+10
ldd R3,z+11
tst R2
brne X8
tst R3
breq L144
X8:
movw R18,R10
lds R16,_IP_Header
lds R17,_IP_Header+1
xcall _IP_Checksum1
cpi R16,0
cpc R16,R17
breq L142
X9:
L144:
.dbline 355
; { // invalid checksum
.dbline 357
; #ifdef Debug //
; SendDebugRStr(ip_str16); //
ldi R16,<_ip_str16
ldi R17,>_ip_str16
xcall _SendDebugRStr
.dbline 359
; #endif //
; return; //
xjmp L133
L142:
.dbline 362
; } //
; //
; w = ntohs(IP_Header->TotalLength); // total packet length
lds R30,_IP_Header
lds R31,_IP_Header+1
ldd R16,z+2
ldd R17,z+3
xcall _ntohs
movw R10,R16
.dbline 363
; if (MainBufferWr_Rx < (MainBufferRd_Rx + w)) return; // we still don't have enough bytes for the ip header - drop the packet
lds R2,_MainBufferRd_Rx
lds R3,_MainBufferRd_Rx+1
add R2,R16
adc R3,R17
lds R4,_MainBufferWr_Rx
lds R5,_MainBufferWr_Rx+1
cp R4,R2
cpc R5,R3
brsh L145
.dbline 363
xjmp L133
L145:
.dbline 364
; MainBufferWr_Rx = MainBufferRd_Rx + w; // just incase they have padded the packet out - this will drop the padding
lds R2,_MainBufferRd_Rx
lds R3,_MainBufferRd_Rx+1
add R2,R10
adc R3,R11
sts _MainBufferWr_Rx+1,R3
sts _MainBufferWr_Rx,R2
.dbline 366
; //
; if (IP_Header->SourceIP.ip32 == PPP.OUR_IP.ip32) return; // ahmmmmm, we sent this packet - must be in loop-back mode - drop it
lds R4,_PPP+13+2
lds R5,_PPP+13+2+1
lds R2,_PPP+13
lds R3,_PPP+13+1
lds R30,_IP_Header
lds R31,_IP_Header+1
ldd R6,z+12
ldd R7,z+13
ldd R8,z+14
ldd R9,z+15
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brne L147
.dbline 366
xjmp L133
L147:
.dbline 371
;
; // ********************************
;
; #ifdef Debug
; IP_DisplayProtocol(false, MainBufferWr_Rx);
lds R18,_MainBufferWr_Rx
lds R19,_MainBufferWr_Rx+1
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -