Rev 4423 | Rev 5565 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4423 | Rev 5201 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;; Part of the TCP/IP network stack for KolibriOS ;; |
6 | ;; Part of the TCP/IP network stack for KolibriOS ;; |
7 | ;; ;; |
7 | ;; ;; |
8 | ;; Written by hidnplayr@kolibrios.org ;; |
8 | ;; Written by hidnplayr@kolibrios.org ;; |
9 | ;; ;; |
9 | ;; ;; |
10 | ;; Based on the code of 4.4BSD ;; |
10 | ;; Based on the code of 4.4BSD ;; |
11 | ;; ;; |
11 | ;; ;; |
12 | ;; GNU GENERAL PUBLIC LICENSE ;; |
12 | ;; GNU GENERAL PUBLIC LICENSE ;; |
13 | ;; Version 2, June 1991 ;; |
13 | ;; Version 2, June 1991 ;; |
14 | ;; ;; |
14 | ;; ;; |
15 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
15 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
- | 16 | ||
- | 17 | $Revision: 4850 $ |
|
16 | 18 | ||
17 | 19 | ||
18 | ;------------------------- |
20 | ;------------------------- |
19 | ; |
21 | ; |
20 | ; TCP_usrclose |
22 | ; TCP_usrclose |
21 | ; |
23 | ; |
22 | ; Move connection to next state, based on process close. |
24 | ; Move connection to next state, based on process close. |
23 | ; |
25 | ; |
24 | ; IN: eax = socket ptr |
26 | ; IN: eax = socket ptr |
25 | ; |
27 | ; |
26 | ;------------------------- |
28 | ;------------------------- |
27 | align 4 |
29 | align 4 |
28 | TCP_usrclosed: |
30 | TCP_usrclosed: |
29 | 31 | ||
30 | DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_usrclosed: %x\n", eax |
32 | DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_usrclosed: %x\n", eax |
31 | 33 | ||
32 | push ebx |
34 | push ebx |
33 | mov ebx, [eax + TCP_SOCKET.t_state] |
35 | mov ebx, [eax + TCP_SOCKET.t_state] |
34 | mov ebx, dword [.switch + ebx*4] |
36 | mov ebx, dword [.switch + ebx*4] |
35 | jmp ebx |
37 | jmp ebx |
36 | 38 | ||
37 | .switch: |
39 | .switch: |
38 | 40 | ||
39 | dd .close ; TCPS_CLOSED |
41 | dd .close ; TCPS_CLOSED |
40 | dd .close ; TCPS_LISTEN |
42 | dd .close ; TCPS_LISTEN |
41 | dd .close ; TCPS_SYN_SENT |
43 | dd .close ; TCPS_SYN_SENT |
42 | dd .wait1 ; TCPS_SYN_RECEIVED |
44 | dd .wait1 ; TCPS_SYN_RECEIVED |
43 | dd .wait1 ; TCPS_ESTABLISHED |
45 | dd .wait1 ; TCPS_ESTABLISHED |
44 | dd .last_ack ; TCPS_CLOSE_WAIT |
46 | dd .last_ack ; TCPS_CLOSE_WAIT |
45 | dd .ret ; TCPS_FIN_WAIT_1 |
47 | dd .ret ; TCPS_FIN_WAIT_1 |
46 | dd .ret ; TCPS_CLOSING |
48 | dd .ret ; TCPS_CLOSING |
47 | dd .ret ; TCPS_LAST_ACK |
49 | dd .ret ; TCPS_LAST_ACK |
48 | dd .disc ; TCPS_FIN_WAIT_2 |
50 | dd .disc ; TCPS_FIN_WAIT_2 |
49 | dd .disc ; TCPS_TIMED_WAIT |
51 | dd .disc ; TCPS_TIMED_WAIT |
50 | 52 | ||
51 | 53 | ||
52 | .close: |
54 | .close: |
53 | mov [eax + TCP_SOCKET.t_state], TCPS_CLOSED |
55 | mov [eax + TCP_SOCKET.t_state], TCPS_CLOSED |
54 | call TCP_close |
56 | call TCP_close |
55 | pop ebx |
57 | pop ebx |
56 | ret |
58 | ret |
57 | 59 | ||
58 | .wait1: |
60 | .wait1: |
59 | mov [eax + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1 |
61 | mov [eax + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1 |
60 | pop ebx |
62 | pop ebx |
61 | ret |
63 | ret |
62 | 64 | ||
63 | .last_ack: |
65 | .last_ack: |
64 | mov [eax + TCP_SOCKET.t_state], TCPS_LAST_ACK |
66 | mov [eax + TCP_SOCKET.t_state], TCPS_LAST_ACK |
65 | pop ebx |
67 | pop ebx |
66 | ret |
68 | ret |
67 | 69 | ||
68 | .disc: |
70 | .disc: |
69 | call SOCKET_is_disconnected |
71 | call SOCKET_is_disconnected |
70 | .ret: |
72 | .ret: |
71 | pop ebx |
73 | pop ebx |
72 | ret |
74 | ret |
73 | 75 | ||
74 | 76 | ||
75 | ;------------------------- |
77 | ;------------------------- |
76 | ; |
78 | ; |
77 | ; TCP_connect |
79 | ; TCP_connect |
78 | ; |
80 | ; |
79 | ; IN: eax = socket ptr |
81 | ; IN: eax = socket ptr |
80 | ; OUT: eax = 0 ok / -1 error |
82 | ; OUT: eax = 0 ok / -1 error |
81 | ; ebx = error code |
83 | ; ebx = error code |
82 | ; |
84 | ; |
83 | ;------------------------- |
85 | ;------------------------- |
84 | align 4 |
86 | align 4 |
85 | TCP_connect: |
87 | TCP_connect: |
86 | 88 | ||
87 | test [eax + SOCKET.state], SS_ISCONNECTED |
89 | test [eax + SOCKET.state], SS_ISCONNECTED |
88 | jnz .eisconn |
90 | jnz .eisconn |
89 | 91 | ||
90 | push eax edx |
92 | push eax edx |
91 | lea ecx, [eax + SOCKET.mutex] |
93 | lea ecx, [eax + SOCKET.mutex] |
92 | call mutex_lock |
94 | call mutex_lock |
93 | pop edx eax |
95 | pop edx eax |
94 | 96 | ||
95 | ; Fill in local IP |
97 | ; Fill in local IP |
96 | cmp [eax + IP_SOCKET.LocalIP], 0 |
98 | cmp [eax + IP_SOCKET.LocalIP], 0 |
97 | jne @f |
99 | jne @f |
98 | push [IP_LIST + 4] ; FIXME: use correct local IP |
100 | push [IP_LIST + 4] ; FIXME: use correct local IP |
99 | pop [eax + IP_SOCKET.LocalIP] |
101 | pop [eax + IP_SOCKET.LocalIP] |
100 | 102 | ||
101 | ; Fill in remote port and IP |
103 | ; Fill in remote port and IP |
102 | pushw [edx + 2] |
104 | pushw [edx + 2] |
103 | pop [eax + TCP_SOCKET.RemotePort] |
105 | pop [eax + TCP_SOCKET.RemotePort] |
104 | 106 | ||
105 | pushd [edx + 4] |
107 | pushd [edx + 4] |
106 | pop [eax + IP_SOCKET.RemoteIP] |
108 | pop [eax + IP_SOCKET.RemoteIP] |
107 | 109 | ||
108 | ; Find a local port, if user didnt define one |
110 | ; Find a local port, if user didnt define one |
109 | cmp [eax + TCP_SOCKET.LocalPort], 0 |
111 | cmp [eax + TCP_SOCKET.LocalPort], 0 |
110 | jne @f |
112 | jne @f |
111 | call SOCKET_find_port |
113 | call SOCKET_find_port |
112 | @@: |
114 | @@: |
113 | 115 | ||
114 | ; Start the TCP sequence |
116 | ; Start the TCP sequence |
115 | mov [eax + TCP_SOCKET.timer_persist], 0 |
117 | mov [eax + TCP_SOCKET.timer_persist], 0 |
116 | mov [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT |
118 | mov [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT |
117 | 119 | ||
118 | push [TCP_sequence_num] |
120 | push [TCP_sequence_num] |
119 | add [TCP_sequence_num], 6400 |
121 | add [TCP_sequence_num], 6400 |
120 | pop [eax + TCP_SOCKET.ISS] |
122 | pop [eax + TCP_SOCKET.ISS] |
121 | mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init |
123 | mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init |
122 | 124 | ||
123 | TCP_sendseqinit eax |
125 | TCP_sendseqinit eax |
124 | 126 | ||
125 | mov ebx, eax |
127 | mov ebx, eax |
126 | lea eax, [ebx + STREAM_SOCKET.snd] |
128 | lea eax, [ebx + STREAM_SOCKET.snd] |
127 | call SOCKET_ring_create |
129 | call SOCKET_ring_create |
128 | test eax, eax |
130 | test eax, eax |
129 | jz .nomem |
131 | jz .nomem |
130 | 132 | ||
131 | lea eax, [ebx + STREAM_SOCKET.rcv] |
133 | lea eax, [ebx + STREAM_SOCKET.rcv] |
132 | call SOCKET_ring_create |
134 | call SOCKET_ring_create |
133 | test eax, eax |
135 | test eax, eax |
134 | jz .nomem |
136 | jz .nomem |
135 | 137 | ||
136 | push ebx |
138 | push ebx |
137 | lea ecx, [ebx + SOCKET.mutex] |
139 | lea ecx, [ebx + SOCKET.mutex] |
138 | call mutex_unlock |
140 | call mutex_unlock |
139 | pop eax |
141 | pop eax |
140 | 142 | ||
141 | call SOCKET_is_connecting |
143 | call SOCKET_is_connecting |
142 | 144 | ||
143 | ; Now send the SYN packet to remote end |
145 | ; Now send the SYN packet to remote end |
144 | push eax |
146 | push eax |
145 | call TCP_output |
147 | call TCP_output |
146 | pop eax |
148 | pop eax |
147 | 149 | ||
148 | .block: |
150 | .block: |
149 | test [eax + SOCKET.options], SO_NONBLOCK |
151 | test [eax + SOCKET.options], SO_NONBLOCK |
150 | jz .waitforit |
152 | jz .waitforit |
151 | 153 | ||
152 | xor eax, eax |
154 | xor eax, eax |
153 | dec eax |
155 | dec eax |
154 | mov ebx, EINPROGRESS |
156 | mov ebx, EINPROGRESS |
155 | ret |
157 | ret |
156 | 158 | ||
157 | .nomem: |
159 | .nomem: |
158 | xor eax, eax |
160 | xor eax, eax |
159 | dec eax |
161 | dec eax |
160 | mov ebx, ENOMEM |
162 | mov ebx, ENOMEM |
161 | ret |
163 | ret |
162 | 164 | ||
163 | .eisconn: |
165 | .eisconn: |
164 | xor eax, eax |
166 | xor eax, eax |
165 | dec eax |
167 | dec eax |
166 | mov ebx, EISCONN |
168 | mov ebx, EISCONN |
167 | ret |
169 | ret |
168 | 170 | ||
169 | .waitforit: |
171 | .waitforit: |
170 | push eax |
172 | push eax |
171 | stdcall timer_hs, TCP_time_connect, 0, .timeout, eax |
173 | stdcall timer_hs, TCP_time_connect, 0, .timeout, eax |
172 | pop ebx |
174 | pop ebx |
173 | mov [ebx + TCP_SOCKET.timer_connect], eax |
175 | mov [ebx + TCP_SOCKET.timer_connect], eax |
174 | mov eax, ebx |
176 | mov eax, ebx |
175 | 177 | ||
176 | .loop: |
178 | .loop: |
177 | cmp [eax + SOCKET.errorcode], 0 |
179 | cmp [eax + SOCKET.errorcode], 0 |
178 | jne .fail |
180 | jne .fail |
179 | cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED |
181 | cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED |
180 | je .established |
182 | je .established |
181 | 183 | ||
182 | call SOCKET_block |
184 | call SOCKET_block |
183 | jmp .loop |
185 | jmp .loop |
184 | 186 | ||
185 | .timeout: |
187 | .timeout: |
186 | mov eax, [esp+4] |
188 | mov eax, [esp+4] |
187 | mov [eax + SOCKET.errorcode], ETIMEDOUT |
189 | mov [eax + SOCKET.errorcode], ETIMEDOUT |
188 | and [eax + SOCKET.state], not SS_ISCONNECTING |
190 | and [eax + SOCKET.state], not SS_ISCONNECTING |
189 | call SOCKET_notify.unblock |
191 | call SOCKET_notify |
190 | ret 4 |
192 | ret 4 |
191 | 193 | ||
192 | .fail: |
194 | .fail: |
193 | mov ebx, [eax + SOCKET.errorcode] |
195 | mov ebx, [eax + SOCKET.errorcode] |
194 | mov [eax + SOCKET.errorcode], 0 ; Clear the error, we only need to send it to the caller once |
196 | mov [eax + SOCKET.errorcode], 0 ; Clear the error, we only need to send it to the caller once |
195 | xor eax, eax |
197 | xor eax, eax |
196 | dec eax |
198 | dec eax |
197 | ret |
199 | ret |
198 | 200 | ||
199 | .established: |
201 | .established: |
200 | stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect] |
202 | stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect] |
201 | 203 | ||
202 | xor eax, eax |
204 | xor eax, eax |
203 | ret |
205 | ret |