📄 uip.lis
字号:
02A4 ;
02A4 ; /* If we have come this far, we have a full packet in the
02A4 ; buffer, so we allocate a pbuf and copy the packet into it. We
02A4 ; also reset the timer. */
02A4 ; uip_reasstmr = 0;
02A4 ; memcpy(BUF, FBUF, uip_reasslen);
02A4 ;
02A4 ; /* Pretend to be a "normal" (i.e., not fragmented) IP packet
02A4 ; from now on. */
02A4 ; BUF->ipoffset[0] = BUF->ipoffset[1] = 0;
02A4 ; BUF->len[0] = uip_reasslen >> 8;
02A4 ; BUF->len[1] = uip_reasslen & 0xff;
02A4 ; BUF->ipchksum = 0;
02A4 ; BUF->ipchksum = ~(uip_ipchksum());
02A4 ;
02A4 ; return uip_reasslen;
02A4 ; }
02A4 ; }
02A4 ;
02A4 ; nullreturn:
02A4 ; return 0;
02A4 ; }
02A4 ; #endif /* UIP_REASSEMBL */
02A4 ; /*-----------------------------------------------------------------------------------*/
02A4 ; static void
02A4 ; uip_add_rcv_nxt(u16_t n)
02A4 ; {
02A4 .dbline 472
02A4 ; uip_add32(uip_conn->rcv_nxt, n);
02A4 9501 movw R18,R10
02A6 0091AF01 lds R16,_uip_conn
02AA 1091B001 lds R17,_uip_conn+1
02AE 085F subi R16,248 ; offset = 8
02B0 1F4F sbci R17,255
02B2 0E940000 xcall _uip_add32
02B6 .dbline 473
02B6 ; uip_conn->rcv_nxt[0] = uip_acc32[0];
02B6 20904D00 lds R2,_uip_acc32
02BA E091AF01 lds R30,_uip_conn
02BE F091B001 lds R31,_uip_conn+1
02C2 2086 std z+8,R2
02C4 .dbline 474
02C4 ; uip_conn->rcv_nxt[1] = uip_acc32[1];
02C4 20904E00 lds R2,_uip_acc32+1
02C8 E091AF01 lds R30,_uip_conn
02CC F091B001 lds R31,_uip_conn+1
02D0 2186 std z+9,R2
02D2 .dbline 475
02D2 ; uip_conn->rcv_nxt[2] = uip_acc32[2];
02D2 20904F00 lds R2,_uip_acc32+2
02D6 E091AF01 lds R30,_uip_conn
02DA F091B001 lds R31,_uip_conn+1
02DE 2286 std z+10,R2
02E0 .dbline 476
02E0 ; uip_conn->rcv_nxt[3] = uip_acc32[3];
02E0 20905000 lds R2,_uip_acc32+3
02E4 E091AF01 lds R30,_uip_conn
02E8 F091B001 lds R31,_uip_conn+1
02EC 2386 std z+11,R2
02EE .dbline -2
02EE L57:
02EE 0E940000 xcall pop_gset3x
02F2 .dbline 0 ; func end
02F2 0895 ret
02F4 .dbsym r n 10 s
02F4 .dbend
02F4 .dbfunc e uip_process _uip_process fV
02F4 ; m -> R14
02F4 ; uip_connr -> y+0
02F4 ; flag -> R10
.even
02F4 _uip_process::
02F4 0E940000 xcall push_gset5x
02F8 A02E mov R10,R16
02FA 2297 sbiw R28,2
02FC .dbline -1
02FC .dbline 481
02FC ; }
02FC ; /*-----------------------------------------------------------------------------------*/
02FC ; void
02FC ; uip_process(u8_t flag)
02FC ; {
02FC .dbline 482
02FC ; register struct uip_conn *uip_connr = uip_conn;
02FC 2090AF01 lds R2,_uip_conn
0300 3090B001 lds R3,_uip_conn+1
0304 3982 std y+1,R3
0306 2882 std y+0,R2
0308 .dbline 484
0308 ;
0308 ; uip_appdata = &uip_buf[40 + UIP_LLH_LEN];
0308 80E0 ldi R24,<_uip_buf+54
030A 90E0 ldi R25,>_uip_buf+54
030C 9093BC01 sts _uip_appdata+1,R25
0310 8093BB01 sts _uip_appdata,R24
0314 .dbline 488
0314 ;
0314 ;
0314 ; /* Check if we were invoked because of the perodic timer fireing. */
0314 ; if(flag == UIP_TIMER) {
0314 8A2D mov R24,R10
0316 8230 cpi R24,2
0318 09F0 breq X31
031A F4C0 xjmp L63
031C X31:
031C .dbline 488
031C .dbline 495
031C ; #if UIP_REASSEMBLY
031C ; if(uip_reasstmr != 0) {
031C ; --uip_reasstmr;
031C ; }
031C ; #endif /* UIP_REASSEMBLY */
031C ; /* Increase the initial sequence number. */
031C ; if(++iss[3] == 0) {
031C 80910900 lds R24,_iss+3
0320 8F5F subi R24,255 ; addi 1
0322 282E mov R2,R24
0324 20920900 sts _iss+3,R2
0328 8823 tst R24
032A A9F4 brne L65
032C .dbline 495
032C .dbline 496
032C ; if(++iss[2] == 0) {
032C 80910800 lds R24,_iss+2
0330 8F5F subi R24,255 ; addi 1
0332 282E mov R2,R24
0334 20920800 sts _iss+2,R2
0338 8823 tst R24
033A 69F4 brne L68
033C .dbline 496
033C .dbline 497
033C ; if(++iss[1] == 0) {
033C 80910700 lds R24,_iss+1
0340 8F5F subi R24,255 ; addi 1
0342 282E mov R2,R24
0344 20920700 sts _iss+1,R2
0348 8823 tst R24
034A 29F4 brne L71
034C .dbline 497
034C .dbline 498
034C ; ++iss[0];
034C 80910600 lds R24,_iss
0350 8F5F subi R24,255 ; addi 1
0352 80930600 sts _iss,R24
0356 .dbline 499
0356 ; }
0356 L71:
0356 .dbline 500
0356 ; }
0356 L68:
0356 .dbline 501
0356 ; }
0356 L65:
0356 .dbline 502
0356 ; uip_len = 0;
0356 2224 clr R2
0358 3324 clr R3
035A 3092B601 sts _uip_len+1,R3
035E 2092B501 sts _uip_len,R2
0362 .dbline 503
0362 ; if(uip_connr->tcpstateflags == TIME_WAIT ||
0362 E881 ldd R30,y+0
0364 F981 ldd R31,y+1
0366 218C ldd R2,z+25
0368 3324 clr R3
036A 822D mov R24,R2
036C 8730 cpi R24,7
036E 11F0 breq L76
0370 8530 cpi R24,5
0372 A1F4 brne L74
0374 L76:
0374 .dbline 504
0374 ; uip_connr->tcpstateflags == FIN_WAIT_2) {
0374 .dbline 505
0374 ; ++(uip_connr->timer);
0374 8881 ldd R24,y+0
0376 9981 ldd R25,y+1
0378 4A96 adiw R24,26
037A FC01 movw R30,R24
037C 8081 ldd R24,z+0
037E 8F5F subi R24,255 ; addi 1
0380 8083 std z+0,R24
0382 .dbline 506
0382 ; if(uip_connr->timer == UIP_TIME_WAIT_TIMEOUT) {
0382 E881 ldd R30,y+0
0384 F981 ldd R31,y+1
0386 828D ldd R24,z+26
0388 8837 cpi R24,120
038A 11F0 breq X32
038C 0C944A0B xjmp L112
0390 X32:
0390 .dbline 506
0390 .dbline 507
0390 ; uip_connr->tcpstateflags = CLOSED;
0390 2224 clr R2
0392 E881 ldd R30,y+0
0394 F981 ldd R31,y+1
0396 218E std z+25,R2
0398 .dbline 508
0398 ; }
0398 .dbline 509
0398 0C944A0B xjmp L112
039C L74:
039C .dbline 509
039C ; } else if(uip_connr->tcpstateflags != CLOSED) {
039C E881 ldd R30,y+0
039E F981 ldd R31,y+1
03A0 218C ldd R2,z+25
03A2 2220 tst R2
03A4 11F4 brne X33
03A6 0C944A0B xjmp L112
03AA X33:
03AA .dbline 509
03AA .dbline 513
03AA ; /* If the connection has outstanding data, we increase the
03AA ; connection's timer and see if it has reached the RTO value
03AA ; in which case we retransmit. */
03AA ; if(uip_outstanding(uip_connr)) {
03AA E881 ldd R30,y+0
03AC F981 ldd R31,y+1
03AE 2088 ldd R2,z+16
03B0 3188 ldd R3,z+17
03B2 2220 tst R2
03B4 19F4 brne X4
03B6 3320 tst R3
03B8 09F4 brne X34
03BA 8CC0 xjmp L81
03BC X34:
03BC X4:
03BC .dbline 513
03BC .dbline 514
03BC ; if(uip_connr->timer-- == 0) {
03BC 8881 ldd R24,y+0
03BE 9981 ldd R25,y+1
03C0 4A96 adiw R24,26
03C2 FC01 movw R30,R24
03C4 4080 ldd R4,z+0
03C6 842D mov R24,R4
03C8 8150 subi R24,1
03CA 8083 std z+0,R24
03CC 4420 tst R4
03CE 11F0 breq X35
03D0 0C944A0B xjmp L112
03D4 X35:
03D4 .dbline 514
03D4 .dbline 515
03D4 ; if(uip_connr->nrtx == UIP_MAXRTX ||
03D4 E881 ldd R30,y+0
03D6 F981 ldd R31,y+1
03D8 838D ldd R24,z+27
03DA 8830 cpi R24,8
03DC 71F0 breq L87
03DE E881 ldd R30,y+0
03E0 F981 ldd R31,y+1
03E2 218C ldd R2,z+25
03E4 3324 clr R3
03E6 822D mov R24,R2
03E8 8230 cpi R24,2
03EA 11F0 breq L88
03EC 8130 cpi R24,1
03EE 99F4 brne L85
03F0 L88:
03F0 E881 ldd R30,y+0
03F2 F981 ldd R31,y+1
03F4 838D ldd R24,z+27
03F6 8330 cpi R24,3
03F8 71F4 brne L85
03FA L87:
03FA .dbline 518
03FA ; ((uip_connr->tcpstateflags == SYN_SENT ||
03FA ; uip_connr->tcpstateflags == SYN_RCVD) &&
03FA ; uip_connr->nrtx == UIP_MAXSYNRTX)) {
03FA .dbline 519
03FA ; uip_connr->tcpstateflags = CLOSED;
03FA 2224 clr R2
03FC E881 ldd R30,y+0
03FE F981 ldd R31,y+1
0400 218E std z+25,R2
0402 .dbline 524
0402 ;
0402 ; /* We call UIP_APPCALL() with uip_flags set to
0402 ; UIP_TIMEDOUT to inform the application that the
0402 ; connection has timed out. */
0402 ; uip_flags = UIP_TIMEDOUT;
0402 80E8 ldi R24,128
0404 80932000 sts _uip_flags,R24
0408 .dbline 525
0408 ; UIP_APPCALL();
0408 0E940000 xcall _httpd_appcall
040C .dbline 528
040C ;
040C ; /* We also send a reset packet to the remote host. */
040C ; BUF->flags = TCP_RST | TCP_ACK;
040C 84E1 ldi R24,20
040E 8093EC01 sts _uip_buf+14+33,R24
0412 .dbline 529
0412 ; goto tcp_send_nodata;
0412 0C94760A xjmp L91
0416 L85:
0416 .dbline 533
0416 ; }
0416 ;
0416 ; /* Exponential backoff. */
0416 ; uip_connr->timer = UIP_RTO << (uip_connr->nrtx > 4?
0416 84E0 ldi R24,4
0418 E881 ldd R30,y+0
041A F981 ldd R31,y+1
041C 238C ldd R2,z+27
041E 8215 cp R24,R2
0420 18F4 brsh L92
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -