📄 tcpip.lst
字号:
\ 0000E2 0424 JEQ ??ProcessEthIAFrame_4
\ 0000E4 053C JMP ??ProcessEthIAFrame_1
398 {
399 case PROT_ICMP :
400 ProcessICMPFrame();
\ ??ProcessEthIAFrame_3:
\ 0000E6 B012.... CALL #ProcessICMPFrame
\ 0000EA 023C JMP ??ProcessEthIAFrame_1
401 break;
402 case PROT_TCP :
403 ProcessTCPFrame();
\ ??ProcessEthIAFrame_4:
\ 0000EC B012.... CALL #ProcessTCPFrame
404 break;
405 case PROT_UDP : // not implemented!
406 break;
407 }
408 }
409 break;
410 }
411 }
412 }
\ ??ProcessEthIAFrame_1:
\ 0000F0 2152 ADD.W #0x4, SP
\ 0000F2 3A41 POP.W R10
\ 0000F4 3041 RET
413 //------------------------------------------------------------------------------
414 // easyWEB internal function
415 // we've just rec'd an ICMP-frame (Internet Control Message Protocol)
416 // check what to do and branch to the appropriate sub-function
417 //------------------------------------------------------------------------------
\ In segment CODE, align 2
418 static void ProcessICMPFrame(void)
\ ProcessICMPFrame:
419 {
\ 000000 0A12 PUSH.W R10
420 unsigned int ICMPTypeAndCode;
421
422 ICMPTypeAndCode = ReadFrameBE8900(); // get Message Type and Code
\ 000002 B012.... CALL #ReadFrameBE8900
\ 000006 0A4C MOV.W R12, R10
423 ReadFrameBE8900(); // ignore ICMP checksum
\ 000008 B012.... CALL #ReadFrameBE8900
424
425 switch (ICMPTypeAndCode >> 8) // check type
\ 00000C 8A10 SWPB R10
\ 00000E 3AF0FF00 AND.W #0xff, R10
\ 000012 7A82 SUB.B #0x8, R10
\ 000014 0220 JNE ??ProcessICMPFrame_1
426 {
427 case ICMP_ECHO : // is echo request?
428 PrepareICMP_ECHO_REPLY(); // echo as much as we can...
\ 000016 B012.... CALL #PrepareICMP_ECHO_REPLY
429 break;
430 }
431 }
\ ??ProcessICMPFrame_1:
\ 00001A 3A41 POP.W R10
\ 00001C 3041 RET
432 //------------------------------------------------------------------------------
433 // easyWEB internal function
434 // we've just rec'd an TCP-frame (Transmission Control Protocol)
435 // this function mainly implements the TCP state machine according to RFC793
436 //------------------------------------------------------------------------------
\ In segment CODE, align 2
437 static void ProcessTCPFrame(void)
\ ProcessTCPFrame:
438 {
\ 000000 0A12 PUSH.W R10
\ 000002 0B12 PUSH.W R11
\ 000004 0812 PUSH.W R8
\ 000006 0912 PUSH.W R9
\ 000008 0612 PUSH.W R6
\ 00000A 0712 PUSH.W R7
\ 00000C 0412 PUSH.W R4
439 unsigned int TCPSegSourcePort; // segment's source port
440 unsigned int TCPSegDestPort; // segment's destination port
441 unsigned long TCPSegSeq; // segment's sequence number
442 unsigned long TCPSegAck; // segment's acknowledge number
443 unsigned int TCPCode; // TCP code and header length
444 unsigned char TCPHeaderSize; // real TCP header length
445 unsigned int NrOfDataBytes; // real number of data
446
447 TCPSegSourcePort = ReadFrameBE8900(); // get ports
\ 00000E B012.... CALL #ReadFrameBE8900
\ 000012 074C MOV.W R12, R7
448 TCPSegDestPort = ReadFrameBE8900();
\ 000014 B012.... CALL #ReadFrameBE8900
449
450 if (TCPSegDestPort != TCPLocalPort) return; // drop segment if port doesn't match
\ 000018 1C92.... CMP.W &TCPLocalPort, R12
\ 00001C .... JEQ $+6
\ 00001E 3040.... BR #??ProcessTCPFrame_0
451
452 TCPSegSeq = (unsigned long)ReadFrameBE8900() << 16; // get segment sequence nr.
\ 000022 B012.... CALL #ReadFrameBE8900
\ 000026 084C MOV.W R12, R8
\ 000028 0943 MOV.W #0x0, R9
\ 00002A 0948 MOV.W R8, R9
\ 00002C 0843 MOV.W #0x0, R8
453 TCPSegSeq |= ReadFrameBE8900();
\ 00002E B012.... CALL #ReadFrameBE8900
\ 000032 0D43 MOV.W #0x0, R13
\ 000034 08DC BIS.W R12, R8
\ 000036 09DD BIS.W R13, R9
454
455 TCPSegAck = (unsigned long)ReadFrameBE8900() << 16; // get segment acknowledge nr.
\ 000038 B012.... CALL #ReadFrameBE8900
\ 00003C 0A4C MOV.W R12, R10
\ 00003E 0B43 MOV.W #0x0, R11
\ 000040 0B4A MOV.W R10, R11
\ 000042 0A43 MOV.W #0x0, R10
456 TCPSegAck |= ReadFrameBE8900();
\ 000044 B012.... CALL #ReadFrameBE8900
\ 000048 0D43 MOV.W #0x0, R13
\ 00004A 0ADC BIS.W R12, R10
\ 00004C 0BDD BIS.W R13, R11
457
458 TCPCode = ReadFrameBE8900(); // get control bits, header length...
\ 00004E B012.... CALL #ReadFrameBE8900
\ 000052 064C MOV.W R12, R6
459
460 TCPHeaderSize = (TCPCode & DATA_OFS_MASK) >> 10; // header length in bytes
\ 000054 0C46 MOV.W R6, R12
\ 000056 3CF000F0 AND.W #0xf000, R12
\ 00005A 8C10 SWPB R12
\ 00005C 3CF0FF00 AND.W #0xff, R12
\ 000060 0C11 RRA.W R12
\ 000062 0C11 RRA.W R12
461 NrOfDataBytes = RecdIPFrameLength - IP_HEADER_SIZE - TCPHeaderSize; // seg. text length
\ 000064 1442.... MOV.W &RecdIPFrameLength, R4
\ 000068 3450ECFF ADD.W #0xffec, R4
\ 00006C 3CF0FF00 AND.W #0xff, R12
\ 000070 048C SUB.W R12, R4
462
463 if (NrOfDataBytes > MAX_TCP_RX_DATA_SIZE) return; // drop, packet too large for us :'(
\ 000072 34901902 CMP.W #0x219, R4
\ 000076 .... JNC $+6
\ 000078 3040.... BR #??ProcessTCPFrame_0
464
465 if (TCPHeaderSize > TCP_HEADER_SIZE) // ignore options if any
\ 00007C 7C901500 CMP.B #0x15, R12
\ 000080 0628 JNC ??ProcessTCPFrame_1
466 DummyReadFrame8900(TCPHeaderSize - TCP_HEADER_SIZE);
\ 000082 3CF0FF00 AND.W #0xff, R12
\ 000086 3C50ECFF ADD.W #0xffec, R12
\ 00008A B012.... CALL #DummyReadFrame8900
467
468 switch (TCPStateMachine) // implement the TCP state machine
\ ??ProcessTCPFrame_1:
\ 00008E 5E42.... MOV.B &TCPStateMachine, R14
\ 000092 4E83 SUB.B #0x0, R14
\ 000094 0524 JEQ ??ProcessTCPFrame_2
\ 000096 5E83 SUB.B #0x1, R14
\ 000098 3E24 JEQ ??ProcessTCPFrame_3
\ 00009A 5E83 SUB.B #0x1, R14
\ 00009C 8B24 JEQ ??ProcessTCPFrame_4
\ 00009E F73C JMP ??ProcessTCPFrame_5
469 { // RFC793
470 case CLOSED :
471 if (!(TCPCode & TCP_CODE_RST))
\ ??ProcessTCPFrame_2:
\ 0000A0 26B2 BIT.W #0x4, R6
\ 0000A2 EE2D JC ??ProcessTCPFrame_0
472 {
473 TCPRemotePort = TCPSegSourcePort; // get remote TCP port
\ 0000A4 8247.... MOV.W R7, &TCPRemotePort
474
475 RemoteMAC[0] = RecdFrameMAC[0]; // save opponents MAC and IP
\ 0000A8 9242........ MOV.W &RecdFrameMAC, &RemoteMAC
476 RemoteMAC[1] = RecdFrameMAC[1]; // for later use
\ 0000AE 9242........ MOV.W &RecdFrameMAC + 2, &RemoteMAC + 2
477 RemoteMAC[2] = RecdFrameMAC[2];
\ 0000B4 9242........ MOV.W &RecdFrameMAC + 4, &RemoteMAC + 4
478 RemoteIP[0] = RecdFrameIP[0];
\ 0000BA 9242........ MOV.W &RecdFrameIP, &RemoteIP
479 RemoteIP[1] = RecdFrameIP[1];
\ 0000C0 9242........ MOV.W &RecdFrameIP + 2, &RemoteIP + 2
480
481 if (TCPCode & TCP_CODE_ACK) // make the reset sequence
\ 0000C6 36B01000 BIT.W #0x10, R6
\ 0000CA 0A28 JNC ??ProcessTCPFrame_6
482 { // acceptable to the other
483 PrepareTCP_FRAME(TCPSegAck, 0, TCP_CODE_RST); // TCP
\ 0000CC 30120400 PUSH.W #0x4
\ 0000D0 0E43 MOV.W #0x0, R14
\ 0000D2 0F43 MOV.W #0x0, R15
\ 0000D4 0C4A MOV.W R10, R12
\ 0000D6 0D4B MOV.W R11, R13
\ 0000D8 B012.... CALL #PrepareTCP_FRAME
\ 0000DC 2153 ADD.W #0x2, SP
\ 0000DE D03D JMP ??ProcessTCPFrame_0
484 }
485 else
486 {
487 TCPAckNr = TCPSegSeq + NrOfDataBytes;
\ ??ProcessTCPFrame_6:
\ 0000E0 0E44 MOV.W R4, R14
\ 0000E2 0F43 MOV.W #0x0, R15
\ 0000E4 085E ADD.W R14, R8
\ 0000E6 096F ADDC.W R15, R9
\ 0000E8 8248.... MOV.W R8, &TCPAckNr
\ 0000EC 8249.... MOV.W R9, &TCPAckNr + 2
488 if (TCPCode & (TCP_CODE_SYN | TCP_CODE_FIN)) TCPAckNr++;
\ 0000F0 76B00300 BIT.B #0x3, R6
\ 0000F4 0424 JEQ ??ProcessTCPFrame_7
\ 0000F6 9253.... ADD.W #0x1, &TCPAckNr
\ 0000FA 8263.... ADDC.W #0x0, &TCPAckNr + 2
489 PrepareTCP_FRAME(0, TCPAckNr, TCP_CODE_RST | TCP_CODE_ACK);
\ ??ProcessTCPFrame_7:
\ 0000FE 30121400 PUSH.W #0x14
\ 000102 1E42.... MOV.W &TCPAckNr, R14
\ 000106 1F42.... MOV.W &TCPAckNr + 2, R15
\ 00010A 0C43 MOV.W #0x0, R12
\ 00010C 0D43 MOV.W #0x0, R13
\ 00010E B012.... CALL #PrepareTCP_FRAME
\ 000112 2153 ADD.W #0x2, SP
\ 000114 B53D JMP ??ProcessTCPFrame_0
490 }
491 }
492 break;
493 case LISTENING :
494 if (!(TCPCode & TCP_CODE_RST)) // ignore segment containing RST
\ ??ProcessTCPFrame_3:
\ 000116 26B2 BIT.W #0x4, R6
\ 000118 B32D JC ??ProcessTCPFrame_0
495 {
496 TCPRemotePort = TCPSegSourcePort; // get remote TCP port
\ 00011A 8247.... MOV.W R7, &TCPRemotePort
497
498 RemoteMAC[0] = RecdFrameMAC[0]; // save opponents MAC and IP
\ 00011E 9242........ MOV.W &RecdFrameMAC, &RemoteMAC
499 RemoteMAC[1] = RecdFrameMAC[1]; // for later use
\ 000124 9242........ MOV.W &RecdFrameMAC + 2, &RemoteMAC + 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -