Subversion Repositories Kolibri OS

Rev

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