Subversion Repositories Kolibri OS

Rev

Rev 4423 | Rev 5565 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3555 Serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
5201 serge 3
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.    ;;
3555 Serge 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  Part of the TCP/IP network stack for KolibriOS                 ;;
7
;;                                                                 ;;
8
;;   Written by hidnplayr@kolibrios.org                            ;;
9
;;                                                                 ;;
10
;;    Based on the code of 4.4BSD                                  ;;
11
;;                                                                 ;;
12
;;          GNU GENERAL PUBLIC LICENSE                             ;;
13
;;             Version 2, June 1991                                ;;
14
;;                                                                 ;;
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ha 16
 
593 mikedld 17
$Revision: 5201 $
18
 
3555 Serge 19
; Socket states
20
TCPS_CLOSED             = 0
21
TCPS_LISTEN             = 1
22
TCPS_SYN_SENT           = 2
23
TCPS_SYN_RECEIVED       = 3
24
TCPS_ESTABLISHED        = 4
25
TCPS_CLOSE_WAIT         = 5
26
TCPS_FIN_WAIT_1         = 6
27
TCPS_CLOSING            = 7
28
TCPS_LAST_ACK           = 8
29
TCPS_FIN_WAIT_2         = 9
30
TCPS_TIMED_WAIT         = 10
593 mikedld 31
 
3555 Serge 32
; Socket Flags
33
TF_ACKNOW               = 1 shl 0     ; ack peer immediately
34
TF_DELACK               = 1 shl 1     ; ack, but try to delay it
35
TF_NODELAY              = 1 shl 2     ; don't delay packets to coalesce
36
TF_NOOPT                = 1 shl 3     ; don't use tcp options
37
TF_SENTFIN              = 1 shl 4     ; have sent FIN
38
TF_REQ_SCALE            = 1 shl 5     ; have/will request window scaling
39
TF_RCVD_SCALE           = 1 shl 6     ; other side has requested scaling
40
TF_REQ_TSTMP            = 1 shl 7     ; have/will request timestamps
41
TF_RCVD_TSTMP           = 1 shl 8     ; a timestamp was received in SYN
42
TF_SACK_PERMIT          = 1 shl 9     ; other side said I could SACK
1 ha 43
 
3555 Serge 44
; Segment flags
45
TH_FIN                  = 1 shl 0
46
TH_SYN                  = 1 shl 1
47
TH_RST                  = 1 shl 2
48
TH_PUSH                 = 1 shl 3
49
TH_ACK                  = 1 shl 4
50
TH_URG                  = 1 shl 5
261 hidnplayr 51
 
3555 Serge 52
; Segment header options
53
TCP_OPT_EOL             = 0           ; End of option list.
54
TCP_OPT_NOP             = 1           ; No-Operation.
55
TCP_OPT_MAXSEG          = 2           ; Maximum Segment Size.
56
TCP_OPT_WINDOW          = 3           ; window scale
57
TCP_OPT_SACK_PERMIT     = 4           ; Selective Acknowledgement
58
TCP_OPT_SACK            = 5
59
TCP_OPT_TIMESTAMP       = 8
261 hidnplayr 60
 
3555 Serge 61
; Fundamental timer values
62
TCP_time_MSL            = 47          ; max segment lifetime (30s)
63
TCP_time_re_min         = 2           ; min retransmission (1,28s)
64
TCP_time_re_max         = 100         ; max retransmission (64s)
65
TCP_time_pers_min       = 8           ; min persist (5,12s)
66
TCP_time_pers_max       = 94          ; max persist (60,16s)
67
TCP_time_keep_init      = 118         ; connection establishment (75,52s)
68
TCP_time_keep_idle      = 4608        ; idle time before 1st probe (2h)
69
TCP_time_keep_interval  = 118         ; between probes when no response (75,52s)
70
TCP_time_rtt_default    = 5           ; default Round Trip Time (3,2s)
71
TCP_time_srtt_default   = 0           ;
72
TCP_time_max_idle       = 8*TCP_time_keep_interval      ; FIXME
907 mikedld 73
 
