Subversion Repositories Kolibri OS

Rev

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

Rev 3908 Rev 4265
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: 3908 $
18
$Revision: 4265 $
Line 19... Line 19...
19
 
19
 
20
struct  SOCKET
20
struct  SOCKET
Line 37... Line 37...
37
        state                   dd ?
37
        state                   dd ?
38
        backlog                 dw ? ; how many incoming connections that can be queued
38
        backlog                 dw ? ; how many incoming connections that can be queued
Line 39... Line 39...
39
 
39
 
40
        snd_proc                dd ?
40
        snd_proc                dd ?
-
 
41
        rcv_proc                dd ?
Line 41... Line 42...
41
        rcv_proc                dd ?
42
        connect_proc            dd ?
Line 42... Line 43...
42
 
43
 
Line 129... Line 130...
129
        timer_flags             dd ?
130
        timer_flags             dd ?
130
        timer_retransmission    dd ? ; rexmt
131
        timer_retransmission    dd ? ; rexmt
131
        timer_persist           dd ?
132
        timer_persist           dd ?
132
        timer_keepalive         dd ? ; keepalive/syn timeout
133
        timer_keepalive         dd ? ; keepalive/syn timeout
133
        timer_timed_wait        dd ? ; also used as 2msl timer
134
        timer_timed_wait        dd ? ; also used as 2msl timer
-
 
135
        timer_connect           dd ?
Line 134... Line 136...
134
 
136
 
Line 135... Line 137...
135
; extra
137
; extra
136
 
138
 
Line 140... Line 142...
140
        seg_next                dd ? ; re-assembly queue
142
        seg_next                dd ? ; re-assembly queue
Line 141... Line 143...
141
 
143
 
142
        temp_bits               db ?
144
        temp_bits               db ?
Line -... Line 145...
-
 
145
                                rb 3 ; align
143
                                rb 3 ; align
146
 
Line 144... Line 147...
144
 
147
 
Line 145... Line 148...
145
ends
148
ends
146
 
149
 
147
struct  UDP_SOCKET              IP_SOCKET
-
 
Line 148... Line 150...
148
 
150
struct  UDP_SOCKET              IP_SOCKET
Line 149... Line 151...
149
        LocalPort               dw ? ; network byte order
151
 
Line 307... Line 309...
307
  @@:
309
  @@:
Line 308... Line 310...
308
 
310
 
309
        mov     [eax + SOCKET.Domain], ecx
311
        mov     [eax + SOCKET.Domain], ecx
310
        mov     [eax + SOCKET.Type], edx
312
        mov     [eax + SOCKET.Type], edx
-
 
313
        mov     [eax + SOCKET.Protocol], esi
Line 311... Line 314...
311
        mov     [eax + SOCKET.Protocol], esi
314
        mov     [eax + SOCKET.connect_proc], connect_notsupp
312
 
315
 
Line 313... Line 316...
313
        cmp     ecx, AF_INET4
316
        cmp     ecx, AF_INET4
Line 355... Line 358...
355
align 4
358
align 4
356
  .udp:
359
  .udp:
357
        mov     [eax + SOCKET.Protocol], IP_PROTO_UDP
360
        mov     [eax + SOCKET.Protocol], IP_PROTO_UDP
358
        mov     [eax + SOCKET.snd_proc], SOCKET_send_udp
361
        mov     [eax + SOCKET.snd_proc], SOCKET_send_udp
359
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
362
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
-
 
363
        mov     [eax + SOCKET.connect_proc], UDP_connect
360
        ret
364
        ret
Line 361... Line 365...
361
 
365
 
362
align 4
366
align 4
363
  .tcp:
367
  .tcp:
364
        mov     [eax + SOCKET.Protocol], IP_PROTO_TCP
368
        mov     [eax + SOCKET.Protocol], IP_PROTO_TCP
365
        mov     [eax + SOCKET.snd_proc], SOCKET_send_tcp
369
        mov     [eax + SOCKET.snd_proc], SOCKET_send_tcp
-
 
370
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_stream
Line 366... Line 371...
366
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_stream
371
        mov     [eax + SOCKET.connect_proc], TCP_connect
367
 
372
 
Line 368... Line 373...
368
        TCP_init_socket eax
373
        TCP_init_socket eax
369
        ret
374
        ret
370
 
375
 
371
 
376
 
-
 
377
align 4
372
align 4
378
  .raw_ip:
Line 373... Line 379...
373
  .raw_ip:
