Subversion Repositories Kolibri OS

Rev

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

Rev 1541 Rev 1542
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: 1541 $
18
$Revision: 1542 $
Line 19... Line 19...
19
 
19
 
20
virtual at 0
20
virtual at 0
Line 56... Line 56...
56
 
56
 
Line 57... Line 57...
57
virtual at IP_SOCKET.end
57
virtual at IP_SOCKET.end
Line 58... Line 58...
58
 
58
 
59
	TCP_SOCKET:
59
	TCP_SOCKET:
Line 60... Line 60...
60
 
60
 
61
	.LocalPort		dw ? ; In INET byte order
61
	.LocalPort		dw ?
Line 62... Line 62...
62
	.RemotePort		dw ? ; In INET byte order
62
	.RemotePort		dw ?
Line 148... Line 148...
148
 
148
 
Line 149... Line 149...
149
virtual at IP_SOCKET.end
149
virtual at IP_SOCKET.end
Line 150... Line 150...
150
 
150
 
151
	UDP_SOCKET:
151
	UDP_SOCKET:
152
 
152
 
Line 153... Line 153...
153
	.LocalPort		dw ? ; In INET byte order
153
	.LocalPort		dw ?
154
	.RemotePort		dw ? ; In INET byte order
154
	.RemotePort		dw ?
Line 155... Line 155...
155
	.firstpacket		db ?
155
	.firstpacket		db ?
Line 156... Line 156...
156
 
156
 
Line 157... Line 157...
157
	.end:
157
	.end:
Line 158... Line 158...
158
end virtual
158
end virtual
159
 
159
 
Line 160... Line 160...
160
virtual at IP_SOCKET.end
160
virtual at IP_SOCKET.end
Line 248... Line 248...
248
; Socket API (function 74)
248
; Socket API (function 74)
249
;
249
;
250
;-----------------------------------------------------------------
250
;-----------------------------------------------------------------
251
align 4
251
align 4
252
sys_socket:
252
sys_socket:
253
	cmp	ebx, 8		; highest possible number
253
	cmp	ebx, 9		; highest possible number
254
	jg	@f
254
	jg	@f
255
	lea	ebx, [sock_sysfn_table + 4*ebx]
255
	jmp	dword [sock_sysfn_table + 4*ebx]
256
	jmp	dword [ebx]
-
 
257
       @@:
256
       @@:
258
	cmp	ebx, 255
257
	cmp	ebx, 255
259
	jz	SOCKET_debug
258
	jz	SOCKET_debug
Line 260... Line 259...
260
 
259
 
Line 272... Line 271...
272
	dd	SOCKET_listen	; 3
271
	dd	SOCKET_listen	; 3
273
	dd	SOCKET_connect	; 4
272
	dd	SOCKET_connect	; 4
274
	dd	SOCKET_accept	; 5
273
	dd	SOCKET_accept	; 5
275
	dd	SOCKET_send	; 6
274
	dd	SOCKET_send	; 6
276
	dd	SOCKET_receive	; 7
275
	dd	SOCKET_receive	; 7
277
	dd	SOCKET_get_opt	; 8
276
	dd	SOCKET_set_opt	; 8
278
;        dd      SOCKET_set_opt  ; 9
277
	dd	SOCKET_get_opt	; 9
279
 
-
 
280
 
-
 
Line 281... Line 278...
281
 
278
 
282
;-----------------------------------------------------------------
279
;-----------------------------------------------------------------
283
;
280
;
284
; SOCKET_open
281
; SOCKET_open
Line 295... Line 292...
295
	DEBUGF	1,"SOCKET_open: domain: %u, type: %u protocol: %x\n", ecx, edx, esi
292
	DEBUGF	1,"SOCKET_open: domain: %u, type: %u protocol: %x\n", ecx, edx, esi
Line 296... Line 293...
296
 
293
 
297
	call	SOCKET_alloc
294
	call	SOCKET_alloc
Line -... Line 295...
-
 
295
	jz	s_error
-
 
296
 
298
	jz	s_error
297
	mov	[esp+32], edi			; return socketnumber
299
 
298
 
300
	mov	[eax + SOCKET.Domain], ecx
299
	mov	[eax + SOCKET.Domain], ecx
Line 301... Line -...
301
	mov	[eax + SOCKET.Type], edx
-
 
302
	mov	[eax + SOCKET.Protocol], esi
-
 
303
 
300
	mov	[eax + SOCKET.Type], edx
304
	mov	[esp+32], edi			; return socketnumber
301
	mov	[eax + SOCKET.Protocol], esi
Line 305... Line 302...
305
 
302
 
306
	cmp	ecx, AF_INET4
303
	cmp	ecx, AF_INET4
Line 307... Line -...
307
	jne	.no_inet4
-
 
308
 
-
 
309
	push	[IP_LIST]
304
	jne	.no_inet4
310
	pop	[eax + IP_SOCKET.LocalIP]	; fill in local ip number
305
 
Line 311... Line 306...
311
 
306
	push	[IP_LIST]
312
	call	SOCKET_find_port		; fill in a local port number, application may change it later, or use this one
307
	pop	[eax + IP_SOCKET.LocalIP]	; fill in local ip number
Line 313... Line 308...
313
 
308
 
314
	cmp	edx, IP_PROTO_UDP
309
	cmp	edx, SOCK_DGRAM
Line 315... Line 310...
315
	je	.udp
310
	je	.udp
316
 
311
 
Line -... Line 312...
-
 
312
	cmp	edx, SOCK_STREAM
317
	cmp	edx, IP_PROTO_TCP
313
	je	.tcp
-
 
314
 
318
	je	.tcp
315
	cmp	edx, SOCK_RAW
Line 319... Line 316...
319
 
316
	je	.raw
320
	cmp	edx, SOCK_RAW
317
 
Line 321... Line 318...
321
	je	.raw
318
  .no_inet4:
322
 
319
	ret
Line 323... Line 320...
323
  .no_inet4:
320
 
324
	ret
321
align 4
Line 325... Line 322...
325
 
322
  .raw:
Line -... Line 323...
-
 
323
;        test    esi, esi       ; IP_PROTO_IP
326
  .tcp:
324
;        jz      .ip
-
 
325
 
-
 
326
	cmp	esi, IP_PROTO_ICMP
-
 
327
	je	.icmp
-
 
328
 
327
	mov	ebx, eax
329
	cmp	esi, IP_PROTO_UDP
328
 
330
	je	.udp
329
	lea	eax, [ebx + STREAM_SOCKET.snd]
331
 
Line 330... Line 332...
330
	call	SOCKET_ring_create
332
	cmp	esi, IP_PROTO_TCP
331
 
333
	je	.tcp
Line 332... Line 334...
332
	lea	eax, [ebx + STREAM_SOCKET.rcv]
334
 
Line -... Line 335...
-
 
335
	ret
333
	call	SOCKET_ring_create
336
 
334
 
337
align 4
335
	mov	[ebx + SOCKET.snd_proc], SOCKET_send_tcp
-
 
Line -... Line 338...
-
 
338
  .udp:
-
 
339
	mov	[eax + SOCKET.Protocol], IP_PROTO_UDP
-
 
340
 
-
 
341
	call	SOCKET_find_port		; fill in a local port number, application may change it later, or use this one
-
 
342
 
336
	mov	[ebx + SOCKET.rcv_proc], SOCKET_receive_tcp
343
	push	eax
-
 
344
	init_queue (eax + SOCKET_QUEUE_LOCATION)
-
 
345
	pop	eax
337
 
346
 
-
 
347
	mov	[eax + SOCKET.snd_proc], SOCKET_send_udp
-
 
348
	mov	[eax + SOCKET.rcv_proc], SOCKET_receive_dgram
-
 
349
 
Line 338... Line 350...
338
	ret
350
	ret
Line -... Line 351...
-
 
351
 
-
 
352
align 4
339
 
353
  .tcp:
-
 
354
	mov	[eax + SOCKET.Protocol], IP_PROTO_TCP
340
  .udp:
355
 
341
	push	eax
356
	call	SOCKET_find_port		; fill in a local port number, application may change it later, or use this one
342
	init_queue (eax + SOCKET_QUEUE_LOCATION)
357
 
343
	pop	eax
358
	mov	ebx, eax
344
 
359
 
345
	mov	[eax + SOCKET.snd_proc], SOCKET_send_udp
360
	lea	eax, [ebx + STREAM_SOCKET.snd]
346
	mov	[eax + SOCKET.rcv_proc], SOCKET_receive_dgram
361
	call	SOCKET_ring_create
347
 
362
 
Line -... Line 363...
-
 
363
	lea	eax, [ebx + STREAM_SOCKET.rcv]
-
 
364
	call	SOCKET_ring_create
348
	ret
365
 
-
 
366
	mov	[ebx + SOCKET.snd_proc], SOCKET_send_tcp
349
 
367
	mov	[ebx + SOCKET.rcv_proc], SOCKET_receive_tcp
350
  .raw:
368
 
351
;        test    esi, esi
369
	ret
Line 352... Line 370...
352
;        jz      .ip
370
 
Line 419... Line 437...
419
	DEBUGF	1,"af_inet4\n"
437
	DEBUGF	1,"af_inet4\n"
Line 420... Line 438...
420
 
438
 
421
	cmp	esi, 6
439
	cmp	esi, 6
Line 422... Line -...
422
	jl	s_error
-
 
423
 
-
 
424
	mov	ecx, [eax + SOCKET.Type]
440
	jl	s_error
425
 
441
 
426
	mov	bx, word [edx + 2]
442
	mov	bx, word [edx + 2]
Line 427... Line 443...
427
	test	bx, bx
443
	test	bx, bx
Line 471... Line 487...
471
 
487
 
Line 472... Line 488...
472
	jmp	s_error
488
	jmp	s_error
Line 473... Line 489...
473
 
489
 
474
  .af_inet4:
490
  .af_inet4:
Line 475... Line 491...
475
 
491
 
476
	cmp	[eax + SOCKET.Type], IP_PROTO_UDP
492
	cmp	[eax + SOCKET.Protocol], IP_PROTO_UDP
Line 477... Line 493...
477
	je	.udp
493
	je	.udp
478
 
494
 
-
 
495
	cmp	[eax + SOCKET.Protocol], IP_PROTO_TCP
-
 
496
	je	.tcp
-
 
497
 
Line 479... Line 498...
479
	cmp	[eax + SOCKET.Type], IP_PROTO_TCP
498
	cmp	[eax + SOCKET.Protocol], IP_PROTO_IP
Line -... Line 499...
-
 
499
	je	.ip
480
	je	.tcp
500
 
481
 
501
	cmp	[eax + SOCKET.Protocol], IP_PROTO_ICMP
482
	cmp	[eax + SOCKET.Type], SOCK_RAW
502
	je	.ip
483
	je	.raw
503
 
484
 
504
	jmp	s_error
Line 495... Line 515...
495
	DEBUGF	1,"remote ip: %u.%u.%u.%u\n",[edx+4]:1,[edx+5]:1,[edx+6]:1,[edx+7]:1
515
	DEBUGF	1,"remote ip: %u.%u.%u.%u\n",[edx+4]:1,[edx+5]:1,[edx+6]:1,[edx+7]:1
Line 496... Line 516...
496
 
516
 
497
	mov	dword [esp+32], 0
517
	mov	dword [esp+32], 0
Line 498... Line 518...
498
	ret
518
	ret
499
 
519
 
500
 
520
align 4
501
  .tcp:
521
  .tcp:
Line 502... Line 522...
502
	lea	ebx, [eax + SOCKET.lock]
522
	lea	ebx, [eax + SOCKET.lock]
