1.. _network_configuration_guide:
2
3Network Configuration Guide
4###########################
5
6.. contents::
7    :local:
8    :depth: 2
9
10This document describes how various network configuration options can be
11set according to available resources in the system.
12
13Network Buffer Configuration Options
14************************************
15
16The network buffer configuration options control how much data we
17are able to either send or receive at the same time.
18
19:kconfig:option:`CONFIG_NET_PKT_RX_COUNT`
20  Maximum amount of network packets we can receive at the same time.
21
22:kconfig:option:`CONFIG_NET_PKT_TX_COUNT`
23  Maximum amount of network packet sends pending at the same time.
24
25:kconfig:option:`CONFIG_NET_BUF_RX_COUNT`
26  How many network buffers are allocated for receiving data.
27  Each net_buf contains a small header and either a fixed or variable
28  length data buffer. The :kconfig:option:`CONFIG_NET_BUF_DATA_SIZE`
29  is used when :kconfig:option:`CONFIG_NET_BUF_FIXED_DATA_SIZE` is set.
30  This is the default setting. The default size of the buffer is 128 bytes.
31
32  The :kconfig:option:`CONFIG_NET_BUF_VARIABLE_DATA_SIZE` is an experimental
33  setting. There each net_buf data portion is allocated from a memory pool and
34  can be the amount of data we have received from the network.
35  When data is received from the network, it is placed into net_buf data portion.
36  Depending on device resources and desired network usage, user can tweak
37  the size of the fixed buffer by setting :kconfig:option:`CONFIG_NET_BUF_DATA_SIZE`, and
38  the size of the data pool size by setting :kconfig:option:`CONFIG_NET_PKT_BUF_RX_DATA_POOL_SIZE`
39  and :kconfig:option:`CONFIG_NET_PKT_BUF_TX_DATA_POOL_SIZE` if variable size buffers are used.
40
41  When using the fixed size data buffers, the memory consumption of network buffers
42  can be tweaked by selecting the size of the data part according to what kind of network
43  data we are receiving. If one sets the data size to 256, but only receives packets
44  that are 32 bytes long, then we are "wasting" 224 bytes for each packet because we
45  cannot utilize the remaining data. One should not set the data size too low because
46  there is some overhead involved for each net_buf. For these reasons the default
47  network buffer size is set to 128 bytes.
48
49  The variable size data buffer feature is marked as experimental as it has not
50  received as much testing as the fixed size buffers. Using variable size data
51  buffers tries to improve memory utilization by allocating minimum amount of
52  data we need for the network data. The extra cost here is the amount of time
53  that is needed when dynamically allocating the buffer from the memory pool.
54
55  For example, in Ethernet the maximum transmission unit (MTU) size is 1500 bytes.
56  If one wants to receive two full frames, then the net_pkt RX count should be set to 2,
57  and net_buf RX count to (1500 / 128) * 2 which is 24.
58  If TCP is being used, then these values need to be higher because we can queue the
59  packets internally before delivering to the application.
60
61:kconfig:option:`CONFIG_NET_BUF_TX_COUNT`
62  How many network buffers are allocated for sending data. This is similar setting
63  as the receive buffer count but for sending.
64
65
66Connection Options
67******************
68
69:kconfig:option:`CONFIG_NET_MAX_CONN`
70  This option tells how many network connection endpoints are supported.
71  For example each TCP connection requires one connection endpoint. Similarly
72  each listening UDP connection requires one connection endpoint.
73  Also various system services like DHCP and DNS need connection endpoints to work.
74  The network shell command **net conn** can be used at runtime to see the
75  network connection information.
76
77:kconfig:option:`CONFIG_NET_MAX_CONTEXTS`
78  Number of network contexts to allocate. Each network context describes a network
79  5-tuple that is used when listening or sending network traffic. Each BSD socket in the
80  system uses one network context.
81
82
83Socket Options
84**************
85
86:kconfig:option:`CONFIG_ZVFS_POLL_MAX`
87  Maximum number of supported poll() entries. One needs to select proper value here depending
88  on how many BSD sockets are polled in the system.
89
90:kconfig:option:`CONFIG_ZVFS_OPEN_MAX`
91  Maximum number of open file descriptors, this includes files, sockets, special devices, etc.
92  One needs to select proper value here depending on how many BSD sockets are created in
93  the system.
94
95:kconfig:option:`CONFIG_NET_SOCKETPAIR_BUFFER_SIZE`
96  This option is used by socketpair() function. It sets the size of the
97  internal intermediate buffer, in bytes. This sets the limit how large
98  messages can be passed between two socketpair endpoints.
99
100
101TLS Options
102***********
103
104:kconfig:option:`CONFIG_NET_SOCKETS_TLS_MAX_CONTEXTS`
105  Maximum number of TLS/DTLS contexts. Each TLS/DTLS connection needs one context.
106
107:kconfig:option:`CONFIG_NET_SOCKETS_TLS_MAX_CREDENTIALS`
108  This variable sets maximum number of TLS/DTLS credentials that can be
109  used with a specific socket.
110
111:kconfig:option:`CONFIG_NET_SOCKETS_TLS_MAX_CIPHERSUITES`
112  Maximum number of TLS/DTLS ciphersuites per socket.
113  This variable sets maximum number of TLS/DTLS ciphersuites that can
114  be used with specific socket, if set explicitly by socket option.
115  By default, all ciphersuites that are available in the system are
116  available to the socket.
117
118:kconfig:option:`CONFIG_NET_SOCKETS_TLS_MAX_APP_PROTOCOLS`
119  Maximum number of supported application layer protocols.
120  This variable sets maximum number of supported application layer
121  protocols over TLS/DTLS that can be set explicitly by a socket option.
122  By default, no supported application layer protocol is set.
123
124:kconfig:option:`CONFIG_NET_SOCKETS_TLS_MAX_CLIENT_SESSION_COUNT`
125  This variable specifies maximum number of stored TLS/DTLS sessions,
126  used for TLS/DTLS session resumption.
127
128:kconfig:option:`CONFIG_TLS_MAX_CREDENTIALS_NUMBER`
129   Maximum number of TLS credentials that can be registered.
130   Make sure that this value is high enough so that all the
131   certificates can be loaded to the store.
132
133
134IPv4/6 Options
135**************
136
137:kconfig:option:`CONFIG_NET_IF_MAX_IPV4_COUNT`
138   Maximum number of IPv4 network interfaces in the system.
139   This tells how many network interfaces there will be in the system
140   that will have IPv4 enabled.
141   For example if you have two network interfaces, but only one of them
142   can use IPv4 addresses, then this value can be set to 1.
143   If both network interface could use IPv4, then the setting should be
144   set to 2.
145
146:kconfig:option:`CONFIG_NET_IF_MAX_IPV6_COUNT`
147   Maximum number of IPv6 network interfaces in the system.
148   This is similar setting as the IPv4 count option but for IPv6.
149
150
151TCP Options
152***********
153
154:kconfig:option:`CONFIG_NET_TCP_TIME_WAIT_DELAY`
155  How long to wait in TCP *TIME_WAIT* state (in milliseconds).
156  To avoid a (low-probability) issue when delayed packets from
157  previous connection get delivered to next connection reusing
158  the same local/remote ports,
159  `RFC 793 <https://www.rfc-editor.org/rfc/rfc793>`_ (TCP) suggests
160  to keep an old, closed connection in a special *TIME_WAIT* state for
161  the duration of 2*MSL (Maximum Segment Lifetime). The RFC
162  suggests to use MSL of 2 minutes, but notes
163
164  *This is an engineering choice, and may be changed if experience indicates
165  it is desirable to do so.*
166
167  For low-resource systems, having large MSL may lead to quick
168  resource exhaustion (and related DoS attacks). At the same time,
169  the issue of packet misdelivery is largely alleviated in the modern
170  TCP stacks by using random, non-repeating port numbers and initial
171  sequence numbers. Due to this, Zephyr uses much lower value of 1500ms
172  by default. Value of 0 disables *TIME_WAIT* state completely.
173
174:kconfig:option:`CONFIG_NET_TCP_RETRY_COUNT`
175  Maximum number of TCP segment retransmissions.
176  The following formula can be used to determine the time (in ms)
177  that a segment will be buffered awaiting retransmission:
178
179  .. math::
180
181     \sum_{n=0}^{\mathtt{NET\_TCP\_RETRY\_COUNT}} \bigg(1 \ll n\bigg)\times
182     \mathtt{NET\_TCP\_INIT\_RETRANSMISSION\_TIMEOUT}
183
184  With the default value of 9, the IP stack will try to
185  retransmit for up to 1:42 minutes.  This is as close as possible
186  to the minimum value recommended by
187  `RFC 1122 <https://www.rfc-editor.org/rfc/rfc1122>`_ (1:40 minutes).
188  Only 5 bits are dedicated for the retransmission count, so accepted
189  values are in the 0-31 range.  It's highly recommended to not go
190  below 9, though.
191
192  Should a retransmission timeout occur, the receive callback is
193  called with :code:`-ETIMEDOUT` error code and the context is dereferenced.
194
195:kconfig:option:`CONFIG_NET_TCP_MAX_SEND_WINDOW_SIZE`
196  Maximum sending window size to use.
197  This value affects how the TCP selects the maximum sending window
198  size. The default value 0 lets the TCP stack select the value
199  according to amount of network buffers configured in the system.
200  Note that if there are multiple active TCP connections in the system,
201  then this value might require finetuning (lowering), otherwise multiple
202  TCP connections could easily exhaust net_buf pool for the queued TX data.
203
204:kconfig:option:`CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE`
205  Maximum receive window size to use.
206  This value defines the maximum TCP receive window size. Increasing
207  this value can improve connection throughput, but requires more
208  receive buffers available in the system for efficient operation.
209  The default value 0 lets the TCP stack select the value
210  according to amount of network buffers configured in the system.
211
212:kconfig:option:`CONFIG_NET_TCP_RECV_QUEUE_TIMEOUT`
213  How long to queue received data (in ms).
214  If we receive out-of-order TCP data, we queue it. This value tells
215  how long the data is kept before it is discarded if we have not been
216  able to pass the data to the application. If set to 0, then receive
217  queueing is not enabled. The value is in milliseconds.
218
219  Note that we only queue data sequentially in current version i.e.,
220  there should be no holes in the queue. For example, if we receive
221  SEQs 5,4,3,6 and are waiting SEQ 2, the data in segments 3,4,5,6 is
222  queued (in this order), and then given to application when we receive
223  SEQ 2. But if we receive SEQs 5,4,3,7 then the SEQ 7 is discarded
224  because the list would not be sequential as number 6 is be missing.
225
226
227Traffic Class Options
228*********************
229
230It is possible to configure multiple traffic classes (queues) when receiving
231or sending network data. Each traffic class queue is implemented as a thread
232with different priority. This means that higher priority network packet can
233be placed to a higher priority network queue in order to send or receive it
234faster or slower. Because of thread scheduling latencies, in practice the
235fastest way to send a packet out, is to directly send the packet without
236using a dedicated traffic class thread. This is why by default the
237:kconfig:option:`CONFIG_NET_TC_TX_COUNT` option is set to 0 if userspace is
238not enabled. If userspace is enabled, then the minimum TX traffic class
239count is 1. Reason for this is that the userspace application does not
240have enough permissions to deliver the message directly.
241
242In receiving side, it is recommended to have at least one receiving traffic
243class queue. Reason is that typically the network device driver is running
244in IRQ context when it receives the packet, in which case it should not try
245to deliver the network packet directly to the upper layers, but to place
246the packet to the traffic class queue. If the network device driver is not
247running in IRQ context when it gets the packet, then the RX traffic class
248option :kconfig:option:`CONFIG_NET_TC_RX_COUNT` could be set to 0.
249
250
251Stack Size Options
252******************
253
254There several network specific threads in a network enabled system.
255Some of the threads might depend on a configure option which can be
256used to enable or disable a feature. Each thread stack size is optimized
257to allow normal network operations.
258
259The network management API is using a dedicated thread by default. The thread
260is responsible to deliver network management events to the event listeners that
261are setup in the system if the :kconfig:option:`CONFIG_NET_MGMT` and
262:kconfig:option:`CONFIG_NET_MGMT_EVENT` options are enabled.
263If the options are enabled, the user is able to register a callback function
264that the net_mgmt thread is calling for each network management event.
265By default the net_mgmt event thread stack size is rather small.
266The idea is that the callback function does minimal things so that new
267events can be delivered to listeners as fast as possible and they are not lost.
268The net_mgmt event thread stack size is controlled by
269:kconfig:option:`CONFIG_NET_MGMT_EVENT_QUEUE_SIZE` option. It is recommended
270to not do any blocking operations in the callback function.
271
272The network thread stack utilization can be monitored from kernel shell by
273the **kernel threads** command.
274