Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1196 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
3251 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved.    ;;
1196 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
3143 hidnplayr 6
;;  Part of the TCP/IP network stack for KolibriOS                 ;;
1196 hidnplayr 7
;;                                                                 ;;
1514 hidnplayr 8
;;   Written by hidnplayr@kolibrios.org                            ;;
1196 hidnplayr 9
;;                                                                 ;;
1514 hidnplayr 10
;;    Based on the code of 4.4BSD                                  ;;
11
;;                                                                 ;;
1196 hidnplayr 12
;;          GNU GENERAL PUBLIC LICENSE                             ;;
13
;;             Version 2, June 1991                                ;;
14
;;                                                                 ;;
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1159 hidnplayr 16
 
1206 hidnplayr 17
$Revision: 3406 $
1159 hidnplayr 18
 
1514 hidnplayr 19
; Socket states
2614 hidnplayr 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
1196 hidnplayr 31
 
1514 hidnplayr 32
; Socket Flags
2614 hidnplayr 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
1249 hidnplayr 43
 
1514 hidnplayr 44
; Segment flags
2614 hidnplayr 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
1318 hidnplayr 51
 
1514 hidnplayr 52
; Segment header options
2614 hidnplayr 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
2953 hidnplayr 57
TCP_OPT_SACK_PERMIT     = 4           ; Selective Acknowledgement
58
TCP_OPT_SACK            = 5
2614 hidnplayr 59
TCP_OPT_TIMESTAMP       = 8
1514 hidnplayr 60
 
1519 hidnplayr 61
; Fundamental timer values
2614 hidnplayr 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)
3143 hidnplayr 67
TCP_time_keep_init      = 118         ; connection establishment (75,52s)
2614 hidnplayr 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           ;
2937 hidnplayr 72
TCP_time_max_idle       = 8*TCP_time_keep_interval      ; FIXME
1519 hidnplayr 73
 
74
; timer constants
2614 hidnplayr 75
TCP_max_rxtshift        = 12          ; max retransmissions waiting for ACK
76
TCP_max_keepcnt         = 8           ; max keepalive probes
1519 hidnplayr 77
 
1529 hidnplayr 78
;
2614 hidnplayr 79
TCP_max_winshift        = 14
80
TCP_max_win             = 65535
1519 hidnplayr 81
 
2614 hidnplayr 82
TCP_re_xmit_thresh      = 3
1763 hidnplayr 83
 
2614 hidnplayr 84
TCP_mss_default         = 1480        ; default max segment size
2305 hidnplayr 85
 
2937 hidnplayr 86
; smoothed round trip time and estimated variance are stored as fixed point numbers,
87
; shifted by the value below.
88
; With these scales, srtt has 3 bits to the right of the binary point, and thus an "alpha"
89
; of .875. rttvar has 2 bits to the right and thus "alpha" of 0.75
90
TCP_RTT_SHIFT           = 3
91
TCP_RTTVAR_SHIFT        = 2
92
 
93
; bits used by tcp_input and tcp_output
94
TCP_BIT_NEEDOUTPUT      = 1 shl 0
95
TCP_BIT_TIMESTAMP       = 1 shl 1
96
TCP_BIT_DROPSOCKET      = 1 shl 2
97
 
98
TCP_BIT_SENDALOT        = 1 shl 0
99
 
2947 hidnplayr 100
TCP_PAWS_IDLE           = 24*24*60*60*100       ; 24 days, in 1/100 seconds
101
 
3251 hidnplayr 102
TCP_QUEUE_SIZE          = 50
103
 
2612 hidnplayr 104
struct  TCP_header
2305 hidnplayr 105
 
2612 hidnplayr 106
        SourcePort              dw ?
107
        DestinationPort         dw ?
108
        SequenceNumber          dd ?
109
        AckNumber               dd ?
110
        DataOffset              db ?    ; DataOffset[0-3 bits] and Reserved[4-7]
111
        Flags                   db ?    ; Reserved[0-1 bits]|URG|ACK|PSH|RST|SYN|FIN
112
        Window                  dw ?
113
        Checksum                dw ?
114
        UrgentPointer           dw ?
115
 
1159 hidnplayr 116
ends
117
 
3251 hidnplayr 118
struct  TCP_queue_entry
119
 