379
        mov     [eax + SOCKET.snd_proc], SOCKET_send_ip
374
        mov     [eax + SOCKET.snd_proc], SOCKET_send_ip
380
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
375
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
381
        mov     [eax + SOCKET.connect_proc], IPv4_connect
376
        ret
382
        ret
-
 
383
 
377
 
384
 
Line 378... Line 385...
378
 
385
align 4
379
align 4
386
  .raw_icmp:
380
  .raw_icmp:
387
        mov     [eax + SOCKET.snd_proc], SOCKET_send_icmp
Line 412... Line 419...
412
        jz      .invalid
419
        jz      .invalid
Line 413... Line 420...
413
 
420
 
414
        cmp     esi, 2
421
        cmp     esi, 2
Line -... Line 422...
-
 
422
        jb      .invalid
-
 
423
 
-
 
424
        cmp     [eax + UDP_SOCKET.LocalPort], 0         ; Socket can only be bound once
415
        jb      .invalid
425
        jnz     .invalid
416
 
426
 
Line 417... Line 427...
417
        cmp     word [edx], AF_INET4
427
        cmp     word [edx], AF_INET4
418
        je      .af_inet4
428
        je      .af_inet4
Line 447... Line 457...
447
 
457
 
Line 448... Line 458...
448
        jmp     .notsupp
458
        jmp     .notsupp
449
 
459
 
450
  .tcp:
-
 
451
  .udp:
-
 
452
        mov     ebx, [edx + 4]                  ; First, fill in the IP
-
 
453
        test    ebx, ebx                        ; If IP is 0, use default
-
 
454
        jnz     @f
-
 
455
        mov     ebx, [IP_LIST + 4]      ;;;;; FIXME !i!i!i
-
 
Line 456... Line 460...
456
       @@:
460
  .tcp:
457
        mov     [eax + IP_SOCKET.LocalIP], ebx
461
  .udp:
458
 
-
 
Line -... Line 462...
-
 
462
 
-
 
463
        pushd   [edx + 4]                       ; First, fill in the IP
-
 
464
        popd    [eax + IP_SOCKET.LocalIP]
-
 
465
 
-
 
466
        mov     bx, [edx + 2]                   ; Did caller specify a local port?
-
 
467
        test    bx, bx
-
 
468
        jnz     .just_check
-
 
469
        call    SOCKET_find_port                ; Nope, find an ephemeral one
-
 
470
        jmp     .done
-
 
471
 
-
 
472
  .just_check:
459
        mov     bx, [edx + 2]                   ; Now fill in the local port if it's still available
473
        call    SOCKET_check_port               ; Yes, check if it's still available
460
        call    SOCKET_check_port
474
        jz      .addrinuse                      ; ZF is set by socket_check_port on error
461
        jz      .addrinuse                      ; ZF is set by socket_check_port, on error
475
 
Line 462... Line 476...
462
 
476
  .done:
Line 494... Line 508...
494
        jz      .invalid
508
        jz      .invalid
Line 495... Line 509...
495
 
509
 
496
        cmp     esi, 8
510
        cmp     esi, 8
Line 497... Line -...
497
        jb      .invalid
-
 
498
 
-
 
499
        cmp     word [edx], AF_INET4
-
 
500
        je      .af_inet4
-
 
501
 
-
 
502
  .notsupp:
-
 
503
        mov     dword[esp+20], EOPNOTSUPP
-
 
504
        mov     dword[esp+32], -1
-
 
505
        ret
-
 
506
 
-
 
507
  .invalid:
-
 
508
        mov     dword[esp+20], EINVAL
-
 
509
        mov     dword[esp+32], -1
-
 
510
        ret
-
 
511
 
-
 
512
  .af_inet4:
-
 
513
        cmp     [eax + IP_SOCKET.LocalIP], 0
-
 
514
        jne     @f
-
 
515
        push    [IP_LIST + 4]                               ; FIXME !i!i!i!
-
 
516
        pop     [eax + IP_SOCKET.LocalIP]
-
 
517
       @@:
511
        jb      .invalid
518
 
512
 
519
        cmp     [eax + SOCKET.Protocol], IP_PROTO_UDP
-
 
520
        je      .udp
-
 
521
 
-
 
522
        cmp     [eax + SOCKET.Protocol], IP_PROTO_TCP
-
 
523
        je      .tcp
-
 
524
 
-
 
525
        cmp     [eax + SOCKET.Protocol], IP_PROTO_IP
-
 
526
        je      .ip