Line 530... Line 550...
530
	mov	[eax + SOCKET.lock], 0
550
	mov	[eax + SOCKET.lock], 0
Line 531... Line 551...
531
 
551
 
532
	mov	dword [esp+32], 0	; success!
552
	mov	dword [esp+32], 0	; success!
Line -... Line 553...
-
 
553
	ret
533
	ret
554
 
534
 
555
align 4
535
  .raw:
556
  .ip:
Line 536... Line 557...
536
	push	dword [edx + 4]
557
	push	dword [edx + 4]
537
	pop	dword [eax + IP_SOCKET.RemoteIP]
558
	pop	dword [eax + IP_SOCKET.RemoteIP]
Line 558... Line 579...
558
	jz	s_error
579
	jz	s_error
Line 559... Line 580...
559
 
580
 
560
	cmp	word [eax + SOCKET.Domain], AF_INET4
581
	cmp	word [eax + SOCKET.Domain], AF_INET4
Line 561... Line 582...
561
	jne	s_error
582
	jne	s_error
562
 
583
 
Line 563... Line 584...
563
	cmp	[eax + SOCKET.Type], IP_PROTO_TCP
584
	cmp	[eax + SOCKET.Protocol], IP_PROTO_TCP
Line 564... Line 585...
564
	jne	s_error
585
	jne	s_error
Line 570... Line 591...
570
	mov	edx, MAX_backlog
591
	mov	edx, MAX_backlog
571
  .ok:
592
  .ok:
Line 572... Line 593...
572
 
593
 
573
	mov	[eax + TCP_SOCKET.backlog], dx
594
	mov	[eax + TCP_SOCKET.backlog], dx
574
	mov	[eax + TCP_SOCKET.t_state], TCB_LISTEN
595
	mov	[eax + TCP_SOCKET.t_state], TCB_LISTEN
Line 575... Line 596...
575
	 or	[eax + SOCKET.options], SO_ACCEPTCON
596
	 or	[eax + SOCKET.options], SO_ACCEPTCON		;;;; TODO: set socket state to listen
Line 576... Line 597...
576
 
597
 
Line 602... Line 623...
602
 
623
 
Line 603... Line 624...
603
	jmp	s_error
624
	jmp	s_error
Line 604... Line 625...
604
 
625
 
605
  .af_inet4:
626
  .af_inet4:
Line 606... Line 627...
606
 
627
 
Line 607... Line 628...
607
	cmp	[eax + SOCKET.Type], IP_PROTO_TCP
628
	cmp	[eax + SOCKET.Protocol], IP_PROTO_TCP
Line 649... Line 670...
649
	jz	s_error
670
	jz	s_error
Line 650... Line 671...
650
 
671
 
651
	cmp	[eax + SOCKET.Domain], AF_INET4
672
	cmp	[eax + SOCKET.Domain], AF_INET4
Line 652... Line 673...
652
	jne	s_error
673
	jne	s_error
653
 
674
 
Line 654... Line 675...
654
	cmp	[eax + SOCKET.Type], IP_PROTO_UDP
675
	cmp	[eax + SOCKET.Protocol], IP_PROTO_UDP
655
	je	.free
676
	je	.free
Line -... Line 677...
-
 
677
 
-
 
678
	cmp	[eax + SOCKET.Protocol], IP_PROTO_ICMP
-
 
679
	je	.free
656
 
680
 
657
	cmp	[eax + SOCKET.Type], IP_PROTO_ICMP
681
	cmp	[eax + SOCKET.Protocol], IP_PROTO_IP
Line 658... Line 682...
658
	je	.free
682
	je	.free
Line 659... Line 683...
659
 
683
 
Line 893... Line 917...
893
	mov	dword [esp+32], 0
917
	mov	dword [esp+32], 0
894
	ret
918
	ret
Line -... Line 919...
-
 
919
 
-
 
920
 
-
 
921
 
-
 
922
 
-
 
923
align 4
-
 
924
SOCKET_set_opt:
-
 