120
        ip_ptr          dd ?
121
        segment_ptr     dd ?
122
        segment_size    dd ?
123
        device_ptr      dd ?
124
 
125
        buffer_ptr      dd ?
3406 hidnplayr 126
        timestamp       dd ?
3251 hidnplayr 127
 
128
ends
129
 
1196 hidnplayr 130
align 4
131
uglobal
2924 hidnplayr 132
        TCP_segments_tx         rd MAX_NET_DEVICES
133
        TCP_segments_rx         rd MAX_NET_DEVICES
3275 hidnplayr 134
        TCP_segments_missed     rd MAX_NET_DEVICES
135
        TCP_segments_dumped     rd MAX_NET_DEVICES
136
;        TCP_bytes_rx            rq MAX_NET_DEVICES
137
;        TCP_bytes_tx            rq MAX_NET_DEVICES
2612 hidnplayr 138
        TCP_sequence_num        dd ?
3251 hidnplayr 139
        TCP_queue               rd TCP_QUEUE_SIZE*sizeof.TCP_queue_entry/4
3389 hidnplayr 140
        TCP_input_event         dd ?
1196 hidnplayr 141
endg
142
 
143
 
144
;-----------------------------------------------------------------
145
;
146
; TCP_init
147
;
148
;  This function resets all TCP variables
149
;
150
;-----------------------------------------------------------------
2612 hidnplayr 151
macro   TCP_init {
1196 hidnplayr 152
 
2612 hidnplayr 153
        xor     eax, eax
2614 hidnplayr 154
        mov     edi, TCP_segments_tx
2924 hidnplayr 155
        mov     ecx, (6*MAX_NET_DEVICES)
2612 hidnplayr 156
        rep     stosd
1196 hidnplayr 157
 
2612 hidnplayr 158
        pseudo_random   eax
159
        mov     [TCP_sequence_num], eax
1196 hidnplayr 160
 
3251 hidnplayr 161
        init_queue TCP_queue
162
 
3389 hidnplayr 163
        push    1
164
        pop     ebx
165
        mov     ecx, TCP_process_input
166
        call    new_sys_threads
167
 
1529 hidnplayr 168
}
1196 hidnplayr 169
 
170
 
1733 hidnplayr 171
include 'tcp_timer.inc'
172
include 'tcp_subr.inc'
3146 hidnplayr 173
include 'tcp_usreq.inc'
1733 hidnplayr 174
include 'tcp_input.inc'
175
include 'tcp_output.inc'
1159 hidnplayr 176
 
1529 hidnplayr 177
 
1254 hidnplayr 178
;---------------------------------------------------------------------------
179
;
180
; TCP_API
181
;
2866 hidnplayr 182
; This function is called by system function 76
1254 hidnplayr 183
;
184
; IN:  subfunction number in bl
185
;      device number in bh
186
;      ecx, edx, .. depends on subfunction
187
;
188
; OUT:
189
;
190
;---------------------------------------------------------------------------
191
align 4
2614 hidnplayr 192
TCP_api:
1254 hidnplayr 193
 
2612 hidnplayr 194
        movzx   eax, bh
195
        shl     eax, 2
1254 hidnplayr 196
 
2612 hidnplayr 197
        test    bl, bl
198
        jz      .packets_tx     ; 0
199
        dec     bl
200
        jz      .packets_rx     ; 1
3275 hidnplayr 201
        dec     bl
202
        jz      .packets_missed ; 2
203
        dec     bl
204
        jz      .packets_dumped ; 3
1254 hidnplayr 205
 
2614 hidnplayr 206
  .error:
2612 hidnplayr 207
        mov     eax, -1
208
        ret
1254 hidnplayr 209
 
2614 hidnplayr 210
  .packets_tx:
211
        mov     eax, [TCP_segments_tx + eax]
2612 hidnplayr 212
        ret
1254 hidnplayr 213
 
2614 hidnplayr 214
  .packets_rx:
215
        mov     eax, [TCP_segments_rx + eax]
2612 hidnplayr 216
        ret
3275 hidnplayr 217
 
218
  .packets_missed:
219
        mov     eax, [TCP_segments_missed + eax]
220
        ret
221
 
222
  .packets_dumped:
223
        mov     eax, [TCP_segments_dumped + eax]
224
        ret