Subversion Repositories Kolibri OS

Rev

Rev 1536 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1536 Rev 1541
Line 13... Line 13...
13
;;         GNU GENERAL PUBLIC LICENSE                              ;;
13
;;         GNU GENERAL PUBLIC LICENSE                              ;;
14
;;          Version 2, June 1991                                   ;;
14
;;          Version 2, June 1991                                   ;;
15
;;                                                                 ;;
15
;;                                                                 ;;
16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 17... Line 17...
17
 
17
 
Line 18... Line 18...
18
$Revision: 1536 $
18
$Revision: 1541 $
Line 19... Line 19...
19
 
19
 
20
virtual at 0
20
virtual at 0
Line 315... Line 315...
315
	je	.udp
315
	je	.udp
Line 316... Line 316...
316
 
316
 
317
	cmp	edx, IP_PROTO_TCP
317
	cmp	edx, IP_PROTO_TCP
Line -... Line 318...
-
 
318
	je	.tcp
-
 
319
 
-
 
320
	cmp	edx, SOCK_RAW
318
	je	.tcp
321
	je	.raw
319
 
322
 
Line 320... Line 323...
320
  .no_inet4:
323
  .no_inet4:
321
	ret
324
	ret
Line 338... Line 341...
338
	push	eax
341
	push	eax
339
	init_queue (eax + SOCKET_QUEUE_LOCATION)
342
	init_queue (eax + SOCKET_QUEUE_LOCATION)
340
	pop	eax
343
	pop	eax
Line 341... Line 344...
341
 
344
 
342
	mov	[eax + SOCKET.snd_proc], SOCKET_send_udp
345
	mov	[eax + SOCKET.snd_proc], SOCKET_send_udp
-
 
346
	mov	[eax + SOCKET.rcv_proc], SOCKET_receive_dgram
-
 
347
 
-
 
348
	ret
-
 
349
 
-
 
350
  .raw:
-
 
351
;        test    esi, esi
-
 
352
;        jz      .ip
-
 
353
 
-
 
354
	cmp	esi, IP_PROTO_ICMP
-
 
355
	je	.icmp
-
 
356
 
-
 
357
	ret
-
 
358
 
-
 
359
;  .ip:
-
 
360
;        push    eax
-
 
361
;        init_queue (eax + SOCKET_QUEUE_LOCATION)
-
 
362
;        pop     eax
-
 
363
;
-
 
364
;        mov     [eax + SOCKET.snd_proc], SOCKET_send_ip
-
 
365
;        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
-
 
366
;
-
 
367
;        ret
-
 
368
 
-
 
369
  .icmp:
-
 
370
	push	eax
-
 
371
	init_queue (eax + SOCKET_QUEUE_LOCATION)
-
 
372
	pop	eax
-
 
373
 
-
 
374
	mov	[eax + SOCKET.snd_proc], SOCKET_send_icmp
Line 343... Line 375...
343
	mov	[eax + SOCKET.rcv_proc], SOCKET_receive_udp
375
	mov	[eax + SOCKET.rcv_proc], SOCKET_receive_dgram
Line 424... Line 456...
424
;
456
;
425
;-----------------------------------------------------------------
457
;-----------------------------------------------------------------
426
align 4
458
align 4
427
SOCKET_connect:
459
SOCKET_connect:
Line 428... Line 460...
428
 
460
 
Line 429... Line 461...
429
	DEBUGF	1,"socket_connect: socknum: %u sockaddr: %x, length: %u\n", ecx, edx, esi
461
	DEBUGF	1,"SOCKET_connect: socknum: %u sockaddr: %x, length: %u\n", ecx, edx, esi
430
 
462
 
Line 431... Line 463...
431
	call	SOCKET_num_to_ptr
463
	call	SOCKET_num_to_ptr
Line 445... Line 477...
445
	je	.udp
477
	je	.udp
Line 446... Line 478...
446
 
478
 
447
	cmp	[eax + SOCKET.Type], IP_PROTO_TCP
479
	cmp	[eax + SOCKET.Type], IP_PROTO_TCP
Line -... Line 480...
-
 
480
	je	.tcp