4265 Serge 74
TCP_time_connect        = 300         ; in 1/100s (default=3s)
75
 
3555 Serge 76
; timer constants
77
TCP_max_rxtshift        = 12          ; max retransmissions waiting for ACK
78
TCP_max_keepcnt         = 8           ; max keepalive probes
1 ha 79
 
261 hidnplayr 80
;
3555 Serge 81
TCP_max_winshift        = 14
82
TCP_max_win             = 65535
1 ha 83
 
3555 Serge 84
TCP_re_xmit_thresh      = 3
261 hidnplayr 85
 
3555 Serge 86
TCP_mss_default         = 1480        ; default max segment size
261 hidnplayr 87
 
3555 Serge 88
; smoothed round trip time and estimated variance are stored as fixed point numbers,
89
; shifted by the value below.
90
; With these scales, srtt has 3 bits to the right of the binary point, and thus an "alpha"
91
; of .875. rttvar has 2 bits to the right and thus "alpha" of 0.75
92
TCP_RTT_SHIFT           = 3
93
TCP_RTTVAR_SHIFT        = 2
261 hidnplayr 94
 
3555 Serge 95
; bits used by tcp_input and tcp_output
96
TCP_BIT_NEEDOUTPUT      = 1 shl 0
97
TCP_BIT_TIMESTAMP       = 1 shl 1
98
TCP_BIT_DROPSOCKET      = 1 shl 2
5201 serge 99
TCP_BIT_FIN_IS_ACKED    = 1 shl 3
261 hidnplayr 100
 
3555 Serge 101
TCP_BIT_SENDALOT        = 1 shl 0
261 hidnplayr 102
 
3555 Serge 103
TCP_PAWS_IDLE           = 24*24*60*60*100       ; 24 days, in 1/100 seconds
1 ha 104
 
3555 Serge 105
TCP_QUEUE_SIZE          = 50
1 ha 106
 
3555 Serge 107
struct  TCP_header
1 ha 108
 
3555 Serge 109
        SourcePort              dw ?
110
        DestinationPort         dw ?
111
        SequenceNumber          dd ?
112
        AckNumber               dd ?
113
        DataOffset              db ?    ; DataOffset[0-3 bits] and Reserved[4-7]
114
        Flags                   db ?    ; Reserved[0-1 bits]|URG|ACK|PSH|RST|SYN|FIN
115
        Window                  dw ?
116
        Checksum                dw ?
117
        UrgentPointer           dw ?
1 ha 118
 
3555 Serge 119
ends
1 ha 120
 
3555 Serge 121
struct  TCP_queue_entry
1 ha 122
 
5201 serge 123
        ip_ptr                  dd ?
124
        segment_ptr             dd ?
125
        segment_size            dd ?
126
        device_ptr              dd ?
1 ha 127
 
5201 serge 128
        buffer_ptr              dd ?
129
        timestamp               dd ?
1 ha 130
 
3555 Serge 131
ends
1 ha 132
 
3725 Serge 133
uglobal
3555 Serge 134
align 4
3725 Serge 135
 
3626 Serge 136
        TCP_segments_tx         rd NET_DEVICES_MAX
137
        TCP_segments_rx         rd NET_DEVICES_MAX
138
        TCP_segments_missed     rd NET_DEVICES_MAX
139
        TCP_segments_dumped     rd NET_DEVICES_MAX
140
;        TCP_bytes_rx            rq NET_DEVICES_MAX
141
;        TCP_bytes_tx            rq NET_DEVICES_MAX
3555 Serge 142
        TCP_sequence_num        dd ?
3725 Serge 143
        TCP_queue               rd (TCP_QUEUE_SIZE*sizeof.TCP_queue_entry + sizeof.queue)/4
3555 Serge 144
        TCP_input_event         dd ?
5201 serge 145
        TCP_timer1_event        dd ?
3555 Serge 146
endg
1 ha 147
 
4423 Serge 148
uglobal
149
align 4
1 ha 150
 
4423 Serge 151
        TCPS_accepts            dd ?    ; #SYNs received in LISTEN state
