📄 tcpip.lst
字号:
\ RecdIPFrameLength:
\ 000000 DS8 2
66
67 // the next 3 buffers must be word-aligned!
\ In segment DATA16_Z, align 2, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
68 unsigned int TxFrame1Mem[(ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE +
\ TxFrame1Mem:
\ 000000 DS8 822
69 MAX_TCP_TX_DATA_SIZE + 1) >> 1];
\ In segment DATA16_Z, align 2, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
70 static unsigned int TxFrame2Mem[(ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE + 1) >> 1];
\ TxFrame2Mem:
\ 000000 DS8 74
\ In segment DATA16_Z, align 2, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
71 unsigned int RxTCPBufferMem[(MAX_TCP_RX_DATA_SIZE + 1) >> 1]; // space for incoming TCP-data
\ RxTCPBufferMem:
\ 000000 DS8 536
72 //------------------------------------------------------------------------------
73 // Handlers for incoming frames
74 static void ProcessEthBroadcastFrame(void);
75 static void ProcessEthIAFrame(void);
76 static void ProcessICMPFrame(void);
77 static void ProcessTCPFrame(void);
78
79 // fill TX-buffers
80 static void PrepareARP_REQUEST(void);
81 static void PrepareARP_ANSWER(void);
82 static void PrepareICMP_ECHO_REPLY(void);
83
84 static void PrepareTCP_FRAME(unsigned long seqnr, unsigned long acknr,
85 unsigned int TCPCode);
86 static void PrepareTCP_DATA_FRAME(void);
87
88 // general help functions
89 static void TCPStartRetryTimer(void);
90 static void TCPStartFinTimer(void);
91 static void TCPRestartTimer(void);
92 static void TCPStopTimer(void);
93 static void TCPHandleRetransmission(void);
94 static void TCPHandleTimeout(void);
95 static unsigned int CalcChecksum(void *Start, unsigned int Count,
96 unsigned char IsTCP);
97 //------------------------------------------------------------------------------
98 // easyWEB-API function
99 // initalizes the LAN-controller, reset flags, starts timer-ISR
100 //------------------------------------------------------------------------------
\ In segment CODE, align 2
101 void TCPLowLevelInit(void)
\ TCPLowLevelInit:
102 {
103 BCSCTL1 &= ~DIVA0; // ACLK = XT1 / 4 = 2 MHz
\ 000000 F2C010005700 BIC.B #0x10, &0x57
104 BCSCTL1 |= DIVA1;
\ 000006 F2D020005700 BIS.B #0x20, &0x57
105 TACTL = ID_3 + TASSEL_1 + MC_2 + TAIE; // stop timer, use ACLK / 8 = 250 kHz, gen. int.
\ 00000C B240E2016001 MOV.W #0x1e2, &0x160
106 // start timer in continuous up-mode
107 Init8900();
\ 000012 B012.... CALL #Init8900
108 TransmitControl = 0;
\ 000016 C243.... MOV.B #0x0, &TransmitControl
109 TCPFlags = 0;
\ 00001A C243.... MOV.B #0x0, &TCPFlags
110 TCPStateMachine = CLOSED;
\ 00001E C243.... MOV.B #0x0, &TCPStateMachine
111 SocketStatus = 0;
\ 000022 C243.... MOV.B #0x0, &SocketStatus
112 }
\ 000026 3041 RET
113 //------------------------------------------------------------------------------
114 // easyWEB-API function
115 // does a passive open (listen on 'MyIP:TCPLocalPort' for an incoming
116 // connection)
117 //------------------------------------------------------------------------------
\ In segment CODE, align 2
118 void TCPPassiveOpen(void)
\ TCPPassiveOpen:
119 {
120 if (TCPStateMachine == CLOSED)
\ 000000 C293.... CMP.B #0x0, &TCPStateMachine
\ 000004 0620 JNE ??TCPPassiveOpen_0
121 {
122 TCPFlags &= ~TCP_ACTIVE_OPEN; // let's do a passive open!
\ 000006 D2C3.... BIC.B #0x1, &TCPFlags
123 TCPStateMachine = LISTENING;
\ 00000A D243.... MOV.B #0x1, &TCPStateMachine
124 SocketStatus = SOCK_ACTIVE; // reset, socket now active
\ 00000E D243.... MOV.B #0x1, &SocketStatus
125 }
126 }
\ ??TCPPassiveOpen_0:
\ 000012 3041 RET
127 //------------------------------------------------------------------------------
128 // easyWEB-API function
129 // does an active open (tries to establish a connection between
130 // 'MyIP:TCPLocalPort' and 'RemoteIP:TCPRemotePort')
131 //------------------------------------------------------------------------------
\ In segment CODE, align 2
132 void TCPActiveOpen(void)
\ TCPActiveOpen:
133 {
134 if ((TCPStateMachine == CLOSED) || (TCPStateMachine == LISTENING))
\ 000000 C293.... CMP.B #0x0, &TCPStateMachine
\ 000004 0324 JEQ ??TCPActiveOpen_0
\ 000006 D293.... CMP.B #0x1, &TCPStateMachine
\ 00000A 0C20 JNE ??TCPActiveOpen_1
135 {
136 TCPFlags |= TCP_ACTIVE_OPEN; // let's do an active open!
\ ??TCPActiveOpen_0:
\ 00000C D2D3.... BIS.B #0x1, &TCPFlags
137 TCPFlags &= ~IP_ADDR_RESOLVED; // we haven't opponents MAC yet
\ 000010 E2C3.... BIC.B #0x2, &TCPFlags
138
139 PrepareARP_REQUEST(); // ask for MAC by sending a broadcast
\ 000014 B012.... CALL #PrepareARP_REQUEST
140 LastFrameSent = ARP_REQUEST;
\ 000018 C243.... MOV.B #0x0, &LastFrameSent
141 TCPStartRetryTimer();
\ 00001C B012.... CALL #TCPStartRetryTimer
142 SocketStatus = SOCK_ACTIVE; // reset, socket now active
\ 000020 D243.... MOV.B #0x1, &SocketStatus
143 }
144 }
\ ??TCPActiveOpen_1:
\ 000024 3041 RET
145 //------------------------------------------------------------------------------
146 // easyWEB-API function
147 // closes an open connection
148 //------------------------------------------------------------------------------
\ In segment CODE, align 2
149 void TCPClose(void)
\ TCPClose:
150 {
151 switch (TCPStateMachine)
\ 000000 5E42.... MOV.B &TCPStateMachine, R14
\ 000004 5E83 SUB.B #0x1, R14
\ 000006 0724 JEQ ??TCPClose_0
\ 000008 5E83 SUB.B #0x1, R14
\ 00000A 0524 JEQ ??TCPClose_0
\ 00000C 5E83 SUB.B #0x1, R14
\ 00000E 0A24 JEQ ??TCPClose_1
\ 000010 5E83 SUB.B #0x1, R14
\ 000012 0824 JEQ ??TCPClose_1
\ 000014 3041 RET
152 {
153 case LISTENING :
154 case SYN_SENT :
155 TCPStateMachine = CLOSED;
\ ??TCPClose_0:
\ 000016 C243.... MOV.B #0x0, &TCPStateMachine
156 TCPFlags = 0;
\ 00001A C243.... MOV.B #0x0, &TCPFlags
157 SocketStatus = 0;
\ 00001E C243.... MOV.B #0x0, &SocketStatus
\ 000022 3041 RET
158 break;
159 case SYN_RECD :
160 case ESTABLISHED :
161 TCPFlags |= TCP_CLOSE_REQUESTED;
\ ??TCPClose_1:
\ 000024 F2D01000.... BIS.B #0x10, &TCPFlags
162 break;
163 }
164 }
\ 00002A 3041 RET
165 //------------------------------------------------------------------------------
166 // easyWEB-API function
167 // releases the receive-buffer and allows easyWEB to store new data
168 // NOTE: rx-buffer MUST be released periodically, else the other TCP
169 // get no ACKs for the data it sent
170 //------------------------------------------------------------------------------
\ In segment CODE, align 2
171 void TCPReleaseRxBuffer(void)
\ TCPReleaseRxBuffer:
172 {
173 SocketStatus &= ~SOCK_DATA_AVAILABLE;
\ 000000 E2C2.... BIC.B #0x4, &SocketStatus
174 }
\ 000004 3041 RET
175 //------------------------------------------------------------------------------
176 // easyWEB-API function
177 // transmitts data stored in 'TCP_TX_BUF'
178 // NOTE: * number of bytes to transmit must have been written to 'TCPTxDataCount'
179 // * data-count MUST NOT exceed 'MAX_TCP_TX_DATA_SIZE'
180 //------------------------------------------------------------------------------
\ In segment CODE, align 2
181 void TCPTransmitTxBuffer(void)
\ TCPTransmitTxBuffer:
182 {
183 if ((TCPStateMachine == ESTABLISHED) || (TCPStateMachine == CLOSE_WAIT))
\ 000000 E292.... CMP.B #0x4, &TCPStateMachine
\ 000004 0424 JEQ ??TCPTransmitTxBuffer_0
\ 000006 F2900700.... CMP.B #0x7, &TCPStateMachine
\ 00000C 1820 JNE ??TCPTransmitTxBuffer_1
184 if (SocketStatus & SOCK_TX_BUF_RELEASED)
\ ??TCPTransmitTxBuffer_0:
\ 00000E F2B2.... BIT.B #0x8, &SocketStatus
\ 000012 1528 JNC ??TCPTransmitTxBuffer_1
185 {
186 SocketStatus &= ~SOCK_TX_BUF_RELEASED; // occupy tx-buffer
\ 000014 F2C2.... BIC.B #0x8, &SocketStatus
187 TCPUNASeqNr += TCPTxDataCount; // advance UNA
\ 000018 1E42.... MOV.W &TCPTxDataCount, R14
\ 00001C 0F43 MOV.W #0x0, R15
\ 00001E 825E.... ADD.W R14, &TCPUNASeqNr
\ 000022 826F.... ADDC.W R15, &TCPUNASeqNr + 2
188
189 TxFrame1Size = ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE + TCPTxDataCount;
\ 000026 1F42.... MOV.W &TCPTxDataCount, R15
\ 00002A 3F503600 ADD.W #0x36, R15
\ 00002E 824F.... MOV.W R15, &TxFrame1Size
190 TransmitControl |= SEND_FRAME1;
\ 000032 D2D3.... BIS.B #0x1, &TransmitControl
191
192 LastFrameSent = TCP_DATA_FRAME;
\ 000036 E242.... MOV.B #0x4, &LastFrameSent
193 TCPStartRetryTimer();
\ 00003A B012.... CALL #TCPStartRetryTimer
194 }
195 }
\ ??TCPTransmitTxBuffer_1:
\ 00003E 3041 RET
196 //------------------------------------------------------------------------------
197 // easyWEB's 'main()'-function
198 // must be called from user program periodically (the often - the better)
199 // handles network, TCP/IP-stack and user events
200 //------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -