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 |