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