-
 
481
 
-
 
482
	cmp	[eax + SOCKET.Type], SOCK_RAW
448
	je	.tcp
483
	je	.raw
Line 449... Line 484...
449
 
484
 
450
	jmp	s_error
485
	jmp	s_error
451
 
486
 
Line 495... Line 530...
495
	mov	[eax + SOCKET.lock], 0
530
	mov	[eax + SOCKET.lock], 0
Line 496... Line 531...
496
 
531
 
497
	mov	dword [esp+32], 0	; success!
532
	mov	dword [esp+32], 0	; success!
Line -... Line 533...
-
 
533
	ret
-
 
534
 
-
 
535
  .raw:
-
 
536
	push	dword [edx + 4]
-
 
537
	pop	dword [eax + IP_SOCKET.RemoteIP]
-
 
538
 
-
 
539
	mov	dword [esp+32], 0	; success!
Line 498... Line 540...
498
	ret
540
	ret
499
 
541
 
500
 
542
 
501
;-----------------------------------------------------------------
543
;-----------------------------------------------------------------
Line 508... Line 550...
508
;
550
;
509
;-----------------------------------------------------------------
551
;-----------------------------------------------------------------
510
align 4
552
align 4
511
SOCKET_listen:
553
SOCKET_listen:
Line 512... Line 554...
512
 
554
 
Line 513... Line 555...
513
	DEBUGF	1,"Socket_listen: socknum: %u backlog: %u\n", ecx, edx
555
	DEBUGF	1,"SOCKET_listen: socknum: %u backlog: %u\n", ecx, edx
514
 
556
 
Line 515... Line 557...
515
	call	SOCKET_num_to_ptr
557
	call	SOCKET_num_to_ptr
Line 548... Line 590...
548
;
590
;
549
;-----------------------------------------------------------------
591
;-----------------------------------------------------------------
550
align 4
592
align 4
551
SOCKET_accept:
593
SOCKET_accept:
Line 552... Line 594...
552
 
594
 
Line 553... Line 595...
553
	DEBUGF	1,"Socket_accept: socknum: %u sockaddr: %x, length: %u\n", ecx, edx, esi
595
	DEBUGF	1,"SOCKET_accept: socknum: %u sockaddr: %x, length: %u\n", ecx, edx, esi
554
 
596
 
Line 555... Line 597...
555
	call	SOCKET_num_to_ptr
597
	call	SOCKET_num_to_ptr
Line 599... Line 641...
599
;
641
;
600
;-----------------------------------------------------------------
642
;-----------------------------------------------------------------
601
align 4
643
align 4
602
SOCKET_close:
644
SOCKET_close:
Line 603... Line 645...
603
 
645
 
Line 604... Line 646...
604
	DEBUGF	1,"socket_close: socknum: %u\n", ecx
646
	DEBUGF	1,"SOCKET_close: socknum: %u\n", ecx
605
 
647
 
Line 606... Line 648...
606
	call	SOCKET_num_to_ptr
648
	call	SOCKET_num_to_ptr
Line 656... Line 698...
656
	jz	s_error
698
	jz	s_error
Line 657... Line 699...
657
 
699
 
Line 658... Line -...
658
	jmp	[eax + SOCKET.rcv_proc]
-
 
659
 
700
	jmp	[eax + SOCKET.rcv_proc]
660
 
701
 
Line 661... Line 702...
661
 
702
 
Line 662... Line 703...
662
align 4
703
align 4
663
SOCKET_receive_udp:
704
SOCKET_receive_dgram:
Line 664... Line 705...
664
 
705
 
Line 703... Line 744...
703
	jmp	s_error
744
	jmp	s_error
Line 704... Line 745...
704
 
745
 
705
align 4
746
align 4
Line 706... Line 747...
706
SOCKET_receive_tcp:
747
SOCKET_receive_tcp:
Line 707... Line 748...
707
 
748
 
708
	DEBUGF	1,"type: TCP\n"
749
	DEBUGF	1,"SOCKET_receive: TCP\n"
709
 
750
 
710
	mov	ecx, esi
751
	mov	ecx, esi
