Select one of the symbols to view example projects that use it.
 
Outline
...
...
...
...
#define NX_SOURCE_CODE
#include "nx_api.h"
#include "nx_ip.h"
#include "nx_packet.h"
#include "nx_tcp.h"
...
...
_nx_tcp_periodic_processing(NX_IP *)
Files
loading...
CodeScopeSTM32 Libraries and Samplesnetxduocommon/src/nx_tcp_periodic_processing.c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**************************************************************************/ /* */ /* Copyright (c) Microsoft Corporation. All rights reserved. */ /* */ /* This software is licensed under the Microsoft Software License */ /* Terms for Microsoft Azure RTOS. Full text of the license can be */ /* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ /* and in the root directory of this software. */ /* */... /**************************************************************************/ ... /**************************************************************************/ /**************************************************************************/ /** */ /** NetX Component */ /** */ /** Transmission Control Protocol (TCP) */ /** */... /**************************************************************************/ /**************************************************************************/ #define NX_SOURCE_CODE /* Include necessary system files. */ #include "nx_api.h" #include "nx_ip.h" #include "nx_packet.h" #include "nx_tcp.h" ... /**************************************************************************/ /* */ /* FUNCTION RELEASE */ /* */ /* _nx_tcp_periodic_processing PORTABLE C */ /* 6.1 */ /* AUTHOR */ /* */ /* Yuxin Zhou, Microsoft Corporation */ /* */ /* DESCRIPTION */ /* */ /* This function processes periodic TCP processing for detecting */ /* TCP transmit timeouts. If a transmit timeout occurs, the packet */ /* is simply resent and a new timeout is setup. */ /* */ /* Note this requires that NX_ENABLE_TCP_KEEPALIVE is enabled when the */ /* NetX library is built. */ /* */ /* INPUT */ /* */ /* ip_ptr Pointer to IP control block */ /* */ /* OUTPUT */ /* */ /* None */ /* */ /* CALLS */ /* */ /* _nx_tcp_packet_send_ack Send ACK probe message */ /* _nx_tcp_socket_connection_reset Reset the connection */ /* */ /* CALLED BY */ /* */ /* _nx_ip_thread_entry IP helper thread */ /* */ /* RELEASE HISTORY */ /* */ /* DATE NAME DESCRIPTION */ /* */ /* 05-19-2020 Yuxin Zhou Initial Version 6.0 */ /* 09-30-2020 Yuxin Zhou Modified comment(s), */ /* resulting in version 6.1 */ /* */... /**************************************************************************/ VOID _nx_tcp_periodic_processing(NX_IP *ip_ptr) { #ifdef NX_ENABLE_TCP_KEEPALIVE NX_TCP_SOCKET *socket_ptr; ULONG sockets; UINT keepalive_enabled = NX_FALSE; /* Pickup the number of created TCP sockets. */ sockets = ip_ptr -> nx_ip_tcp_created_sockets_count; /* Pickup the first socket. */ socket_ptr = ip_ptr -> nx_ip_tcp_created_sockets_ptr; /* Get the keepalive status of the current socket. */ if (socket_ptr) { keepalive_enabled = socket_ptr -> nx_tcp_socket_keepalive_enabled; }if (socket_ptr) { ... } /* Loop through the created sockets. */ while ((sockets--) && socket_ptr) { /* Is keep alive enabled on this socket? */ if (keepalive_enabled) { /* Yes; Check for the socket having a TCP Keepalive timer active. */ if ((socket_ptr -> nx_tcp_socket_state == NX_TCP_ESTABLISHED) && (socket_ptr -> nx_tcp_socket_keepalive_timeout)) { /* Decrement the socket's keepalive timeout timer. */ socket_ptr -> nx_tcp_socket_keepalive_timeout--; /* Determine if the keepalive timeout has expired. */ if (!socket_ptr -> nx_tcp_socket_keepalive_timeout) { /* Yes, the timeout has expired. Increment the retries and determine if there are any retries left. *//* ... */ socket_ptr -> nx_tcp_socket_keepalive_retries++; if (socket_ptr -> nx_tcp_socket_keepalive_retries <= NX_TCP_KEEPALIVE_RETRIES) { /* Yes, there are more retries left. Set the next timeout expiration to the retry time instead of the initial time. *//* ... */ socket_ptr -> nx_tcp_socket_keepalive_timeout = NX_TCP_KEEPALIVE_RETRY; /* Send Keepalive ACK probe to see if the other side of the connection is still there. We need to decrement the ACK number first for the probe message and then restore the value immediately after the ACK is sent. *//* ... */ _nx_tcp_packet_send_ack(socket_ptr, (socket_ptr -> nx_tcp_socket_tx_sequence - 1)); }if (socket_ptr -> nx_tcp_socket_keepalive_retries <= NX_TCP_KEEPALIVE_RETRIES) { ... } else { /* The Keepalive timer retries have failed, enter a CLOSED state via the reset processing. *//* ... */ _nx_tcp_socket_connection_reset(socket_ptr); }else { ... } }if (!socket_ptr -> nx_tcp_socket_keepalive_timeout) { ... } }if ((socket_ptr -> nx_tcp_socket_state == NX_TCP_ESTABLISHED) && (socket_ptr -> nx_tcp_socket_keepalive_timeout)) { ... } }if (keepalive_enabled) { ... } /* Move to the next TCP socket. */ socket_ptr = socket_ptr -> nx_tcp_socket_created_next; /* Get the socket's keep alive status. */ keepalive_enabled = socket_ptr -> nx_tcp_socket_keepalive_enabled; }while ((sockets--) && socket_ptr) { ... } /* ... */#else NX_PARAMETER_NOT_USED(ip_ptr); #endif }{ ... }