Rev 1249 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1249 | Rev 1254 | ||
---|---|---|---|
Line 13... | Line 13... | ||
13 | ;; Version 2, June 1991 ;; |
13 | ;; Version 2, June 1991 ;; |
14 | ;; ;; |
14 | ;; ;; |
15 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
15 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 16... | Line 16... | ||
16 | 16 | ||
17 | - | ||
18 | $Revision: 1249 $ |
- | |
19 | - | ||
20 | - | ||
21 | TCB_LISTEN equ 1 |
- | |
22 | TCB_SYN_SENT equ 2 |
- | |
23 | TCB_SYN_RECEIVED equ 3 |
- | |
24 | TCB_ESTABLISHED equ 4 |
- | |
25 | TCB_FIN_WAIT_1 equ 5 |
- | |
26 | TCB_FIN_WAIT_2 equ 6 |
- | |
27 | TCB_CLOSE_WAIT equ 7 |
- | |
28 | TCB_CLOSING equ 8 |
- | |
29 | TCB_LAST_ACK equ 9 |
- | |
30 | TCB_TIMED_WAIT equ 10 |
- | |
31 | TCB_CLOSED equ 11 |
- | |
32 | - | ||
33 | TH_FIN equ 1 shl 0 |
- | |
34 | TH_SYN equ 1 shl 1 |
- | |
35 | TH_RST equ 1 shl 2 |
- | |
36 | TH_PUSH equ 1 shl 3 |
- | |
37 | TH_ACK equ 1 shl 4 |
- | |
38 | TH_URG equ 1 shl 5 |
- | |
Line 39... | Line 17... | ||
39 | 17 | ||
40 | TWOMSL equ 10 ; # of secs to wait before closing socket |
18 | $Revision: 1254 $ |
- | 19 | ||
Line 41... | Line 20... | ||
41 | 20 | TCP_RETRIES equ 5 ; Number of times to resend a Packet |
|
Line 42... | Line 21... | ||
42 | TCP_RETRIES equ 5 ; Number of times to resend a Packet |
21 | TCP_PACKET_TTL equ 50 ; resend if not replied to in 1/100 s |
Line 71... | Line 50... | ||
71 | endg |
50 | endg |
Line 72... | Line 51... | ||
72 | 51 | ||
73 | align 4 |
52 | align 4 |
Line 74... | Line 53... | ||
74 | iglobal |
53 | iglobal |
Line 75... | Line 54... | ||
75 | 54 | ||
76 | TCBStateHandler: |
55 | stateHandler: |
77 | 56 | ||
78 | dd stateTCB_LISTEN |
57 | dd stateTCB_LISTEN |
Line 88... | Line 67... | ||
88 | dd stateTCB_CLOSED |
67 | dd stateTCB_CLOSED |
Line 89... | Line 68... | ||
89 | 68 | ||
Line 90... | Line -... | ||
90 | endg |
- | |
91 | - | ||
92 | - | ||
93 | macro inc_INET reg { |
- | |
94 | - | ||
95 | inc byte [reg + 0] |
- | |
96 | adc byte [reg + 1], 0 |
- | |
97 | adc byte [reg + 2], 0 |
- | |
98 | adc byte [reg + 3], 0 |
- | |
99 | - | ||
100 | } |
- | |
101 | - | ||
102 | - | ||
103 | macro add_INET reg { |
- | |
104 | - | ||
105 | rol ecx, 16 |
- | |
106 | adc byte [reg + 0], ch |
- | |
107 | adc byte [reg + 1], cl |
- | |
108 | rol ecx, 16 |
- | |
109 | adc byte [reg + 2], ch |
- | |
110 | adc byte [reg + 3], cl |
- | |
111 | - | ||
112 | } |
- | |
113 | - | ||
114 | 69 | endg |
|
115 | 70 | ||
116 | 71 | ||
117 | ;----------------------------------------------------------------- |
72 | ;----------------------------------------------------------------- |
118 | ; |
73 | ; |
Line 132... | Line 87... | ||
132 | mov edi, TCP_PACKETS_TX |
87 | mov edi, TCP_PACKETS_TX |
133 | mov ecx, 2*MAX_IP |
88 | mov ecx, 2*MAX_IP |
134 | rep stosd |
89 | rep stosd |
Line 135... | Line 90... | ||
135 | 90 | ||
- | 91 | init_queue TCP_IN_QUEUE |
|
- | 92 | ||
- | 93 | ; tcp_out_queue is a special type of queue |
|
136 | init_queue TCP_IN_QUEUE |
94 | xor eax, eax |
- | 95 | mov esi, TCP_OUT_QUEUE |
|
- | 96 | mov ecx, TCP_QUEUE_SIZE*tcp_out_queue_entry/4+1 |
|
Line 137... | Line 97... | ||
137 | init_queue TCP_OUT_QUEUE |
97 | rep stosd |
Line 138... | Line 98... | ||
138 | 98 | ||
Line 163... | Line 123... | ||
163 | jz .exit |
123 | jz .exit |
Line 164... | Line 124... | ||
164 | 124 | ||
165 | cmp [ebx + SOCKET_head.Type], IP_PROTO_TCP |
125 | cmp [ebx + SOCKET_head.Type], IP_PROTO_TCP |
Line 166... | Line 126... | ||
166 | jne .next_socket |
126 | jne .next_socket |
Line 167... | Line 127... | ||
167 | 127 | ||
168 | ; DEBUGF 1, "K : %x-%x: %x-%x-%x-%u\n", [ebx + SOCKET.PID]:2, [ebx + SOCKET.Number]:2, [ebx + SOCKET.LocalPort]:4, [ebx + SOCKET.RemoteIP], [ebx + SOCKET.RemotePort]:4, [ebx + SOCKET.TCBState] |
128 | ; DEBUGF 1, "K : %x-%x: %x-%x-%x-%u\n", [ebx + SOCKET.PID]:2, [ebx + SOCKET.Number]:2, [ebx + SOCKET.LocalPort]:4, [ebx + SOCKET.RemoteIP], [ebx + SOCKET.RemotePort]:4, [ebx + SOCKET.state] |
169 | 129 | ||
170 | cmp [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBTimer], 0 |
130 | cmp [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.timer], 0 |
171 | jne .decrement_tcb |
131 | jne .decrement_tcb |
Line 172... | Line 132... | ||
172 | cmp [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.wndsizeTimer], 0 |
132 | cmp [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.wndsizeTimer], 0 |
173 | jne .decrement_wnd |
133 | jne .decrement_wnd |
174 | jmp .next_socket |
134 | jmp .next_socket |
175 | 135 | ||
Line 176... | Line 136... | ||
176 | .decrement_tcb: |
136 | .decrement_tcb: |
177 | ; decrement it, delete socket if TCB timer = 0 & socket in timewait state |
137 | ; decrement it, delete socket if TCB timer = 0 & socket in timewait state |
Line 178... | Line 138... | ||
178 | dec [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBTimer] |
138 | dec [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.timer] |
179 | jnz .next_socket |
139 | jnz .next_socket |
180 | 140 | ||
Line 229... | Line 189... | ||
229 | 189 | ||
230 | .found_one: |
190 | .found_one: |
231 | dec [esi + tcp_out_queue_entry.ttl] |
191 | dec [esi + tcp_out_queue_entry.ttl] |
232 | jz .send_it |
192 | jz .send_it |
- | 193 | .find_next: |
|
233 | .find_next: |
194 | add esi, tcp_out_queue_entry.size |
234 | dec eax |
195 | dec eax |
- | 196 | jz .exit |
|
235 | jz .exit |
197 | test ecx, ecx |
- | 198 | jnz .loop |
|
Line 236... | Line 199... | ||
236 | jmp .loop |
199 | ret |
237 | 200 | ||
Line -... | Line 201... | ||
- | 201 | .send_it: |
|
238 | .send_it: |
202 | push eax ecx esi |
239 | push eax ecx esi |
203 | |
240 | 204 | mov ebx, [esi + tcp_out_queue_entry.owner] |
|
241 | push [esi + tcp_out_queue_entry.data_size] |
- | |
242 | push [esi + tcp_out_queue_entry.data_ptr] |
205 | push [esi + tcp_out_queue_entry.data_size] |
243 | mov ebx, [esi + tcp_out_queue_entry.owner] |
206 | push [esi + tcp_out_queue_entry.data_ptr] |
244 | 207 | DEBUGF 1,"Now sending TCP packet %x, size: %u, owner: %x, sendproc %x\n", [esp], [esp+4], ebx, [esi + tcp_out_queue_entry.sendproc] |
|
Line 245... | Line 208... | ||
245 | call [esi + tcp_out_queue_entry.sendproc] |
208 | call [esi + tcp_out_queue_entry.sendproc] |
246 | 209 | add esp, 8 |
|
- | 210 | pop esi ecx eax |
|
247 | pop esi ecx eax |
211 | |
248 | 212 | dec [esi + tcp_out_queue_entry.retries] |
|
Line 249... | Line 213... | ||
249 | dec [esi + tcp_out_queue_entry.retries] |
213 | jz .remove_it |
250 | jz .remove_it |
214 | |
251 | mov [esi + tcp_out_queue_entry.ttl], TCP_TIMEOUT |
215 | mov [esi + tcp_out_queue_entry.ttl], TCP_PACKET_TTL |
252 | jmp .find_next |
- | |
253 | 216 | jmp .find_next |
|
254 | .remove_it: |
217 | |
Line 276... | Line 239... | ||
276 | ;----------------------------------------------------------------- |
239 | ;----------------------------------------------------------------- |
Line 277... | Line 240... | ||
277 | 240 | ||
278 | align 4 |
241 | align 4 |
Line -... | Line 242... | ||
- | 242 | TCP_add_to_queue: |
|
- | 243 | ||
279 | TCP_add_to_queue: |
244 | DEBUGF 1,"Adding packet to TCP queue, buffer: %x, size: %u, driver: %x, acknum: %x\n", [esp], [esp+4], ebx, edx |
280 | 245 | ||
Line 281... | Line 246... | ||
281 | cmp [TCP_OUT_QUEUE], TCP_QUEUE_SIZE |
246 | cmp [TCP_OUT_QUEUE], TCP_QUEUE_SIZE |
282 | jge .full |
247 | jge .full |
Line 289... | Line 254... | ||
289 | je .found_it |
254 | je .found_it |
290 | add eax, tcp_out_queue_entry.size |
255 | add eax, tcp_out_queue_entry.size |
291 | loop .loop |
256 | loop .loop |
Line 292... | Line 257... | ||
292 | 257 | ||
- | 258 | .full: ; silently discard the packet |
|
- | 259 | ||
- | 260 | DEBUGF 1,"TCP queue is full!\n" |
|
293 | .full: ; silently discard the packet |
261 | |
294 | call kernel_free |
262 | call kernel_free |
Line 295... | Line 263... | ||
295 | add esp, 4 |
263 | add esp, 4 |
Line 302... | Line 270... | ||
302 | pop [eax + tcp_out_queue_entry.data_size] |
270 | pop [eax + tcp_out_queue_entry.data_size] |
303 | mov [eax + tcp_out_queue_entry.ttl], 1 ; send immediately |
271 | mov [eax + tcp_out_queue_entry.ttl], 1 ; send immediately |
304 | mov [eax + tcp_out_queue_entry.retries], TCP_RETRIES |
272 | mov [eax + tcp_out_queue_entry.retries], TCP_RETRIES |
305 | mov [eax + tcp_out_queue_entry.owner], ebx |
273 | mov [eax + tcp_out_queue_entry.owner], ebx |
306 | mov [eax + tcp_out_queue_entry.sendproc], esi |
274 | mov [eax + tcp_out_queue_entry.sendproc], esi |
307 | mov [eax + tcp_out_queue_entry.ack_num], edx |
275 | mov [eax + tcp_out_queue_entry.seq_num], edx |
Line -... | Line 276... | ||
- | 276 | ||
- | 277 | inc [TCP_OUT_QUEUE] |
|
- | 278 | ||
- | 279 | sub eax, TCP_OUT_QUEUE+4 |
|
Line 308... | Line 280... | ||
308 | 280 | DEBUGF 1,"Added to queue in pos %u\n", eax |
|
Line 309... | Line 281... | ||
309 | 281 | ||
Line 330... | Line 302... | ||
330 | align 4 |
302 | align 4 |
331 | TCP_handler : |
303 | TCP_handler : |
Line 332... | Line 304... | ||
332 | 304 | ||
Line -... | Line 305... | ||
- | 305 | DEBUGF 1,"TCP_Handler\n" |
|
- | 306 | ||
333 | DEBUGF 1,"TCP_Handler\n" |
307 | ; TODO: validate checksum |
334 | 308 | ||
335 | ; IP Packet TCP Destination Port = local Port |
309 | ; IP Packet TCP Destination Port = local Port |
Line 336... | Line 310... | ||
336 | ; IP Packet SA = Remote IP OR = 0 |
310 | ; IP Packet SA = Remote IP OR = 0 |
Line 356... | Line 330... | ||
356 | 330 | ||
357 | mov ax, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RemotePort] |
331 | mov ax, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RemotePort] |
358 | cmp [edx + TCP_Packet.SourcePort] , ax |
332 | cmp [edx + TCP_Packet.SourcePort] , ax |
359 | je .change_state |
333 | je .change_state |
360 | test ax, ax |
334 | test ax, ax |
Line 361... | Line 335... | ||
361 | jne .socket_loop |
335 | jnz .socket_loop |
Line -... | Line 336... | ||
- | 336 | ||
- | 337 | .change_state: |
|
362 | 338 | ||
363 | .change_state: |
339 | DEBUGF 1,"Found valid socket for packet\n" |
364 | 340 | ||
365 | push ebx |
341 | push ebx |
Line 371... | Line 347... | ||
371 | ; ebx is pointer to socket |
347 | ; ebx is pointer to socket |
372 | ; ecx is size of tcp packet |
348 | ; ecx is size of tcp packet |
373 | ; edx is pointer to tcp packet |
349 | ; edx is pointer to tcp packet |
Line 374... | Line 350... | ||
374 | 350 | ||
375 | ; as a Packet has been received, update the TCB timer |
351 | ; as a Packet has been received, update the TCB timer |
Line 376... | Line 352... | ||
376 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBTimer], TWOMSL |
352 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.timer], TCP_SOCKET_TTL |
377 | 353 | ||
378 | ; If the received Packet has an ACK bit set, remove any Packets in the resend queue that this received Packet acknowledges |
354 | ; If the received Packet has an ACK bit set, remove any Packets in the resend queue that this received Packet acknowledges |
Line 379... | Line 355... | ||
379 | test [edx + TCP_Packet.Flags], TH_ACK |
355 | test [edx + TCP_Packet.Flags], TH_ACK |
- | 356 | jz .call_handler ; No ACK, so no data yet |
|
- | 357 | ||
- | 358 | ; mov eax, [edx + TCP_Packet.SequenceNumber] ; Calculate sequencenumber in eax |
|
380 | jz .call_handler ; No ACK, so no data yet |
359 | ; bswap eax ; |
381 | 360 | ; add eax, ecx ; |
|
Line 382... | Line 361... | ||
382 | mov eax, [edx + TCP_Packet.SequenceNumber] ; Calculate sequencenumber in eax |
361 | |
383 | bswap eax ; |
362 | mov eax, [edx + TCP_Packet.AckNumber] |
384 | add eax, ecx ; |
- | |
385 | 363 | ;--------- |
|
- | 364 | ||
- | 365 | cmp [TCP_OUT_QUEUE], 0 |
|
- | 366 | je .call_handler |
|
386 | cmp [TCP_OUT_QUEUE], 0 |
367 | push ecx |
387 | je .call_handler |
368 | |
Line 388... | Line 369... | ||
388 | 369 | DEBUGF 1,"Removing all queued packets with smaller ACK\n" |
|
389 | push ecx |
370 | |
390 | mov ecx, TCP_QUEUE_SIZE |
371 | mov ecx, TCP_QUEUE_SIZE |
391 | mov esi, TCP_OUT_QUEUE+4 |
372 | mov esi, TCP_OUT_QUEUE+4 |
392 | 373 | ||
- | 374 | .loop: |
|
- | 375 | cmp [esi + tcp_out_queue_entry.data_ptr], 0 |
|
- | 376 | je .maybe_next |
|
Line 393... | Line 377... | ||
393 | .loop: |
377 | cmp [esi + tcp_out_queue_entry.seq_num], eax |
394 | cmp [esi + tcp_out_queue_entry.data_ptr], 0 |
378 | jg .maybe_next |
395 | jne .maybe_next |
379 | ; TODO: check if the packets belong to the same tcp connection ! |
396 | cmp [esi + tcp_out_queue_entry.ack_num], eax |
380 | |
Line 397... | Line 381... | ||
397 | jg .maybe_next |
381 | DEBUGF 1,"Removing a queued packet\n" |
398 | 382 | ||
399 | push [esi + tcp_out_queue_entry.data_ptr] |
383 | push [esi + tcp_out_queue_entry.data_ptr] |
400 | mov [esi + tcp_out_queue_entry.data_ptr], 0 |
- | |
Line -... | Line 384... | ||
- | 384 | mov [esi + tcp_out_queue_entry.data_ptr], 0 |
|
401 | dec [TCP_OUT_QUEUE] |
385 | dec [TCP_OUT_QUEUE] |
402 | call kernel_free |
386 | call kernel_free |
403 | 387 | ||
- | 388 | .maybe_next: |
|
- | 389 | add esi, tcp_out_queue_entry.size |
|
404 | .maybe_next: |
390 | loop .loop |
405 | add esi, tcp_out_queue_entry.size |
391 | |
406 | loop .loop |
392 | pop ecx |
407 | pop ecx |
393 | .call_handler: |
Line -... | Line 394... | ||
- | 394 | ; Call handler for given TCB state |
|
408 | 395 | mov eax, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state] |
|
409 | .call_handler: |
396 | DEBUGF 1,"Socket state: %u\n", eax |
Line 410... | Line -... | ||
410 | ; Call handler for given TCB state |
- | |
411 | mov eax, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState] |
397 | |
412 | cmp eax, TCB_LISTEN |
- | |
413 | jb .exit |
- | |
414 | cmp eax, TCB_CLOSED |
- | |
Line 415... | Line 398... | ||
415 | ja .exit |
398 | cmp eax, TCB_LISTEN |
416 | 399 | jb .dump |
|
417 | shl eax, 2 |
400 | cmp eax, TCB_CLOSED |
418 | add eax, TCBStateHandler - 4 |
401 | ja .dump |
Line 461... | Line 444... | ||
461 | push eax |
444 | push eax |
462 | push ebx |
445 | push ebx |
Line 463... | Line 446... | ||
463 | 446 | ||
464 | 447 | ||
465 | push ecx esi eax ; save some variables for later |
448 | push ecx esi eax ; save some variables for later |
466 | add ecx, TCP_Packet.Data |
449 | add ecx, TCP_Packet.Options |
467 | call IPv4_create_packet |
450 | call IPv4_create_packet |
Line 468... | Line 451... | ||
468 | cmp edi, -1 |
451 | cmp edi, -1 |
Line 483... | Line 466... | ||
483 | pop [edi + TCP_Packet.AckNumber] |
466 | pop [edi + TCP_Packet.AckNumber] |
Line 484... | Line 467... | ||
484 | 467 | ||
485 | mov al, [eax + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.flags] |
468 | mov al, [eax + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.flags] |
Line 486... | Line 469... | ||
486 | mov [edi + TCP_Packet.Flags], al |
469 | mov [edi + TCP_Packet.Flags], al |
487 | 470 | ||
488 | mov [edi + TCP_Packet.Window], 0x0005 ; 1280 bytes ;;; TODO: read RFC ! |
471 | mov [edi + TCP_Packet.Window], 0x0005 ; 1280 bytes |
489 | mov [edi + TCP_Packet.UrgentPointer], 0 |
472 | mov [edi + TCP_Packet.UrgentPointer], 0 |
Line 490... | Line 473... | ||
490 | mov [edi + TCP_Packet.DataOffset], 0x50 |
473 | mov [edi + TCP_Packet.DataOffset], 0x50 |
491 | mov [edi + TCP_Packet.Checksum], 0 |
474 | mov [edi + TCP_Packet.Checksum], 0 |
492 | 475 | ||
493 | ; Copy the data |
476 | ; Copy the data |
Line 494... | Line 477... | ||
494 | mov esi, [esp] |
477 | mov esi, [esp] |
495 | mov ecx, [esp+4] |
478 | mov ecx, [esp+4] |
496 | add edi, TCP_Packet.Data |
479 | add edi, TCP_Packet.Options |
497 | 480 | ||
Line 517... | Line 500... | ||
517 | call checksum_2 |
500 | call checksum_2 |
518 | mov [edi + TCP_Packet.Checksum], dx |
501 | mov [edi + TCP_Packet.Checksum], dx |
Line 519... | Line 502... | ||
519 | 502 | ||
520 | ; And now, send it! |
503 | ; And now, send it! |
521 | DEBUGF 1,"Sending TCP Packet to device %x\n", ebx |
504 | DEBUGF 1,"Sending TCP Packet to device %x\n", ebx |
522 | mov esi, ETH_sender |
505 | lea esi, [ebx+ETH_DEVICE.transmit] |
523 | mov edx, [edi + TCP_Packet.AckNumber] |
506 | mov edx, [edi + TCP_Packet.AckNumber] |
Line 524... | Line 507... | ||
524 | jmp TCP_add_to_queue |
507 | jmp TCP_add_to_queue |
525 | 508 | ||
526 | .fail: |
509 | .fail: |
Line 541... | Line 524... | ||
541 | ;----------------------------------------------------------------- |
524 | ;----------------------------------------------------------------- |
Line 542... | Line 525... | ||
542 | 525 | ||
543 | align 4 |
526 | align 4 |
Line 544... | Line 527... | ||
544 | TCP_send_ack: |
527 | TCP_send_ack: |
Line 545... | Line 528... | ||
545 | 528 | ||
546 | DEBUGF 1,"Creating TCP ACK\n" |
529 | DEBUGF 1,"Creating TCP ACK, socket: %x, flags: %x\n",eax, bl |
Line 547... | Line 530... | ||
547 | 530 | ||
Line 548... | Line 531... | ||
548 | mov di , IP_PROTO_TCP |
531 | mov di , IP_PROTO_TCP |
- | 532 | mov ecx, TCP_Packet.Options |
|
549 | mov cx , TCP_Packet.Data |
533 | |
550 | 534 | push bx eax |
|
Line 551... | Line 535... | ||
551 | push bx eax |
535 | |
552 | 536 | ; Create an IPv4 Packet of the correct size |
|
Line 562... | Line 546... | ||
562 | pop esi |
546 | pop esi |
Line 563... | Line 547... | ||
563 | 547 | ||
564 | push [esi + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.SND_NXT] |
548 | push [esi + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.SND_NXT] |
Line 565... | Line 549... | ||
565 | pop [edi + TCP_Packet.SequenceNumber] |
549 | pop [edi + TCP_Packet.SequenceNumber] |
566 | 550 | ||
Line 567... | Line 551... | ||
567 | push dword [esi + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.LocalPort] |
551 | push dword [esi + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.LocalPort] ; both ports at once |
568 | pop dword [edi + TCP_Packet.SourcePort] |
552 | pop dword [edi + TCP_Packet.SourcePort] |
Line 569... | Line 553... | ||
569 | 553 | ||
570 | push [esi + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.SND_NXT] |
554 | push [esi + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
571 | pop [edi + TCP_Packet.AckNumber] |
555 | pop [edi + TCP_Packet.AckNumber] |
572 | 556 | ||
573 | pop cx |
557 | pop cx |
- | 558 | mov [edi + TCP_Packet.Flags], cl |
|
Line 574... | Line 559... | ||
574 | mov [edi + TCP_Packet.Flags], cl |
559 | mov [edi + TCP_Packet.Window], 0x0005 ; 1280 bytes |
Line -... | Line 560... | ||
- | 560 | mov [edi + TCP_Packet.UrgentPointer], 0 |
|
- | 561 | mov [edi + TCP_Packet.DataOffset], 0x50 |
|
- | 562 | mov [edi + TCP_Packet.Checksum], 0 |
|
- | 563 | ||
575 | mov [edi + TCP_Packet.Window], 0x0005 ; 1280 bytes |
564 | push edx eax |
576 | mov [edi + TCP_Packet.UrgentPointer], 0 |
565 | |
577 | mov [edi + TCP_Packet.DataOffset], 0x50 |
566 | lea esi, [esi + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.SND_NXT] |
578 | 567 | inc_INET esi |
|
Line 579... | Line -... | ||
579 | push eax edx |
- | |
580 | 568 | ||
- | 569 | ; Now, calculate the checksum |
|
- | 570 | pushw TCP_Packet.Options shl 8 |
|
- | 571 | pushw IP_PROTO_TCP shl 8 |
|
581 | push word TCP_Packet.Data shl 8 |
572 | pushd [edi-4] ; destination address |
582 | push IP_PROTO_TCP |
573 | pushd [edi-8] ; source address |
583 | push [esi + SOCKET_head.end + SOCKET_head.end + IPv4_SOCKET.RemoteIP] |
574 | |
584 | push [esi + SOCKET_head.end + SOCKET_head.end + IPv4_SOCKET.LocalIP] |
575 | xor edx, edx |
585 | 576 | mov ecx, TCP_Packet.Options |
|
586 | ; Now, calculate the checksum for pseudoheader |
577 | mov esi, edi |
587 | xor edx, edx |
578 | call checksum_1 |
Line 588... | Line 579... | ||
588 | mov ecx, 12 |
579 | mov ecx, 12 |
589 | mov esi, esp |
580 | mov esi, esp |
590 | call checksum_1 |
581 | call checksum_1 |
591 | add esp, 12 ; remove the pseudoheader from stack |
582 | add esp, 12 ; remove the pseudoheader from stack |
592 | ; Now create the final checksum and store it in TCP header |
583 | ; and store it in TCP header |
Line 593... | Line 584... | ||
593 | call checksum_2 |
584 | call checksum_2 |
594 | mov [edi + TCP_Packet.Checksum], dx |
585 | mov [edi + TCP_Packet.Checksum], dx |
595 | 586 | ||
Line 596... | Line 587... | ||
596 | ; And now, send it! |
587 | ; And now, send the packet! |
597 | DEBUGF 1,"Sending TCP Packet to device %x\n", ebx |
588 | DEBUGF 1,"Sending TCP Packet to device %x\n", ebx |
- | 589 | mov esi, [ebx + ETH_DEVICE.transmit] |
|
- | 590 | mov edx, [edi + TCP_Packet.SequenceNumber] |
|
- | 591 | jmp TCP_add_to_queue |
|
598 | mov esi, ETH_sender |
592 | |
599 | mov edx, [edi + TCP_Packet.AckNumber] |
593 | .fail: |
600 | jmp TCP_add_to_queue |
594 | add esp, 2+4 |
Line 601... | Line 595... | ||
601 | 595 | ret |
|
Line 629... | Line 623... | ||
629 | lea esi, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
623 | lea esi, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
630 | inc_INET esi ; RCV.NXT |
624 | inc_INET esi ; RCV.NXT |
631 | mov eax, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.ISS] |
625 | mov eax, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.ISS] |
632 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.SND_NXT], eax |
626 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.SND_NXT], eax |
Line -... | Line 627... | ||
- | 627 | ||
- | 628 | mov [ebx + SOCKET_head.lock], 0 |
|
633 | 629 | ||
634 | ; Now construct the response |
630 | ; Now construct the response |
635 | mov bl, TH_SYN + TH_ACK |
631 | mov bl, TH_SYN + TH_ACK |
Line 636... | Line 632... | ||
636 | call TCP_send_ack |
632 | call TCP_send_ack |
Line 637... | Line 633... | ||
637 | 633 | ||
638 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_SYN_RECEIVED |
634 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_SYN_RECEIVED |
639 | 635 | ||
Line 640... | Line 636... | ||
640 | ; increment SND.NXT in socket |
636 | ; increment SND.NXT in socket |
- | 637 | lea esi, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.SND_NXT] |
|
641 | lea esi, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.SND_NXT] |
638 | inc_INET esi |
Line 642... | Line 639... | ||
642 | inc_INET esi |
639 | |
643 | 640 | .exit: |
|
- | 641 | mov [ebx + SOCKET_head.lock], 0 |
|
- | 642 | ret |
|
- | 643 | ||
644 | .exit: |
644 | |
645 | ret |
645 | align 4 |
Line 646... | Line 646... | ||
646 | 646 | stateTCB_SYN_SENT: |
|
647 | 647 | ||
Line 656... | Line 656... | ||
656 | je .syn_ack |
656 | je .syn_ack |
Line 657... | Line 657... | ||
657 | 657 | ||
658 | test al, TH_SYN |
658 | test al, TH_SYN |
Line 659... | Line 659... | ||
659 | jz .exit |
659 | jz .exit |
660 | 660 | ||
661 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_SYN_RECEIVED |
661 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_SYN_RECEIVED |
Line 662... | Line 662... | ||
662 | push TH_SYN + TH_ACK |
662 | pushd TH_SYN + TH_ACK |
663 | jmp .send |
663 | jmp .send |
664 | 664 | ||
Line 665... | Line 665... | ||
665 | .syn_ack: |
665 | .syn_ack: |
666 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_ESTABLISHED |
666 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_ESTABLISHED |
667 | push TH_ACK |
667 | pushd TH_ACK |
668 | - | ||
669 | .send: |
- | |
670 | ; Store the recv.nxt field |
668 | |
- | 669 | .send: |
|
- | 670 | ; Store the recv.nxt field |
|
- | 671 | mov eax, [edx + TCP_Packet.SequenceNumber] |
|
671 | mov eax, [edx + TCP_Packet.SequenceNumber] |
672 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.IRS], eax |
672 | 673 | bswap eax |
|
Line 673... | Line 674... | ||
673 | ; Update our recv.nxt field |
674 | inc eax |
- | 675 | bswap eax |
|
674 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT], eax |
676 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT], eax ; Update our recv.nxt field |
675 | lea esi, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
677 | mov [ebx + SOCKET_head.lock], 0 |
Line 676... | Line 678... | ||
676 | inc_INET esi |
678 | |
- | 679 | ; Send an ACK |
|
677 | 680 | mov eax, ebx |
|
Line 678... | Line 681... | ||
678 | ; Send an ACK |
681 | pop ebx |
679 | pop ebx |
682 | call TCP_send_ack |
- | 683 | ||
- | 684 | .exit: |
|
- | 685 | mov [ebx + SOCKET_head.lock], 0 |
|
680 | call TCP_send_ack |
686 | ret |
681 | 687 | ||
682 | .exit: |
688 | |
Line 683... | Line 689... | ||
683 | ret |
689 | |
684 | 690 | align 4 |
|
Line 685... | Line 691... | ||
685 | 691 | stateTCB_SYN_RECEIVED: |
|
686 | 692 | ||
687 | align 4 |
693 | DEBUGF 1,"TCBStateHandler: Syn_received\n" |
688 | stateTCB_SYN_RECEIVED: |
694 | |
Line 689... | Line 695... | ||
689 | ; In this case, we are expecting an ACK Packet |
695 | ; In this case, we are expecting an ACK Packet |
690 | ; For now, if the Packet is an ACK, process it, |
696 | ; For now, if the Packet is an ACK, process it, |
Line 691... | Line 697... | ||
691 | ; If not, ignore it |
697 | ; If not, ignore it |
692 | 698 | ||
693 | test [edx + TCP_Packet.Flags], TH_RST |
699 | test [edx + TCP_Packet.Flags], TH_RST |
694 | jz .check_ack |
700 | jz .check_ack |
Line 695... | Line 701... | ||
695 | 701 | ||
Line 696... | Line 702... | ||
696 | push [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.OrigRemotePort] |
702 | ; push [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.OrigRemotePort] |
- | 703 | ; pop [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RemotePort] |
|
697 | pop [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RemotePort] |
704 | ; push [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.OrigRemoteIP] |
Line 698... | Line 705... | ||
698 | push [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.OrigRemoteIP] |
705 | ; pop [ebx + SOCKET_head.end + IPv4_SOCKET.RemoteIP] |
699 | pop [ebx + SOCKET_head.end + IPv4_SOCKET.RemoteIP] |
706 | |
- | 707 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_LISTEN |
|
- | 708 | jmp .exit |
|
- | 709 | ||
- | 710 | .check_ack: |
|
700 | 711 | ; Look at control flags - expecting an ACK |
|
701 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_LISTEN |
712 | test [edx + TCP_Packet.Flags], TH_ACK |
Line 702... | Line 713... | ||
702 | jmp .exit |
713 | jz .exit |
703 | 714 | ||
704 | .check_ack: |
715 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_ESTABLISHED |
Line 705... | Line 716... | ||
705 | ; Look at control flags - expecting an ACK |
716 | |
Line -... | Line 717... | ||
- | 717 | .exit: |
|
706 | test [edx + TCP_Packet.Flags], TH_ACK |
718 | mov [ebx + SOCKET_head.lock], 0 |
707 | jz .exit |
719 | ret |
Line 708... | Line 720... | ||
708 | 720 | ||
709 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_ESTABLISHED |
721 | |
710 | 722 | ||
711 | .exit: |
723 | align 4 |
Line -... | Line 724... | ||
- | 724 | stateTCB_ESTABLISHED: |
|
- | 725 | ||
712 | ret |
726 | |
713 | 727 | DEBUGF 1,"TCBStateHandler: Established\n" |
|
714 | 728 | ||
715 | 729 | ; Here we are expecting data, or a request to close |
|
716 | align 4 |
730 | ; OR both... |
Line 750... | Line 764... | ||
750 | 764 | ||
751 | ; recv.nxt is in dword [edx+24], in inet format |
765 | ; recv.nxt is in dword [edx+24], in inet format |
752 | ; recv seq is in [sktAddr]+56, in inet format |
766 | ; recv seq is in [sktAddr]+56, in inet format |
753 | ; just do a comparision |
767 | ; just do a comparision |
754 | mov ecx, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
768 | mov ecx, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
755 | cmp [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_CLOSE_WAIT |
769 | cmp [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_CLOSE_WAIT |
756 | jne @f |
770 | jne @f |
Line 757... | Line 771... | ||
757 | mov ecx, eax |
771 | mov ecx, eax |
758 | 772 | ||
Line 759... | Line 773... | ||
759 | @@: cmp ecx, [edx + TCP_Packet.SequenceNumber] |
773 | @@: cmp ecx, [edx + TCP_Packet.SequenceNumber] |
760 | jne .ack |
774 | jne .ack |
Line 761... | Line 775... | ||
761 | 775 | ||
762 | test ecx, ecx |
776 | test ecx, ecx |
763 | jnz .data |
777 | jnz .data |
764 | 778 | ||
Line 765... | Line 779... | ||
765 | ; If we had received a fin, we need to ACK it. |
779 | ; If we had received a fin, we need to ACK it. |
- | 780 | cmp [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_CLOSE_WAIT |
|
766 | cmp [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_CLOSE_WAIT |
781 | je .ack |
767 | je .ack |
782 | jmp .exit |
768 | jmp .exit |
783 | |
769 | 784 | .data: |
|
Line 770... | Line 785... | ||
770 | .data: |
785 | DEBUGF 1,"Got data!\n" |
- | 786 | mov esi, [esp + 4] |
|
771 | mov esi, [esp + 4] |
787 | sub edx, esi |
- | 788 | mov edi, edx |
|
772 | sub edx, esi |
789 | call socket_internal_receiver |
773 | mov edi, edx |
790 | |
774 | call socket_internal_receiver |
791 | .ack: |
- | 792 | mov [ebx + SOCKET_head.lock], 0 |
|
- | 793 | ; Send an ACK |
|
775 | 794 | mov eax, ebx |
|
Line 776... | Line 795... | ||
776 | .ack: |
795 | mov bl, TH_ACK |
777 | ; Send an ACK |
796 | call TCP_send_ack |
- | 797 | .exit: |
|
- | 798 | ||
- | 799 | mov [ebx + SOCKET_head.lock], 0 |
|
778 | mov bl, TH_ACK |
800 | ret |
779 | call TCP_send_ack |
801 | |
780 | .exit: |
802 | |
Line 781... | Line 803... | ||
781 | ret |
803 | |
782 | 804 | align 4 |
|
Line 783... | Line 805... | ||
783 | 805 | stateTCB_FIN_WAIT_1: |
|
784 | 806 | ||
785 | align 4 |
807 | DEBUGF 1,"TCBStateHandler: Fin_wait_1\n" |
Line 786... | Line 808... | ||
786 | stateTCB_FIN_WAIT_1: |
808 | |
787 | ; We can either receive an ACK of a fin, or a fin |
809 | ; We can either receive an ACK of a fin, or a fin |
788 | mov al, [edx + TCP_Packet.Flags] |
810 | mov al, [edx + TCP_Packet.Flags] |
789 | and al, TH_FIN + TH_ACK |
811 | and al, TH_FIN + TH_ACK |
Line 790... | Line 812... | ||
790 | 812 | ||
791 | cmp al, TH_ACK |
813 | cmp al, TH_ACK |
- | 814 | jne @f |
|
- | 815 | ||
792 | jne @f |
816 | ; It was an ACK |
- | 817 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_FIN_WAIT_2 |
|
793 | 818 | jmp .exit |
|
794 | ; It was an ACK |
819 | |
Line 795... | Line 820... | ||
795 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_FIN_WAIT_2 |
820 | @@: mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_CLOSING |
- | 821 | cmp al, TH_FIN |
|
796 | jmp .exit |
822 | je @f |
Line 797... | Line 823... | ||
797 | 823 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_TIMED_WAIT |
|
798 | @@: mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_CLOSING |
824 | |
- | 825 | @@: lea esi, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
|
- | 826 | inc_INET esi |
|
- | 827 | ||
799 | cmp al, TH_FIN |
828 | mov [ebx + SOCKET_head.lock], 0 |
800 | je @f |
829 | ; Send an ACK |
Line 801... | Line 830... | ||
801 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_TIMED_WAIT |
830 | mov eax, ebx |
802 | 831 | mov bl, TH_ACK |
|
Line 803... | Line 832... | ||
803 | @@: lea esi, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
832 | call TCP_send_ack |
804 | inc_INET esi |
833 | |
Line -... | Line 834... | ||
- | 834 | .exit: |
|
- | 835 | mov [ebx + SOCKET_head.lock], 0 |
|
805 | ; Send an ACK |
836 | ret |
- | 837 | ||
806 | mov bl, TH_ACK |
838 | |
807 | call TCP_send_ack |
839 | |
Line 808... | Line 840... | ||
808 | 840 | align 4 |
|
- | 841 | stateTCB_FIN_WAIT_2: |
|
809 | .exit: |
842 | |
Line 810... | Line 843... | ||
810 | ret |
843 | DEBUGF 1,"TCBStateHandler: Fin_wait_2\n" |
811 | 844 | ||
- | 845 | test [edx + TCP_Packet.Flags], TH_FIN |
|
- | 846 | jz .exit |
|
812 | 847 | ||
813 | 848 | ; Change state, as we have a fin |
|
- | 849 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_TIMED_WAIT |
|
- | 850 | ||
814 | align 4 |
851 | lea esi, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
Line 815... | Line 852... | ||
815 | stateTCB_FIN_WAIT_2: |
852 | inc_INET esi |
816 | test [edx + TCP_Packet.Flags], TH_FIN |
853 | |
- | 854 | mov [ebx + SOCKET_head.lock], 0 |
|
- | 855 | ||
- | 856 | ; Send an ACK |
|
817 | jz .exit |
857 | mov eax, ebx |
818 | 858 | mov bl, TH_ACK |
|
819 | ; Change state, as we have a fin |
859 | call TCP_send_ack |
Line 820... | Line 860... | ||
820 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.TCBState], TCB_TIMED_WAIT |
860 | |
Line 821... | Line 861... | ||
821 | 861 | .exit: |
|
- | 862 | mov [ebx + SOCKET_head.lock], 0 |
|
- | 863 | ret |
|
822 | lea esi, [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.RCV_NXT] |
864 | |
Line 823... | Line 865... | ||
823 | inc_INET esi |
865 | |
824 | 866 | ||
- | 867 | align 4 |
|
- | 868 | stateTCB_CLOSE_WAIT: |
|
- | 869 | ||
825 | ; Send an ACK |
870 | DEBUGF 1,"TCBStateHandler: close_wait\n" |
826 | mov bl, TH_ACK |
871 | ; Intentionally left empty |
827 | call TCP_send_ack |
872 | ; socket_close_tcp handles this |
Line -... | Line 873... | ||
- | 873 | ||
- | 874 | mov [ebx + SOCKET_head.lock], 0 |
|
828 | 875 | ret |
|
829 | .exit: |
876 | |
Line 830... | Line 877... | ||
830 | ret |
877 | |
831 | 878 | ||
Line 832... | Line 879... | ||
832 | 879 | align 4 |
|
833 | 880 | stateTCB_CLOSING: |
|
- | 881 | ||
- | 882 | DEBUGF 1,"TCBStateHandler: closingn\n" |
|
- | 883 | ||
- | 884 | ; We can either receive an ACK of a fin, or a fin |
|
- | 885 | test [edx + TCP_Packet.Flags], TH_ACK |
|
834 | align 4 |
886 | jz .exit |
Line 835... | Line 887... | ||
835 | stateTCB_CLOSE_WAIT: |
887 | |
836 | ; Intentionally left empty |
888 | mov [ebx + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.state], TCB_TIMED_WAIT |
- | 889 | ||
- | 890 | .exit: |
|
- | 891 | ||
- | 892 | mov [ebx + SOCKET_head.lock], 0 |
|
- | 893 | ret |
|
837 | ; socket_close_tcp handles this |
894 | |
Line -... | Line 895... | ||
- | 895 | ||
- | 896 | align 4 |
|
- | 897 | stateTCB_LAST_ACK: |
|
- | 898 | ||
- | 899 | DEBUGF 1,"TCBStateHandler: last_ackn\n" |
|
- | 900 | ||
- | 901 | ; Look at control flags - expecting an ACK |
|
- | 902 | test [edx + TCP_Packet.Flags], TH_ACK |
|
- | 903 | jz .exit |
|
- | 904 | ||
- | 905 | mov [ebx + SOCKET_head.lock], 0 |
|
- | 906 | ||
- | 907 | ; delete the socket |
|
- | 908 | stdcall net_socket_free, ebx |
|
- | 909 | ||
- | 910 | .exit: |
|
Line -... | Line 911... | ||
- | 911 | ret |
|
- | 912 | ||
- | 913 | ||
- | 914 | align 4 |
|
- | 915 | stateTCB_TIME_WAIT: |
|
- | 916 | ||
- | 917 | DEBUGF 1,"TCBStateHandler: time_wait\n" |
|
- | 918 | ||
- | 919 | mov [ebx + SOCKET_head.lock], 0 |
|
- | 920 | ||
- | 921 | ret |
|
- | 922 | ||
- | 923 | ||
- | 924 | align 4 |
|
- | 925 | stateTCB_CLOSED: |
|
- | 926 | ||
- | 927 | DEBUGF 1,"TCBStateHandler: closed\n" |
|
- | 928 | ||
- | 929 | mov [ebx + SOCKET_head.lock], 0 |
|
- | 930 | ||
- | 931 | ret |