925
 
-
 
926
	ret
895
 
927
 
896
 
928
 
897
 
929
 
898
;-----------------------------------------------------------------
930
;-----------------------------------------------------------------
899
;
931
;
Line 940... Line 972...
940
 
972
 
Line 941... Line 973...
941
	DEBUGF	1,"SOCKET_find_port\n"
973
	DEBUGF	1,"SOCKET_find_port\n"
Line 942... Line 974...
942
 
974
 
943
	push	ebx esi ecx
975
	push	ebx esi ecx
Line 944... Line 976...
944
 
976
 
945
	cmp	[eax + SOCKET.Type], IP_PROTO_UDP
977
	cmp	[eax + SOCKET.Protocol], IP_PROTO_UDP
Line 946... Line 978...
946
	je	.udp
978
	je	.udp
Line 947... Line 979...
947
 
979
 
Line 984... Line 1016...
984
 
1016
 
985
 
1017
 
986
 
1018
 
987
;-----------------------------------------------------------------
1019
;-----------------------------------------------------------------
988
;
1020
;
989
; SOCKET_check_port
1021
; SOCKET_check_port (to be used with AF_INET only!)
990
;
1022
;
991
; Checks if a local port number is unused
1023
; Checks if a local port number is unused
Line 1000... Line 1032...
1000
align 4
1032
align 4
1001
SOCKET_check_port:
1033
SOCKET_check_port:
Line 1002... Line 1034...
1002
 
1034
 
Line 1003... Line 1035...
1003
	DEBUGF	1,"SOCKET_check_port\n"
1035
	DEBUGF	1,"SOCKET_check_port\n"
1004
 
1036
 
Line 1005... Line 1037...
1005
	mov	ecx, [eax + SOCKET.Type]
1037
	mov	ecx, [eax + SOCKET.Protocol]
1006
	mov	esi, net_sockets
1038
	mov	esi, net_sockets
1007
 
1039
 
1008
  .next_socket:
1040
  .next_socket:
Line 1009... Line 1041...
1009
	mov	esi, [esi + SOCKET.NextPtr]
1041
	mov	esi, [esi + SOCKET.NextPtr]
1010
	or	esi, esi
1042
	or	esi, esi
Line 1011... Line 1043...
1011
	jz	.port_ok
1043
	jz	.port_ok
1012
 
1044
 
Line 1402... Line 1434...
1402
	DEBUGF	1, "SOCKET_free: freeing socket..\n"
1434
	DEBUGF	1, "SOCKET_free: freeing socket..\n"
Line 1403... Line 1435...
1403
 
1435
 
1404
	cmp	[eax + SOCKET.Domain], AF_INET4
1436
	cmp	[eax + SOCKET.Domain], AF_INET4
Line 1405... Line 1437...
1405
	jnz	.no_tcp
1437
	jnz	.no_tcp
1406
 
1438
 
Line 1407... Line 1439...
1407
	cmp	[eax + SOCKET.Type], IP_PROTO_TCP
1439
	cmp	[eax + SOCKET.Protocol], IP_PROTO_TCP
1408
	jnz	.no_tcp
1440
	jnz	.no_tcp
1409
 
1441
 
Line 1623... Line 1655...
1623
 
1655
 
Line 1624... Line 1656...
1624
	DEBUGF	1,"closing socket %x", eax, ebx
1656
	DEBUGF	1,"closing socket %x", eax, ebx
Line 1625... Line 1657...
1625
 
1657
 
1626
	mov	[ebx + SOCKET.PID], 0
1658
	mov	[ebx + SOCKET.PID], 0
Line 1627... Line 1659...
1627
 
1659
 
1628
	cmp	[ebx + SOCKET.Type], IP_PROTO_UDP
1660
	cmp	[ebx + SOCKET.Protocol], IP_PROTO_UDP
Line 1629... Line 1661...
1629
	je	.udp
1661
	je	.udp
Line 1630... Line 1662...
1630
 
1662