152
        TCPS_closed             dd ?    ; #connections closed (includes drops)
153
        TCPS_connattempt        dd ?    ; #connections initiated (calls to connect)
154
        TCPS_conndrops          dd ?    ; #embryonic connections dropped (before SYN received)
155
        TCPS_connects           dd ?    ; #connections established actively or passively
156
        TCPS_delack             dd ?    ; #delayed ACKs sent
157
        TCPS_drops              dd ?    ; #connections dropped (after SYN received)
158
        TCPS_keepdrops          dd ?    ; #connections dropped in keepalive (established or awaiting SYN)
159
        TCPS_keepprobe          dd ?    ; #keepalive probes sent
160
        TCPS_keeptimeo          dd ?    ; #times keepalive timer or connections-establishment timer expire
161
        TCPS_pawsdrop           dd ?    ; #segments dropped due to PAWS
162
        TCPS_pcbcachemiss       dd ?    ; #times PCB cache comparison fails
163
        TCPS_persisttimeo       dd ?    ; #times persist timer expires
164
        TCPS_predack            dd ?    ; #times header prediction correct for ACKs
165
        TCPS_preddat            dd ?    ; #times header prediction correct for data packets
166
        TCPS_rcvackbyte         dd ?    ; #bytes ACKed by received ACKs
167
        TCPS_rcvackpack         dd ?    ; #received ACK packets
168
        TCPS_rcvacktoomuch      dd ?    ; #received ACKs for unsent data
169
        TCPS_rcvafterclose      dd ?    ; #packets received after connection closed
170
        TCPS_rcvbadoff          dd ?    ; #packets received with invalid header length
171
        TCPS_rcvbadsum          dd ?    ; #packets received with checksum errors
172
        TCPS_rcvbyte            dd ?    ; #bytes received in sequence
173
        TCPS_rcvbyteafterwin    dd ?    ; #bytes received beyond advertised window
174
        TCPS_rcvdupack          dd ?    ; #duplicate ACKs received
175
        TCPS_rcvdupbyte         dd ?    ; #bytes receivedin completely duplicate packets
176
        TCPS_rcvduppack         dd ?    ; #packets received with completely duplicate bytes
177
        TCPS_rcvoobyte          dd ?    ; #out-of-order bytes received
178
        TCPS_rcvoopack          dd ?    ; #out-of-order packets received
179
        TCPS_rcvpack            dd ?    ; #packets received in sequence
180
        TCPS_rcvpackafterwin    dd ?    ; #packets with some data beyond advertised window
181
        TCPS_rcvpartdupbyte     dd ?    ; #duplicate bytes in part-duplicate packets
182
        TCPS_rcvpartduppack     dd ?    ; #packets with some duplicate data
183
        TCPS_rcvshort           dd ?    ; #packets received too short
184
        TCPS_rcvtotal           dd ?    ; #total packets received
185
        TCPS_rcvwinprobe        dd ?    ; #window probe packets received
186
        TCPS_rcvwinupd          dd ?    ; #received window update packets
187
        TCPS_rexmttimeo         dd ?    ; #retransmission timeouts
188
        TCPS_rttupdated         dd ?    ; #times RTT estimators updated
189
        TCPS_segstimed          dd ?    ; #segments for which TCP tried to measure RTT
190
        TCPS_sndacks            dd ?    ; #ACK-only packets sent (data length = 0)
191
        TCPS_sndbyte            dd ?    ; #data bytes sent
192
        TCPS_sndctrl            dd ?    ; #control (SYN, FIN, RST) packets sent (data length = 0)
193
        TCPS_sndpack            dd ?    ; #data packets sent (data length > 0)
194
        TCPS_sndprobe           dd ?    ; #window probes sent (1 byte of data forced by persist timer)
195
        TCPS_sndrexmitbyte      dd ?    ; #data bytes retransmitted
196
        TCPS_sndrexmitpack      dd ?    ; #data packets retransmitted
197
        TCPS_sndtotal           dd ?    ; total #packets sent
