Subversion Repositories Kolibri OS

Rev

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

Rev 3725 Rev 4265
Line 72... Line 72...
72
  .ret:
72
  .ret:
73
        pop     ebx
73
        pop     ebx
74
        ret
74
        ret
Line -... Line 75...
-
 
75
 
-
 
76
 
-
 
77
;-------------------------
-
 
78
;
-
 
79
; TCP_connect
-
 
80
;
-
 
81
;  IN:  eax = socket ptr
-
 
82
;  OUT: eax = 0 ok / -1 error
-
 
83
;       ebx = error code
-
 
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
        pop     edx eax
-
 
96
 
-
 
97
; Fill in local IP
-
 
98
        cmp     [eax + IP_SOCKET.LocalIP], 0
-
 
99
        jne     @f
-
 
100
        push    [IP_LIST + 4]                                   ; FIXME: use correct local IP
-
 
101
        pop     [eax + IP_SOCKET.LocalIP]
-
 
102
 
-
 
103
; Fill in remote port and IP
-
 
104
        pushw   [edx + 2]
-
 
105
        pop     [eax + TCP_SOCKET.RemotePort]
-
 
106
 
-
 
107
        pushd   [edx + 4]
-
 
108
        pop     [eax + IP_SOCKET.RemoteIP]
-
 
109
 
-
 
110
; Find a local port, if user didnt define one
-
 
111
        cmp     [eax + TCP_SOCKET.LocalPort], 0
-
 
112
        jne     @f
-
 
113
        call    SOCKET_find_port
-
 
114
       @@:
-
 
115
 
-
 
116
; Start the TCP sequence
-
 
117
        mov     [eax + TCP_SOCKET.timer_persist], 0
-
 
118
        mov     [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT
-
 
119
 
-
 
120
        push    [TCP_sequence_num]
-
 
121
        add     [TCP_sequence_num], 6400
-
 
122
        pop     [eax + TCP_SOCKET.ISS]
-
 
123
        mov     [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
-
 
124
 
-
 
125
        TCP_sendseqinit eax
-
 
126
 
-
 
127
        mov     ebx, eax
-
 
128
        lea     eax, [ebx + STREAM_SOCKET.snd]
-
 
129
        call    SOCKET_ring_create
-
 
130
        test    eax, eax
-
 
131
        jz      .nomem
-
 
132
 
-
 
133
        lea     eax, [ebx + STREAM_SOCKET.rcv]
-
 
134
        call    SOCKET_ring_create
-
 
135
        test    eax, eax
-
 
136
        jz      .nomem
-
 
137
 
-
 
138
        push    ebx
-
 
139
        lea     ecx, [ebx + SOCKET.mutex]
-
 
140
        call    mutex_unlock
-
 
141
        pop     eax
-
 
142
 
-
 
143
        call    SOCKET_is_connecting
-
 
144
 
-
 
145
; Now send the SYN packet to remote end
-
 
146
        push    eax
-
 
147
        call    TCP_output
-
 
148
        pop     eax
-
 
149
 
-
 
150
  .block:
-
 
151
        test    [eax + SOCKET.options], SO_NONBLOCK
-
 
152
        jz      .waitforit
-
 
153
 
-
 
154
        xor     eax, eax
-
 
155
        dec     eax
-
 
156
        mov     ebx, EINPROGRESS
-
 
157
        ret
-
 
158
 
-
 
159
  .nomem:
-
 
160
        xor     eax, eax
-
 
161
        dec     eax
-
 
162
        mov     ebx, ENOMEM
-
 
163
        ret
-
 
164
 
-
 
165
  .eisconn:
-
 
166
        xor     eax, eax
-
 
167
        dec     eax
-
 
168
        mov     ebx, EISCONN
-
 
169
        ret
-
 
170
 
-
 
171
  .waitforit:
-
 
172
        push    eax
-
 
173
        stdcall timer_hs, TCP_time_connect, 0, .timeout, eax
-
 
174
        pop     ebx
-
 
175
        mov     [ebx + TCP_SOCKET.timer_connect], eax
-
 
176
        mov     eax, ebx
-
 
177
 
-
 
178
  .loop:
-
 
179
        cmp     [eax + SOCKET.errorcode], 0
-
 
180
        jne     .fail
-
 
181
        cmp     [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
-
 
182
        je      .established
-
 
183
 
-
 
184
        call    SOCKET_block
-
 
185
        jmp     .loop
-
 
186
 
-
 
187
  .timeout:
-
 
188
        mov     eax, [esp+4]
-
 
189
        mov     [eax + SOCKET.errorcode], ETIMEDOUT
-
 
190
        and     [eax + SOCKET.state], not SS_ISCONNECTING
-
 
191
        call    SOCKET_notify.unblock
-
 
192
        ret     4
-
 
193
 
-
 
194
  .fail:
-
 
195
        mov     ebx, [eax + SOCKET.errorcode]
-
 
196
        mov     [eax + SOCKET.errorcode], 0                     ; Clear the error, we only need to send it to the caller once
-
 
197
        xor     eax, eax
-
 
198
        dec     eax
-
 
199
        ret
-
 
200
 
-
 
201
  .established:
-
 
202
        stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect]
-
 
203
 
-
 
204
        xor     eax, eax
-
 
205
        ret
Line 75... Line 206...
75
 
206
 
76
 
207
 
77
 
208