Subversion Repositories Kolibri OS

Rev

Rev 7678 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2019. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;  Part of the TCP/IP network stack for KolibriOS                 ;;
  7. ;;                                                                 ;;
  8. ;;   Written by hidnplayr@kolibrios.org                            ;;
  9. ;;                                                                 ;;
  10. ;;    Based on the code of 4.4BSD                                  ;;
  11. ;;                                                                 ;;
  12. ;;          GNU GENERAL PUBLIC LICENSE                             ;;
  13. ;;             Version 2, June 1991                                ;;
  14. ;;                                                                 ;;
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16.  
  17. $Revision: 7679 $
  18.  
  19.  
  20. ;-----------------------------------------------------------------;
  21. ;                                                                 ;
  22. ; tcp_usrclosed                                                   ;
  23. ;                                                                 ;
  24. ;  IN:  eax = socket ptr                                          ;
  25. ;                                                                 ;
  26. ;  OUT: /                                                         ;
  27. ;                                                                 ;
  28. ;-----------------------------------------------------------------;
  29. align 4
  30. tcp_usrclosed:
  31.  
  32.         DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_usrclosed: %x\n", eax
  33.  
  34.         push    ebx
  35.         mov     ebx, [eax + TCP_SOCKET.t_state]
  36.         mov     ebx, dword [.switch + ebx*4]
  37.         jmp     ebx
  38.  
  39.   .switch:
  40.         dd      .close                  ; TCPS_CLOSED
  41.         dd      .close                  ; TCPS_LISTEN
  42.         dd      .close                  ; TCPS_SYN_SENT
  43.         dd      .wait1                  ; TCPS_SYN_RECEIVED
  44.         dd      .wait1                  ; TCPS_ESTABLISHED
  45.         dd      .last_ack               ; TCPS_CLOSE_WAIT
  46.         dd      .ret                    ; TCPS_FIN_WAIT_1
  47.         dd      .ret                    ; TCPS_CLOSING
  48.         dd      .ret                    ; TCPS_LAST_ACK
  49.         dd      .disc                   ; TCPS_FIN_WAIT_2
  50.         dd      .disc                   ; TCPS_TIMED_WAIT
  51.  
  52.   .close:
  53.         mov     [eax + TCP_SOCKET.t_state], TCPS_CLOSED
  54.         call    tcp_close
  55.         pop     ebx
  56.         ret
  57.  
  58.   .wait1:
  59.         mov     [eax + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1
  60.         pop     ebx
  61.         ret
  62.  
  63.   .last_ack:
  64.         mov     [eax + TCP_SOCKET.t_state], TCPS_LAST_ACK
  65.         pop     ebx
  66.         ret
  67.  
  68.   .disc:
  69.         call    socket_is_disconnected
  70.   .ret:
  71.         pop     ebx
  72.         ret
  73.  
  74.  
  75. ;-----------------------------------------------------------------;
  76. ;                                                                 ;
  77. ; tcp_connect                                                     ;
  78. ;                                                                 ;
  79. ;  IN:  eax = socket ptr                                          ;
  80. ;                                                                 ;
  81. ;  OUT: eax = 0 on success                                        ;
  82. ;       eax = -1 on error                                         ;
  83. ;       ebx = error code on error                                 ;
  84. ;                                                                 ;
  85. ;-----------------------------------------------------------------;
  86. align 4
  87. tcp_connect:
  88.  
  89.         test    [eax + SOCKET.state], SS_ISCONNECTED
  90.         jnz     .eisconn
  91.  
  92.         push    eax edx
  93.         lea     ecx, [eax + SOCKET.mutex]
  94.         call    mutex_lock
  95.  
  96.         mov     ebx, eax
  97.         lea     eax, [ebx + STREAM_SOCKET.snd]
  98.         call    socket_ring_create
  99.         test    eax, eax
  100.         jz      .nomem
  101.  
  102.         lea     eax, [ebx + STREAM_SOCKET.rcv]
  103.         call    socket_ring_create
  104.         test    eax, eax
  105.         jz      .nomem
  106.         pop     edx eax
  107.  
  108. ; Fill in remote port and IP
  109.         pushw   [edx + 2]
  110.         pop     [eax + TCP_SOCKET.RemotePort]
  111.  
  112.         pushd   [edx + 4]
  113.         pop     [eax + TCP_SOCKET.RemoteIP]
  114.  
  115. ; Find route to host
  116.         pusha
  117.         push    eax
  118.         mov     ebx, [eax + TCP_SOCKET.device]
  119.         mov     edx, [eax + TCP_SOCKET.LocalIP]
  120.         mov     eax, [eax + TCP_SOCKET.RemoteIP]
  121.         call    ipv4_route
  122.         test    eax, eax
  123.         jz      .enoroute
  124.         pop     eax
  125.         mov     ebx, [net_device_list + edi]
  126.         mov     [eax + TCP_SOCKET.device], ebx
  127.         mov     [eax + TCP_SOCKET.LocalIP], edx
  128.         popa
  129.  
  130. ; Find a local port, if user didnt define one
  131.         cmp     [eax + TCP_SOCKET.LocalPort], 0
  132.         jne     @f
  133.         call    socket_find_port
  134.        @@:
  135.  
  136. ; Compute window scaling factor
  137.         push    ecx
  138.         xor     ecx, ecx
  139.         mov     ebx, TCP_max_win
  140.   @@:
  141.         cmp     ebx, SOCKET_BUFFER_SIZE
  142.         ja      @f
  143.         shl     ebx, 1
  144.         inc     ecx
  145.         cmp     ecx, TCP_max_winshift
  146.         jb      @r
  147.   @@:
  148.         mov     [eax + TCP_SOCKET.request_r_scale], cl
  149.         pop     ecx
  150.  
  151.         call    socket_is_connecting
  152.         inc     [TCPS_connattempt]
  153.  
  154.         mov     [eax + TCP_SOCKET.timer_persist], 0
  155.         mov     [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT
  156.  
  157.         mov     [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
  158.  
  159.         push    [TCP_sequence_num]
  160.         add     [TCP_sequence_num], TCP_ISSINCR/2
  161.         pop     [eax + TCP_SOCKET.ISS]
  162.  
  163.         tcp_sendseqinit eax
  164.  
  165.         push    eax
  166.         lea     ecx, [eax + SOCKET.mutex]
  167.         call    mutex_unlock
  168.         pop     eax
  169.  
  170. ; Now send the SYN packet to remote end
  171.         push    eax
  172.         call    tcp_output
  173.         pop     eax
  174.  
  175.         test    [eax + SOCKET.options], SO_NONBLOCK
  176.         jz      .waitforit
  177.  
  178.         xor     eax, eax
  179.         dec     eax
  180.         mov     ebx, EINPROGRESS
  181.         ret
  182.  
  183.   .nomem:
  184.         pop     edx eax
  185.         xor     eax, eax
  186.         dec     eax
  187.         mov     ebx, ENOMEM
  188.         ret
  189.  
  190.   .eisconn:
  191.         xor     eax, eax
  192.         dec     eax
  193.         mov     ebx, EISCONN
  194.         ret
  195.  
  196.   .enoroute:
  197.         pop     eax
  198.         popa
  199.         xor     eax, eax
  200.         dec     eax
  201.         mov     ebx, EADDRNOTAVAIL
  202.         ret
  203.  
  204.   .waitforit:
  205.         push    eax
  206.         stdcall timer_hs, TCP_time_connect, 0, .timeout, eax
  207.         pop     ebx
  208.         mov     [ebx + TCP_SOCKET.timer_connect], eax
  209.         mov     eax, ebx
  210.  
  211.   .loop:
  212.         cmp     [eax + SOCKET.errorcode], 0
  213.         jne     .fail
  214.         cmp     [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
  215.         je      .established
  216.  
  217.         call    socket_block
  218.         jmp     .loop
  219.  
  220.   .timeout:
  221.         mov     eax, [esp+4]
  222.         mov     [eax + SOCKET.errorcode], ETIMEDOUT
  223.         and     [eax + SOCKET.state], not SS_ISCONNECTING
  224.         call    socket_notify
  225.         ret     4
  226.  
  227.   .fail:
  228.         mov     ebx, [eax + SOCKET.errorcode]
  229.         mov     [eax + SOCKET.errorcode], 0                     ; Clear the error, we only need to send it to the caller once
  230.         xor     eax, eax
  231.         dec     eax
  232.         ret
  233.  
  234.   .established:
  235.         stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect]
  236.         xor     eax, eax
  237.         ret