198
        TCPS_sndurg             dd ?    ; #packets sent with URG-only (data length=0)
199
        TCPS_sndwinup           dd ?    ; #window update-only packets sent (data length=0)
200
        TCPS_timeoutdrop        dd ?    ; #connections dropped in retransmission timeout
201
 
202
endg
203
 
204
 
3555 Serge 205
;-----------------------------------------------------------------
1 ha 206
;
3555 Serge 207
; TCP_init
1 ha 208
;
3555 Serge 209
;  This function resets all TCP variables
210
;
211
;-----------------------------------------------------------------
212
macro   TCP_init {
907 mikedld 213
 
3555 Serge 214
        xor     eax, eax
215
        mov     edi, TCP_segments_tx
3626 Serge 216
        mov     ecx, (6*NET_DEVICES_MAX)
3725 Serge 217
        rep stosd
1 ha 218
 
3555 Serge 219
        pseudo_random   eax
220
        mov     [TCP_sequence_num], eax
1 ha 221
 
3555 Serge 222
        init_queue TCP_queue
1 ha 223
 
3626 Serge 224
        movi    ebx, 1
3555 Serge 225
        mov     ecx, TCP_process_input
226
        call    new_sys_threads
3725 Serge 227
        test    eax, eax
228
        jns     @f
5201 serge 229
        DEBUGF  DEBUG_NETWORK_ERROR,'K : cannot create kernel thread for TCP input, error %d\n', eax
3725 Serge 230
  @@:
1 ha 231
 
5201 serge 232
        movi    ebx, 1
233
        mov     ecx, TCP_timer_640ms
234
        call    new_sys_threads
235
        test    eax, eax
236
        jns     @f
237
        DEBUGF  DEBUG_NETWORK_ERROR,'K : cannot create kernel thread for TCP timer, error %d\n', eax
238
  @@:
239
 
3555 Serge 240
}
1 ha 241
 
242
 
3555 Serge 243
include 'tcp_timer.inc'
244
include 'tcp_subr.inc'
245
include 'tcp_usreq.inc'
246
include 'tcp_input.inc'
247
include 'tcp_output.inc'
1 ha 248
 
249
 
3555 Serge 250
;---------------------------------------------------------------------------
1 ha 251
;
3555 Serge 252
; TCP_API
1 ha 253
;
3555 Serge 254
; This function is called by system function 76
1 ha 255
;
3555 Serge 256
; IN:  subfunction number in bl
257
;      device number in bh
258
;      ecx, edx, .. depends on subfunction
1 ha 259
;
3555 Serge 260
; OUT:
1 ha 261
;
3555 Serge 262
;---------------------------------------------------------------------------
263
align 4
264
TCP_api:
1 ha 265
 
3555 Serge 266
        movzx   eax, bh
267
        shl     eax, 2
1 ha 268
 
3555 Serge 269
        test    bl, bl
270
        jz      .packets_tx     ; 0
271
        dec     bl
272
        jz      .packets_rx     ; 1
273
        dec     bl
274
        jz      .packets_missed ; 2
275
        dec     bl
276
        jz      .packets_dumped ; 3
5201 serge 277
        dec     bl
278
        jz      .packets_queued ; 4
1 ha 279
 
3555 Serge 280
  .error:
281
        mov     eax, -1
2434 Serge 282
        ret
1 ha 283
 
3555 Serge 284
  .packets_tx:
285
        mov     eax, [TCP_segments_tx + eax]
2434 Serge 286
        ret
1181 clevermous 287
 
3555 Serge 288
  .packets_rx:
289
        mov     eax, [TCP_segments_rx + eax]
2434 Serge 290
        ret
1 ha 291
 
3555 Serge 292
  .packets_missed:
293
        mov     eax, [TCP_segments_missed + eax]
2434 Serge 294
        ret
1 ha 295
 
3555 Serge 296
  .packets_dumped:
297
        mov     eax, [TCP_segments_dumped + eax]
2434 Serge 298
        ret
5201 serge 299
 
300
  .packets_queued:
301
        mov     eax, [TCP_queue + queue.size]
302
        ret