Line 731... Line 772...
731
;
772
;
732
;-----------------------------------------------------------------
773
;-----------------------------------------------------------------
733
align 4
774
align 4
734
SOCKET_send:
775
SOCKET_send:
Line 735... Line 776...
735
 
776
 
Line 736... Line 777...
736
	DEBUGF	1,"SOCKET_send: socknum: %u sockaddr: %x, length: %u, flags: %x, ", ecx, edx, esi, edi
777
	DEBUGF	1,"SOCKET_send: socknum: %u data ptr: %x, length: %u, flags: %x, ", ecx, edx, esi, edi
737
 
778
 
Line 738... Line 779...
738
	call	SOCKET_num_to_ptr
779
	call	SOCKET_num_to_ptr
Line 739... Line -...
739
	jz	s_error
-
 
740
 
780
	jz	s_error
741
	jmp	[eax + SOCKET.snd_proc]
781
 
Line 742... Line 782...
742
 
782
	jmp	[eax + SOCKET.snd_proc]
Line 743... Line 783...
743
 
783
 
744
 
784
 
Line 745... Line 785...
745
align 4
785
align 4
Line 757... Line 797...
757
 
797
 
758
 
798
 
Line 759... Line 799...
759
align 4
799
align 4
Line 760... Line 800...
760
SOCKET_send_tcp:
800
SOCKET_send_tcp:
761
 
801
 
762
	DEBUGF	1,"type: TCP\n"
802
	DEBUGF	1,"SOCKET_send: TCP\n"
763
 
803
 
Line 772... Line 812...
772
 
812
 
773
	mov	[esp+32], eax
813
	mov	[esp+32], eax
Line -... Line 814...
-
 
814
	ret
-
 
815
 
-
 
816
 
-
 
817
;align 4
-
 
818
;SOCKET_send_ip:
-
 
819
;
-
 
820
;        DEBUGF  1,"type: IP\n"
-
 
821
;
-
 
822
;        mov     ecx, esi
-
 
823
;        mov     esi, edx
-
 
824
;
-
 
825
;        call    IPv4_output_raw
-
 
826
;
-
 
827
;        mov     dword [esp+32], eax
-
 
828
;        ret
-
 
829
 
-
 
830
align 4
-
 
831
SOCKET_send_icmp:
-
 
832
 
-
 
833
	DEBUGF	1,"SOCKET_send: ICMP\n"
-
 
834
 
-
 
835
	mov	ecx, esi
-
 
836
	call	ICMP_output_raw
-
 
837
 
-
 
838
	mov	dword [esp+32], 0
Line 774... Line 839...
774
	ret
839
	ret
775
 
840
 
776
 
841
 
Line 989... Line 1054...
989
	push	esi
1054
	push	esi
990
	mov	esi, esp
1055
	mov	esi, esp
Line 991... Line 1056...
991
 
1056
 
Line 992... Line 1057...
992
	add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, socket_queue_entry.size, SOCKET_input.full
1057
	add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, socket_queue_entry.size, SOCKET_input.full
993
 
1058
 
994
	DEBUGF	1,"Queued packet successfully\n"
1059
	DEBUGF	1,"SOCKET_input: queued packet successfully\n"
995
	add	esp, socket_queue_entry.size
1060
	add	esp, socket_queue_entry.size
Line 996... Line 1061...
996
	mov	[eax + SOCKET.lock], 0
1061
	mov	[eax + SOCKET.lock], 0
997
	jmp	SOCKET_notify_owner
1062
	jmp	SOCKET_notify_owner
998
 
1063
 
999
  .full:
1064
  .full:
1000
	DEBUGF	2,"Socket %x is full!\n", eax
1065
	DEBUGF	2,"SOCKET_input: socket %x is full!\n", eax
Line 1001... Line 1066...
1001
	mov	[eax + SOCKET.lock], 0
1066
	mov	[eax + SOCKET.lock], 0
Line 1047... Line 1112...
1047
	cmp	[eax + RING_BUFFER.size], SOCKET_MAXDATA
1112
	cmp	[eax + RING_BUFFER.size], SOCKET_MAXDATA
1048
	jg	.too_large
