Subversion Repositories Kolibri OS

Rev

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

Rev 4021 Rev 4025
Line 496... Line 496...
496
        jz      .invalid
496
        jz      .invalid
Line 497... Line 497...
497
 
497
 
498
        cmp     esi, 8
498
        cmp     esi, 8
Line -... Line 499...
-
 
499
        jb      .invalid
-
 
500
 
-
 
501
        cmp     [eax + SOCKET.state], SS_ISCONNECTING
-
 
502
        je      .already
-
 
503
 
-
 
504
        test    [eax + SOCKET.options], SO_ACCEPTCON
499
        jb      .invalid
505
        jnz     .notsupp
500
 
506
 
Line 501... Line 507...
501
        cmp     word [edx], AF_INET4
507
        cmp     word [edx], AF_INET4
502
        je      .af_inet4
508
        je      .af_inet4
Line 509... Line 515...
509
  .invalid:
515
  .invalid:
510
        mov     dword[esp+20], EINVAL
516
        mov     dword[esp+20], EINVAL
511
        mov     dword[esp+32], -1
517
        mov     dword[esp+32], -1
512
        ret
518
        ret
Line -... Line 519...
-
 
519
 
-
 
520
  .already:
-
 
521
        mov     dword[esp+20], EALREADY
-
 
522
        mov     dword[esp+32], -1
-
 
523
        ret
-
 
524
 
-
 
525
  .eisconn:
-
 
526
        mov     dword[esp+20], EISCONN
-
 
527
        mov     dword[esp+32], -1
-
 
528
        ret
513
 
529
 
514
  .af_inet4:
530
  .af_inet4:
515
        cmp     [eax + IP_SOCKET.LocalIP], 0
531
        cmp     [eax + IP_SOCKET.LocalIP], 0
516
        jne     @f
532
        jne     @f
517
        push    [IP_LIST + 4]                               ; FIXME !i!i!i!
533
        push    [IP_LIST + 4]                               ; FIXME: use correct local IP
518
        pop     [eax + IP_SOCKET.LocalIP]
534
        pop     [eax + IP_SOCKET.LocalIP]
Line 519... Line 535...
519
       @@:
535
       @@:
520
 
536
 
Line 537... Line 553...
537
        pusha
553
        pusha
538
        lea     ecx, [eax + SOCKET.mutex]
554
        lea     ecx, [eax + SOCKET.mutex]
539
        call    mutex_lock
555
        call    mutex_lock
540
        popa
556
        popa
Line -... Line 557...
-
 
557
 
541
 
558
; Fill in remote port and IP, overwriting eventually previous values
542
        pushw   [edx + 2]
559
        pushw   [edx + 2]
Line 543... Line 560...
543
        pop     [eax + UDP_SOCKET.RemotePort]
560
        pop     [eax + UDP_SOCKET.RemotePort]
544
 
561
 
Line 557... Line 574...
557
        pop     eax
574
        pop     eax
Line 558... Line 575...
558
 
575
 
559
        lea     ecx, [eax + SOCKET.mutex]
576
        lea     ecx, [eax + SOCKET.mutex]
Line -... Line 577...
-
 
577
        call    mutex_unlock
-
 
578
 
560
        call    mutex_unlock
579
        call    SOCKET_is_connected
561
 
580
 
Line 562... Line 581...
562
        mov     dword[esp+32], 0
581
        mov     dword[esp+32], 0
563
        ret
582
        ret
-
 
583
 
-
 
584
align 4
-
 
585
  .tcp:
564
 
586
        test    [eax + SOCKET.state], SS_ISCONNECTED
565
align 4
587
        jnz     .eisconn
566
  .tcp:
588
 
567
        pusha
589
        pusha
Line 587... Line 609...
587
        add     [TCP_sequence_num], 6400
609
        add     [TCP_sequence_num], 6400
588
        pop     [eax + TCP_SOCKET.ISS]
610
        pop     [eax + TCP_SOCKET.ISS]