-
 
527
 
-
 
528
        cmp     [eax + SOCKET.Protocol], IP_PROTO_ICMP
-
 
529
        je      .ip
-
 
530
 
-
 
531
        jmp     .notsupp
-
 
532
 
-
 
533
align 4
-
 
534
  .udp:
-
 
535
        pusha
-
 
536
        lea     ecx, [eax + SOCKET.mutex]
-
 
537
        call    mutex_lock
-
 
538
        popa
-
 
539
 
-
 
540
        pushw   [edx + 2]
-
 
541
        pop     [eax + UDP_SOCKET.RemotePort]
-
 
542
 
-
 
543
        pushd   [edx + 4]
-
 
544
        pop     [eax + IP_SOCKET.RemoteIP]
-
 
545
 
-
 
546
        cmp     [eax + UDP_SOCKET.LocalPort], 0
-
 
547
        jne     @f
-
 
548
        call    SOCKET_find_port
-
 
549
       @@:
-
 
Line 550... Line -...
550
 
-
 
551
        mov     [eax + UDP_SOCKET.firstpacket], 0
513
        cmp     [eax + SOCKET.state], SS_ISCONNECTING
552
 
514
        je      .already
Line 553... Line 515...
553
        push    eax
515
 
554
        init_queue (eax + SOCKET_QUEUE_LOCATION)        ; Set up data receiving queue
-
 
Line -... Line 516...
-
 
516
        test    [eax + SOCKET.options], SO_ACCEPTCON
555
        pop     eax
517
        jnz     .notsupp
556
 
518
 
Line 557... Line -...
557
        lea     ecx, [eax + SOCKET.mutex]
-
 
558
        call    mutex_unlock
-
 
559
 
-
 
560
        mov     dword[esp+32], 0
-
 
561
        ret
-
 
562
 
-
 
563
align 4
-
 
564
  .tcp:
-
 
565
        pusha
-
 
566
        lea     ecx, [eax + SOCKET.mutex]
-
 
567
        call    mutex_lock
-
 
568
        popa
-
 
569
 
-
 
570
        pushw   [edx + 2]
-
 
571
        pop     [eax + TCP_SOCKET.RemotePort]
-
 
572
 
-
 
573
        pushd   [edx + 4]
-
 
574
        pop     [eax + IP_SOCKET.RemoteIP]
-
 
575
 
-
 
576
        cmp     [eax + TCP_SOCKET.LocalPort], 0
-
 
577
        jne     @f
-
 
578
        call    SOCKET_find_port
-
 
579
       @@:
-
 
580
 
-
 
581
        mov     [eax + TCP_SOCKET.timer_persist], 0
-
 