1113
	jg	.too_large
Line 1049... Line 1114...
1049
 
1114
 
1050
  .copy:
1115
  .copy:
1051
	mov	edi, [eax + RING_BUFFER.write_ptr]
1116
	mov	edi, [eax + RING_BUFFER.write_ptr]
Line 1052... Line 1117...
1052
	DEBUGF	2,"Copying %u bytes from %x to %x\n", ecx, esi, edi
1117
	DEBUGF	2,"SOCKET_ring_write: %u bytes from %x to %x\n", ecx, esi, edi
1053
 
1118
 
1054
	push	ecx
1119
	push	ecx
1055
	shr	ecx, 1
1120
	shr	ecx, 1
Line 1085... Line 1150...
1085
 
1150
 
1086
	mov	[eax + RING_BUFFER.size], SOCKET_MAXDATA	; update size, we will fill buffer completely
1151
	mov	[eax + RING_BUFFER.size], SOCKET_MAXDATA	; update size, we will fill buffer completely
Line 1087... Line 1152...
1087
	jmp	.copy
1152
	jmp	.copy
1088
 
1153
 
1089
  .full:
1154
  .full:
1090
	DEBUGF	2,"Ring buffer is full!\n"
1155
	DEBUGF	2,"SOCKET_ring_write: ring buffer is full!\n"
Line 1091... Line 1156...
1091
	xor	ecx, ecx
1156
	xor	ecx, ecx
Line 1114... Line 1179...
1114
	jg	.less_data
1179
	jg	.less_data
Line 1115... Line 1180...
1115
 
1180
 
1116
  .copy:
1181
  .copy:
Line 1117... Line 1182...
1117
	mov	esi, [eax + RING_BUFFER.read_ptr]
1182
	mov	esi, [eax + RING_BUFFER.read_ptr]
1118
 
1183
 
1119
	DEBUGF	2,"Copying %u bytes from %x to %x\n", ecx, esi, edi
1184
	DEBUGF	2,"SOCKET_ring_read: %u bytes from %x to %x\n", ecx, esi, edi
1120
	push	ecx
1185
	push	ecx
1121
	shr	ecx, 1
1186
	shr	ecx, 1
1122
	jnc	.nb
1187
	jnc	.nb
Line 1332... Line 1397...
1332
 
1397
 
1333
	push	ebx
1398
	push	ebx
1334
	lea	ebx, [eax + SOCKET.lock]
1399
	lea	ebx, [eax + SOCKET.lock]
Line 1335... Line 1400...
1335
	call	wait_mutex
1400
	call	wait_mutex
Line 1336... Line 1401...
1336
 
1401
 
1337
	DEBUGF	1, "freeing socket..\n"
1402
	DEBUGF	1, "SOCKET_free: freeing socket..\n"
Line 1338... Line 1403...
1338
 
1403
 
Line 1350... Line 1415...
1350
 
1415
 
1351
	push	eax				; this will be passed to kernel_free
1416
	push	eax				; this will be passed to kernel_free
1352
	mov	ebx, [eax + SOCKET.NextPtr]
1417
	mov	ebx, [eax + SOCKET.NextPtr]
Line 1353... Line 1418...
1353
	mov	eax, [eax + SOCKET.PrevPtr]
1418
	mov	eax, [eax + SOCKET.PrevPtr]
Line 1354... Line 1419...
1354
 
1419
 
1355
	DEBUGF	1, "linking socket %x to socket %x\n", eax, ebx
1420
	DEBUGF	1, "SOCKET_free: linking socket %x to socket %x\n", eax, ebx
1356
 
1421
 
1357
	test	eax, eax
1422
	test	eax, eax
Line 1365... Line 1430...
1365
       @@:
1430
       @@:
Line 1366... Line 1431...
1366
 
1431
 
1367
	call	kernel_free
1432
	call	kernel_free
Line 1368... Line 1433...
1368
	pop	ebx
1433
	pop	ebx
Line 1369... Line 1434...
1369
 
1434
 
1370
	DEBUGF	1, "socket is gone!\n"
1435
	DEBUGF	1, "SOCKET_free: success!\n"