Subversion Repositories Kolibri OS

Rev

Rev 5363 | Rev 6011 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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