1
10
13
14
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
121
122
123
124
125
126
127
128
129
130
132
133
134
135
136
137
138
140
145
146
147
148
149
150
151
152
153
154
155
156
157
163
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
198
199
200
208
209
210
216
217
218
219
220
221
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
244
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
272
273
274
275
276
277
...
...
...
#define NX_SOURCE_CODE
#include "nx_api.h"
#include "nx_tcp.h"
...
...
VOID _nx_tcp_socket_state_syn_sent(NX_TCP_SOCKET *socket_ptr, NX_TCP_HEADER *tcp_header_ptr, NX_PACKET *packet_ptr)
{
#ifndef TX_ENABLE_EVENT_TRACE
NX_PARAMETER_NOT_USED(packet_ptr);
#endif
if (tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_RST_BIT)
{
if ((tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_ACK_BIT) &&
(tcp_header_ptr -> nx_tcp_acknowledgment_number == socket_ptr -> nx_tcp_socket_tx_sequence))
{
#ifndef NX_DISABLE_TCP_INFO
(socket_ptr -> nx_tcp_socket_ip_ptr) -> nx_ip_tcp_resets_received++;/* ... */
#endif
NX_TRACE_IN_LINE_INSERT(NX_TRACE_INTERNAL_TCP_RESET_RECEIVE, socket_ptr -> nx_tcp_socket_ip_ptr, socket_ptr, packet_ptr, tcp_header_ptr -> nx_tcp_sequence_number, NX_TRACE_INTERNAL_EVENTS, 0, 0);
_nx_tcp_socket_connection_reset(socket_ptr);
}if ((tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_ACK_BIT) && (tcp_header_ptr -> nx_tcp_acknowledgment_number == socket_ptr -> nx_tcp_socket_tx_sequence)) { ... }
return;
}if (tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_RST_BIT) { ... }
else if ((tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_SYN_BIT) &&
(tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_ACK_BIT) &&
(tcp_header_ptr -> nx_tcp_acknowledgment_number == socket_ptr -> nx_tcp_socket_tx_sequence))
{
/* ... */
socket_ptr -> nx_tcp_socket_rx_sequence = tcp_header_ptr -> nx_tcp_sequence_number + 1;
socket_ptr -> nx_tcp_socket_tx_window_advertised = tcp_header_ptr -> nx_tcp_header_word_3 & NX_LOWER_16_MASK;
#ifdef NX_ENABLE_TCP_WINDOW_SCALING
/* ... */
if (socket_ptr -> nx_tcp_snd_win_scale_value == 0xFF)
{
socket_ptr -> nx_tcp_snd_win_scale_value = 0;
socket_ptr -> nx_tcp_rcv_win_scale_value = 0;
/* ... */
if (socket_ptr -> nx_tcp_socket_rx_window_maximum > 65535)
{
socket_ptr -> nx_tcp_socket_rx_window_default = 65535;
socket_ptr -> nx_tcp_socket_rx_window_current = 65535;
}if (socket_ptr -> nx_tcp_socket_rx_window_maximum > 65535) { ... }
}if (socket_ptr -> nx_tcp_snd_win_scale_value == 0xFF) { ... }
/* ... */
#endif
socket_ptr -> nx_tcp_socket_tx_slow_start_threshold = socket_ptr -> nx_tcp_socket_tx_window_advertised;
socket_ptr -> nx_tcp_socket_tx_outstanding_bytes = 0;
if (socket_ptr -> nx_tcp_socket_timeout_retries > 0)
{
socket_ptr -> nx_tcp_socket_tx_window_congestion = socket_ptr -> nx_tcp_socket_connect_mss;
}if (socket_ptr -> nx_tcp_socket_timeout_retries > 0) { ... }
else
{
socket_ptr -> nx_tcp_socket_tx_window_congestion = (socket_ptr -> nx_tcp_socket_connect_mss << 2);
if (socket_ptr -> nx_tcp_socket_connect_mss > 1095)
{
socket_ptr -> nx_tcp_socket_tx_window_congestion -= socket_ptr -> nx_tcp_socket_connect_mss;
}if (socket_ptr -> nx_tcp_socket_connect_mss > 1095) { ... }
if (socket_ptr -> nx_tcp_socket_connect_mss > 2190)
{
socket_ptr -> nx_tcp_socket_tx_window_congestion -= socket_ptr -> nx_tcp_socket_connect_mss;
}if (socket_ptr -> nx_tcp_socket_connect_mss > 2190) { ... }
}else { ... }
_nx_tcp_packet_send_ack(socket_ptr, socket_ptr -> nx_tcp_socket_tx_sequence);
NX_TRACE_IN_LINE_INSERT(NX_TRACE_INTERNAL_TCP_STATE_CHANGE, socket_ptr -> nx_tcp_socket_ip_ptr, socket_ptr, socket_ptr -> nx_tcp_socket_state, NX_TCP_ESTABLISHED, NX_TRACE_INTERNAL_EVENTS, 0, 0);
socket_ptr -> nx_tcp_socket_state = NX_TCP_ESTABLISHED;
socket_ptr -> nx_tcp_socket_timeout = 0;
#ifndef NX_DISABLE_EXTENDED_NOTIFY_SUPPORT
if (socket_ptr -> nx_tcp_establish_notify)
{
(socket_ptr -> nx_tcp_establish_notify)(socket_ptr);
}if (socket_ptr -> nx_tcp_establish_notify) { ... }
/* ... */#endif
#ifdef NX_ENABLE_TCP_KEEPALIVE
if (socket_ptr -> nx_tcp_socket_keepalive_enabled)
{
socket_ptr -> nx_tcp_socket_keepalive_timeout = NX_TCP_KEEPALIVE_INITIAL;
socket_ptr -> nx_tcp_socket_keepalive_retries = 0;
}if (socket_ptr -> nx_tcp_socket_keepalive_enabled) { ... }
/* ... */#endif
if (socket_ptr -> nx_tcp_socket_connect_suspended_thread)
{
_nx_tcp_socket_thread_resume(&(socket_ptr -> nx_tcp_socket_connect_suspended_thread), NX_SUCCESS);
}if (socket_ptr -> nx_tcp_socket_connect_suspended_thread) { ... }
}else if ((tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_SYN_BIT) && (tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_ACK_BIT) && (tcp_header_ptr -> nx_tcp_acknowledgment_number == socket_ptr -> nx_tcp_socket_tx_sequence)) { ... }
else if ((tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_SYN_BIT) &&
(!(tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_ACK_BIT)))
{
/* ... */
socket_ptr -> nx_tcp_socket_rx_sequence = tcp_header_ptr -> nx_tcp_sequence_number + 1;
socket_ptr -> nx_tcp_socket_tx_window_advertised = tcp_header_ptr -> nx_tcp_header_word_3 & NX_LOWER_16_MASK;
#ifdef NX_ENABLE_TCP_WINDOW_SCALING
socket_ptr -> nx_tcp_socket_tx_window_advertised <<= socket_ptr -> nx_tcp_rcv_win_scale_value;
#endif
socket_ptr -> nx_tcp_socket_tx_slow_start_threshold = socket_ptr -> nx_tcp_socket_tx_window_advertised;
socket_ptr -> nx_tcp_socket_tx_window_congestion = (socket_ptr -> nx_tcp_socket_connect_mss << 2);
if (socket_ptr -> nx_tcp_socket_connect_mss > 1095)
{
socket_ptr -> nx_tcp_socket_tx_window_congestion -= socket_ptr -> nx_tcp_socket_connect_mss;
}if (socket_ptr -> nx_tcp_socket_connect_mss > 1095) { ... }
if (socket_ptr -> nx_tcp_socket_connect_mss > 2190)
{
socket_ptr -> nx_tcp_socket_tx_window_congestion -= socket_ptr -> nx_tcp_socket_connect_mss;
}if (socket_ptr -> nx_tcp_socket_connect_mss > 2190) { ... }
socket_ptr -> nx_tcp_socket_tx_outstanding_bytes = 0;
NX_TRACE_IN_LINE_INSERT(NX_TRACE_INTERNAL_TCP_STATE_CHANGE, socket_ptr -> nx_tcp_socket_ip_ptr, socket_ptr, socket_ptr -> nx_tcp_socket_state, NX_TCP_SYN_RECEIVED, NX_TRACE_INTERNAL_EVENTS, 0, 0);
socket_ptr -> nx_tcp_socket_state = NX_TCP_SYN_RECEIVED;
socket_ptr -> nx_tcp_socket_timeout = 0;
_nx_tcp_packet_send_syn(socket_ptr, (socket_ptr -> nx_tcp_socket_tx_sequence - 1));
}else if ((tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_SYN_BIT) && (!(tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_ACK_BIT))) { ... }
else if ((tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_ACK_BIT) &&
(tcp_header_ptr -> nx_tcp_acknowledgment_number != socket_ptr -> nx_tcp_socket_tx_sequence))
{
/* ... */
_nx_tcp_packet_send_rst(socket_ptr, tcp_header_ptr);
}else if ((tcp_header_ptr -> nx_tcp_header_word_3 & NX_TCP_ACK_BIT) && (tcp_header_ptr -> nx_tcp_acknowledgment_number != socket_ptr -> nx_tcp_socket_tx_sequence)) { ... }
}{ ... }