589
        mov     [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
611
        mov     [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
Line 590... Line 612...
590
 
612
 
591
        TCP_sendseqinit eax
-
 
Line 592... Line 613...
592
;        mov     [ebx + TCP_SOCKET.timer_retransmission],   ;; todo: create macro to set retransmission timer
613
        TCP_sendseqinit eax
593
 
614
 
594
        mov     ebx, eax
615
        mov     ebx, eax
Line 595... Line 616...
595
        lea     eax, [ebx + STREAM_SOCKET.snd]
616
        lea     eax, [ebx + STREAM_SOCKET.snd]
596
        call    SOCKET_ring_create              ; TODO: check if memory was available or not
617
        call    SOCKET_ring_create              ; TODO: check if memory was available or not
Line 597... Line 618...
597
 
618
 
598
        lea     eax, [ebx + STREAM_SOCKET.rcv]
619
        lea     eax, [ebx + STREAM_SOCKET.rcv]
599
        call    SOCKET_ring_create              ; TODO: same here
620
        call    SOCKET_ring_create              ; TODO: same here
600
 
621
 
Line 601... Line 622...
601
        pusha
622
        push    ebx
-
 
623
        lea     ecx, [ebx + SOCKET.mutex]
602
        lea     ecx, [ebx + SOCKET.mutex]
624
        call    mutex_unlock
603
        call    mutex_unlock
625
        pop     eax
604
        popa
626
 
Line 605... Line 627...
605
 
627
        call    SOCKET_is_connecting
606
        push    ebx
628
 
607
        mov     eax, ebx
629
        push    eax
Line 608... Line -...
608
        call    TCP_output
-
 
609
        pop     eax
630
        call    TCP_output
-
 
631
        pop     eax
610
 
632
 
Line 611... Line 633...
611
  .block:
633
  .block:
612
        test    [eax + SOCKET.options], SO_NONBLOCK
634
        test    [eax + SOCKET.options], SO_NONBLOCK
613
        jz      .waitforit
635
        jz      .waitforit
Line 633... Line 655...
633
        jmp     .loop
655
        jmp     .loop
Line 634... Line 656...
634
 
656
 
635
  .timeout:
657
  .timeout:
636
        mov     eax, [esp+4]
658
        mov     eax, [esp+4]
-
 
659
        mov     [eax + SOCKET.errorcode], ETIMEDOUT
637
        mov     [eax + SOCKET.errorcode], ETIMEDOUT
660
        and     [eax + SOCKET.state], not SS_ISCONNECTING
638
        call    SOCKET_notify.unblock
661
        call    SOCKET_notify.unblock
Line 639... Line 662...
639
        ret     4
662
        ret     4
640
 
663
 
-
 
664
  .fail:
641
  .fail:
665
        mov     eax, [eax + SOCKET.errorcode]
642
        mov     eax, [eax + SOCKET.errorcode]
666
        mov     [eax + SOCKET.errorcode], 0             ; Clear the error, we only need to send it to the caller once
643
        mov     [esp+20], eax
667
        mov     [esp+20], eax
Line 644... Line 668...
644
        mov     dword[esp+32], -1
668
        mov     dword[esp+32], -1
645
        ret
669
        ret
-
 
670
 
646
 
671
  .established:
647
  .established:
672
        stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect]
Line 648... Line 673...
648
        stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect]
673
        mov     dword[esp+20], EISCONN
Line 2403... Line 2428...
2403
align 4
2428
align 4
2404
SOCKET_is_connecting:
2429
SOCKET_is_connecting:
Line 2405... Line 2430...
2405
 
2430
 
Line 2406... Line 2431...
2406
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax
2431
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax
2407
 
2432
 
Line 2408... Line 2433...
2408
        and     [eax + SOCKET.options], not (SS_ISCONNECTED + SS_ISDISCONNECTING + SS_ISCONFIRMING)
2433
        and     [eax + SOCKET.state], not (SS_ISCONNECTED + SS_ISDISCONNECTING + SS_ISCONFIRMING)
Line 2409... Line 2434...
2409
        or      [eax + SOCKET.options], SS_ISCONNECTING
2434
        or      [eax + SOCKET.state], SS_ISCONNECTING
2410
 
2435