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