582
        mov     [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT
-
 
583
 
-
 
584
        push    [TCP_sequence_num]
-
 
585
        add     [TCP_sequence_num], 6400
-
 
586
        pop     [eax + TCP_SOCKET.ISS]
-
 
587
        mov     [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
-
 
588
 
-
 
589
        TCP_sendseqinit eax
-
 
590
;        mov     [ebx + TCP_SOCKET.timer_retransmission],   ;; todo: create macro to set retransmission timer
-
 
591
 
-
 
592
        mov     ebx, eax
-
 
593
        lea     eax, [ebx + STREAM_SOCKET.snd]
-
 
594
        call    SOCKET_ring_create              ; TODO: check if memory was available or not
-
 
595
 
-
 
596
        lea     eax, [ebx + STREAM_SOCKET.rcv]
-
 
Line 597... Line -...
597
        call    SOCKET_ring_create              ; TODO: same here
-
 
598
 
-
 
599
        pusha
-
 
600
        lea     ecx, [ebx + SOCKET.mutex]
-
 
601
        call    mutex_unlock
-
 
602
        popa
519
        call    [eax + SOCKET.connect_proc]
603
 
-
 
604
        push    ebx
-
 
605
        mov     eax, ebx
-
 
606
        call    TCP_output
520
 
607
        pop     eax
521
        mov     dword[esp+20], ebx
608
 
522
        mov     dword[esp+32], eax
Line 609... Line -...
609
  .block:
-
 
610
        test    [eax + SOCKET.options], SO_NONBLOCK
-
 
611
        jz      .loop
-
 
612
 
-
 
613
        mov     dword[esp+20], EWOULDBLOCK
-
 
614
        mov     dword[esp+32], -1
-
 
615
        ret
-
 
616
 
-
 
617
  .loop:
-
 
618
        cmp     [eax + TCP_SOCKET.t_state], TCPS_CLOSED
-
 
619
        je      .fail
523
        ret
620
        cmp     [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
-
 
621
        je      .established
524
 
622
        ja      .fail
525
 
623
 
526
  .notsupp:
Line 624... Line 527...
624
        call    SOCKET_block
527
        mov     dword[esp+20], EOPNOTSUPP
-
 
528
        mov     dword[esp+32], -1
625
        jmp     .loop
529
        ret
626
 
530
 
Line 627... Line -...
627
  .fail:
-
 
628
        mov     eax, [eax + SOCKET.errorcode]
-
 
629
        mov     [esp+20], eax
-
 
630
        mov     dword[esp+32], -1
-
 
631
        ret
-
 
632
 
531
  .invalid:
633
  .established:
-
 
634
        mov     dword[esp+32], 0
-
 
635
        ret
-
 
636
 
-
 
637
 
532
        mov     dword[esp+20], EINVAL
638
align 4
-
 
639
  .ip:
533
        mov     dword[esp+32], -1
640
        pusha
-
 
641
        lea     ecx, [eax + SOCKET.mutex]
-
 
642
        call    mutex_lock
-
 
643
        popa
-
 
644
 
534
        ret
645
        pushd   [edx + 4]
535
 
Line 646... Line 536...
646
        pop     [eax + IP_SOCKET.RemoteIP]
536
  .already:
647
 
537
        mov     dword[esp+20], EALREADY
Line 863... Line 753...
863
  .loop:
753
  .loop:
864
        push    edi
754
        push    edi
865
        call    [eax + SOCKET.rcv_proc]
755
        call    [eax + SOCKET.rcv_proc]
866
        pop     edi
756
        pop     edi
Line -... Line 757...
-
 
757
 
-
 
758
        test    [eax + SOCKET.state], SS_CANTRCVMORE
-
 
759
        jnz     .return
867
 
760
 
868
        cmp     ebx, EWOULDBLOCK
761
        cmp     ebx, EWOULDBLOCK
Line 869... Line 762...
869
        jne     .return
762
        jne     .return
870
 
763
 
Line 871... Line -...
871
        test    edi, MSG_DONTWAIT
-
 
872
        jnz     .return_err
-
 
873
 
-
 
874
        test    [eax + SOCKET.state], SS_CANTRCVMORE
764
        test    edi, MSG_DONTWAIT
875
        jnz     .return_err
765
        jnz     .return_err
Line 876... Line 766...
876
 
766
 
877
;        test    [eax + SOCKET.options], SO_NONBLOCK
767
;        test    [eax + SOCKET.options], SO_NONBLOCK
Line 883... Line 773...
883
 
773
 
884
  .invalid:
774
  .invalid:
885
        push    EINVAL
775
        push    EINVAL
886
        pop     ebx
776
        pop     ebx
887
  .return_err:
777
  .return_err:
888
        mov     eax, -1
778
        mov     ecx, -1
889
  .return:
779
  .return:
890
        mov     [esp+20], ebx
780
        mov     [esp+20], ebx
891
        mov     [esp+32], eax
781
        mov     [esp+32], ecx
Line 907... Line 797...
907
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: %u bytes data\n", ecx
797
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: %u bytes data\n", ecx
Line 908... Line 798...
908
 
798
 
909
        cmp     ecx, ebx                                        ; If data segment does not fit in applications buffer, abort
799
        cmp     ecx, ebx                                        ; If data segment does not fit in applications buffer, abort
Line 910... Line 800...
910
        ja      .too_small
800
        ja      .too_small
911
 
801
 
912
        push    ecx
802
        push    eax ecx
913
        push    [esi + socket_queue_entry.buf_ptr]              ; save the buffer addr so we can clear it later
803
        push    [esi + socket_queue_entry.buf_ptr]              ; save the buffer addr so we can clear it later
Line 914... Line 804...
914
        mov     esi, [esi + socket_queue_entry.data_ptr]
804
        mov     esi, [esi + socket_queue_entry.data_ptr]
Line 928... Line 818...
928
        jz      .nd
818
        jz      .nd
929
        rep movsd
819
        rep movsd
930
  .nd:
820
  .nd:
Line 931... Line 821...
931
 
821
 
932
        call    NET_packet_free
822
        call    NET_packet_free
933
        pop     eax                                             ; return number of bytes copied to application
823
        pop     ecx eax                                         ; return number of bytes copied to application
934
        xor     ebx, ebx
824
        xor     ebx, ebx
Line 935... Line 825...
935
        ret
825
        ret
936
 
826
 
937
  .too_small:
827
  .too_small:
938
        mov     eax, -1
828
        mov     ecx, -1
939
        push    EMSGSIZE
829
        push    EMSGSIZE
Line 940... Line 830...
940
        pop     ebx
830
        pop     ebx
Line 978... Line 868...
978
 
868
 
979
        mov     ecx, esi
869
        mov     ecx, esi
980
        mov     edi, edx
870
        mov     edi, edx
Line -... Line 871...
-
 
871
        xor     edx, edx
981
        xor     edx, edx
872
 
982
 
873
        push    eax
983
        add     eax, STREAM_SOCKET.rcv
874
        add     eax, STREAM_SOCKET.rcv
-
 
875
        call    SOCKET_ring_read                                ; copy data from kernel buffer to application buffer
Line 984... Line -...
984
        call    SOCKET_ring_read                                ; copy data from kernel buffer to application buffer
-
 
985
        call    SOCKET_ring_free                                ; free read memory
876
        call    SOCKET_ring_free                                ; free read memory
986
 
877
        pop     eax
Line 987... Line 878...
987
        mov     eax, ecx                                        ; return number of bytes copied
878
 
988
        xor     ebx, ebx                                        ; errorcode = 0 (no error)
879
        xor     ebx, ebx                                        ; errorcode = 0 (no error)
989
        ret
880
        ret
-
 
881
 
990
 
882
  .wouldblock:
Line 991... Line 883...
991
  .wouldblock:
883
        push    EWOULDBLOCK
992
        push    EWOULDBLOCK
884
        pop     ebx
993
        pop     ebx
885
        xor     ecx, ecx
994
        ret
886
        ret
Line 995... Line 887...
995
 
887
 
Line 2191... Line 2083...
2191
 
2083
 
2192
  .next_socket:
2084
  .next_socket:
2193
        mov     eax, [eax + SOCKET.NextPtr]
2085
        mov     eax, [eax + SOCKET.NextPtr]
2194
        or      eax, eax
2086
        or      eax, eax
-
 
2087
        jz      .error
2195
        jz      .error
2088
                diff16 "tetten", 0, $
2196
        cmp     [eax + SOCKET.Number], ecx
2089
        cmp     [eax + SOCKET.Number], ecx
Line 2197... Line 2090...
2197
        jne     .next_socket
2090
        jne     .next_socket
Line 2319... Line 2212...
2319
;
2212
;
2320
;------------------------------------------------------
2213
;------------------------------------------------------
2321
align 4
2214
align 4
2322
SOCKET_process_end:
2215
SOCKET_process_end:
Line -... Line 2216...
-
 
2216
 
-
 
2217
        cmp     [net_sockets + SOCKET.NextPtr], 0       ; Are there any active sockets at all?
-
 
2218
        je      .quickret                               ; nope, exit immediately
-
 
2219
 
-
 
2220
; TODO: run the following code in another thread, to avoid deadlock
2323
 
2221
 
Line 2324... Line 2222...
2324
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_process_end: %x\n", edx
2222
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_process_end: %x\n", edx
2325
 
2223
 
2326
        pusha
2224
        pusha
Line 2369... Line 2267...
2369
        pusha
2267
        pusha
2370
        mov     ecx, socket_mutex
2268
        mov     ecx, socket_mutex
2371
        call    mutex_unlock
2269
        call    mutex_unlock
2372
        popa
2270
        popa
Line -... Line 2271...
-
 
2271
 
2373
 
2272
  .quickret:
Line 2388... Line 2287...
2388
align 4
2287
align 4
2389
SOCKET_is_connecting:
2288
SOCKET_is_connecting:
Line 2390... Line 2289...
2390
 
2289
 
Line 2391... Line 2290...
2391
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax
2290
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax
2392
 
2291
 
Line 2393... Line 2292...
2393
        and     [eax + SOCKET.options], not (SS_ISCONNECTED + SS_ISDISCONNECTING + SS_ISCONFIRMING)
2292
        and     [eax + SOCKET.state], not (SS_ISCONNECTED + SS_ISDISCONNECTING + SS_ISCONFIRMING)
Line 2394... Line 2293...
2394
        or      [eax + SOCKET.options], SS_ISCONNECTING
2293
        or      [eax + SOCKET.state], SS_ISCONNECTING
2395
 
2294