Subversion Repositories Kolibri OS

Rev

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