32#ifdef HAVE_CONFIG_VERSION_H
33#include "config-version.h"
76#ifdef CONFIGURE_GIT_REVISION
77 " [git:" CONFIGURE_GIT_REVISION CONFIGURE_GIT_FLAGS
"]"
80#if defined(ENABLE_CRYPTO_MBEDTLS)
82#elif defined(ENABLE_CRYPTO_OPENSSL)
94#ifdef ENABLE_COMP_STUB
101#ifdef PRODUCT_TAP_DEBUG
108#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
110#elif defined(IP_RECVDSTADDR)
124#ifdef CONFIGURE_GIT_REVISION
125 " built on " __DATE__
136 "--config file : Read configuration options from file.\n"
137 "--help : Show options.\n"
138 "--version : Show copyright and version information.\n"
141 "--local host|* [port]: Local host name or IP address and port for bind.\n"
142 " If specified, OpenVPN will bindto this address. If unspecified,\n"
143 " OpenVPN will bind to all interfaces. '*' can be used as hostname\n"
144 " and means 'any host' (OpenVPN will listen on what is returned by the OS).\n"
145 " On a client, or in point-to-point mode, this can only be specified once (1 socket).\n"
146 " On an OpenVPN setup running as ``--server``, this can be specified multiple times\n"
147 " to open multiple listening sockets on different addresses and/or different ports.\n"
148 " In order to specify multiple listen ports without specifying an address, use '*'\n"
149 " to signal 'use what the operating system gives you as default', for\n"
150 " 'all IPv4 addresses' use '0.0.0.0', for 'all IPv6 addresses' use '::'.\n"
151 " ``--local`` implies ``--bind``.\n"
152 "--remote host [port] : Remote host name or ip address.\n"
153 "--remote-random : If multiple --remote options specified, choose one randomly.\n"
154 "--remote-random-hostname : Add a random string to remote DNS name.\n"
155 "--mode m : Major mode, m = 'p2p' (default, point-to-point) or 'server'.\n"
156 "--proto p : Use protocol p for communicating with peer.\n"
157 " p = udp (default), tcp-server, tcp-client\n"
158 " udp4, tcp4-server, tcp4-client\n"
159 " udp6, tcp6-server, tcp6-client\n"
160 "--proto-force p : only consider protocol p in list of connection profiles.\n"
162 "--connect-retry n [m] : For client, number of seconds to wait between\n"
163 " connection retries (default=%d). On repeated retries\n"
164 " the wait time is exponentially increased to a maximum of m\n"
166 "--connect-retry-max n : Maximum connection attempt retries, default infinite.\n"
167 "--http-proxy s p [up] [auth] : Connect to remote host\n"
168 " through an HTTP proxy at address s and port p.\n"
169 " If proxy authentication is required,\n"
170 " up is a file containing username/password on 2 lines, or\n"
171 " 'stdin' to prompt from console.\n"
172 "--http-proxy s p 'auto[-nct]' : Like the above directive, but automatically\n"
173 " determine auth method and query for username/password\n"
174 " if needed. auto-nct disables weak proxy auth methods.\n"
175 "--http-proxy-option type [parm] : Set extended HTTP proxy options.\n"
176 " Repeat to set multiple options.\n"
177 " VERSION version (default=1.0)\n"
178 " AGENT user-agent\n"
179 "--socks-proxy s [p] [up] : Connect to remote host through a Socks5 proxy at\n"
180 " address s and port p (default port = 1080).\n"
181 " If proxy authentication is required,\n"
182 " up is a file containing username/password on 2 lines, or\n"
183 " 'stdin' to prompt for console.\n"
184 "--socks-proxy-retry : Retry indefinitely on Socks proxy errors.\n"
185 "--resolv-retry n: If hostname resolve fails for --remote, retry\n"
186 " resolve for n seconds before failing (disabled by default).\n"
187 " Set n=\"infinite\" to retry indefinitely.\n"
188 "--preresolve : Resolve configured --remote, --local, and proxy hostnames at startup.\n"
189 "--float : Allow remote to change its IP address/port, such as through\n"
190 " DHCP (this is the default if --remote is not used).\n"
191 "--ipchange cmd : Run command cmd on remote ip address initial\n"
192 " setting or change -- execute as: cmd ip-address port#\n"
193 "--port port : TCP/UDP port # for both local and remote.\n"
194 "--lport port : TCP/UDP port # for local (default=%s). Implies --bind.\n"
195 "--rport port : TCP/UDP port # for remote (default=%s).\n"
196 "--bind : Bind to local address and port. (This is the default unless\n"
197 " --proto tcp-client"
201 "--nobind : Do not bind to local address and port.\n"
202 "--dev tunX|tapX : tun/tap device (X can be omitted for dynamic device).\n"
203 " Defaults to \"tun\" if neither --dev nor --dev-type is given.\n"
204 "--dev-type dt : Which device type are we using? (dt = tun or tap) Use\n"
205 " this option only if the tun/tap device used with --dev\n"
206 " does not begin with \"tun\" or \"tap\".\n"
207 "--dev-node node : Explicitly set the device node rather than using\n"
208 " /dev/net/tun, /dev/tun, /dev/tap, etc.\n"
209#if defined(ENABLE_DCO)
210 "--disable-dco : Do not attempt using Data Channel Offload.\n"
212 "--lladdr hw : Set the link layer address of the tap device.\n"
213 "--topology t : Set --dev tun topology: 'net30', 'p2p', or 'subnet'.\n"
215 "--iproute cmd : Use this command instead of default " IPROUTE_PATH
".\n"
217 "--ifconfig l rn : TUN: configure device to use IP address l as a local\n"
218 " endpoint and rn as a remote endpoint. l & rn should be\n"
219 " swapped on the other peer. l & rn must be private\n"
220 " addresses outside of the subnets used by either peer.\n"
221 " TAP: configure device to use IP address l as a local\n"
222 " endpoint and rn as a subnet mask.\n"
223 "--ifconfig-ipv6 l r : configure device to use IPv6 address l as local\n"
224 " endpoint (as a /64) and r as remote endpoint\n"
225 "--ifconfig-noexec : Don't actually execute ifconfig/netsh command, instead\n"
226 " pass --ifconfig parms by environment to scripts.\n"
227 "--ifconfig-nowarn : Don't warn if the --ifconfig option on this side of the\n"
228 " connection doesn't match the remote side.\n"
230 "--route-table table_id : Specify a custom routing table for use with --route(-ipv6).\n"
231 " If not specified, the id of the default routing table will be used.\n"
233 "--route network [netmask] [gateway] [metric] :\n"
234 " Add route to routing table after connection\n"
235 " is established. Multiple routes can be specified.\n"
236 " netmask default: 255.255.255.255\n"
237 " gateway default: taken from --route-gateway or --ifconfig\n"
238 " Specify default by leaving blank or setting to \"default\".\n"
239 "--route-ipv6 network/bits [gateway] [metric] :\n"
240 " Add IPv6 route to routing table after connection\n"
241 " is established. Multiple routes can be specified.\n"
242 " gateway default: taken from --route-ipv6-gateway or 'remote'\n"
243 " in --ifconfig-ipv6\n"
244 "--route-gateway gw|'dhcp' : Specify a default gateway for use with --route.\n"
245 "--route-ipv6-gateway gw : Specify a default gateway for use with --route-ipv6.\n"
246 "--route-metric m : Specify a default metric for use with --route.\n"
247 "--route-delay n [w] : Delay n seconds after connection initiation before\n"
248 " adding routes (may be 0). If not specified, routes will\n"
249 " be added immediately after tun/tap open. On Windows, wait\n"
250 " up to w seconds for TUN/TAP adapter to come up.\n"
251 "--route-up cmd : Run command cmd after routes are added.\n"
252 "--route-pre-down cmd : Run command cmd before routes are removed.\n"
253 "--route-noexec : Don't add routes automatically. Instead pass routes to\n"
254 " --route-up script using environmental variables.\n"
255 "--route-nopull : When used with --client or --pull, accept options pushed\n"
256 " by server EXCEPT for routes, dns, and dhcp options.\n"
257 "--allow-pull-fqdn : Allow client to pull DNS names from server for\n"
258 " --ifconfig, --route, and --route-gateway.\n"
259 "--redirect-gateway [flags]: Automatically execute routing\n"
260 " commands to redirect all outgoing IP traffic through the\n"
261 " VPN. Add 'local' flag if both " PACKAGE_NAME
" servers are directly\n"
262 " connected via a common subnet, such as with WiFi.\n"
263 " Add 'def1' flag to set default route using using 0.0.0.0/1\n"
264 " and 128.0.0.0/1 rather than 0.0.0.0/0. Add 'bypass-dhcp'\n"
265 " flag to add a direct route to DHCP server, bypassing tunnel.\n"
266 " Add 'bypass-dns' flag to similarly bypass tunnel for DNS.\n"
267 "--redirect-private [flags]: Like --redirect-gateway, but omit actually changing\n"
268 " the default gateway. Useful when pushing private subnets.\n"
269 "--block-ipv6 : (Client) Instead sending IPv6 to the server generate\n"
270 " ICMPv6 host unreachable messages on the client.\n"
271 " (Server) Instead of forwarding IPv6 packets send\n"
272 " ICMPv6 host unreachable packets to the client.\n"
273 "--client-nat snat|dnat network netmask alias : on client add 1-to-1 NAT rule.\n"
274 "--push-peer-info : (client only) push client info to server.\n"
275 "--setenv name value : Set a custom environmental variable to pass to script.\n"
276 "--setenv FORWARD_COMPATIBLE 1 : Relax config file syntax checking to allow\n"
277 " directives for future OpenVPN versions to be ignored.\n"
278 "--ignore-unknown-option opt1 opt2 ...: Relax config file syntax. Allow\n"
279 " these options to be ignored when unknown\n"
280 "--script-security level: Where level can be:\n"
281 " 0 -- strictly no calling of external programs\n"
282 " 1 -- (default) only call built-ins such as ifconfig\n"
283 " 2 -- allow calling of built-ins and scripts\n"
284 " 3 -- allow password to be passed to scripts via env\n"
285 "--shaper n : Restrict output to peer to n bytes per second.\n"
286 "--keepalive n m : Helper option for setting timeouts in server mode. Send\n"
287 " ping once every n seconds, restart if ping not received\n"
289 "--inactive n [bytes] : Exit after n seconds of activity on tun/tap device\n"
290 " produces a combined in/out byte count < bytes.\n"
291 "--session-timeout n: Limit connection time to n seconds.\n"
292 "--ping-exit n : Exit if n seconds pass without reception of remote ping.\n"
293 "--ping-restart n: Restart if n seconds pass without reception of remote ping.\n"
294 "--ping-timer-rem: Run the --ping-exit/--ping-restart timer only if we have a\n"
296 "--ping n : Ping remote once every n seconds over TCP/UDP port.\n"
298 "--multihome : Configure a multi-homed UDP server.\n"
300 "--remap-usr1 s : On SIGUSR1 signals, remap signal (s='SIGHUP' or 'SIGTERM').\n"
301 "--persist-tun : Keep tun/tap device open across SIGUSR1 or --ping-restart.\n"
302 "--persist-remote-ip : Keep remote IP address across SIGUSR1 or --ping-restart.\n"
303 "--persist-local-ip : Keep local IP address across SIGUSR1 or --ping-restart.\n"
304#if PASSTOS_CAPABILITY
305 "--passtos : TOS passthrough (applies to IPv4 only).\n"
307 "--tun-mtu n : Take the tun/tap device MTU to be n and derive the\n"
308 " TCP/UDP MTU from it (default=%d).\n"
309 "--tun-mtu-extra n : Assume that tun/tap device might return as many\n"
310 " as n bytes more than the tun-mtu size on read\n"
311 " (default TUN=0 TAP=%d).\n"
312 "--tun-mtu-max n : Maximum pushable MTU (default and minimum=%d).\n"
313 "--link-mtu n : Take the TCP/UDP device MTU to be n and derive the tun MTU\n"
315 "--mtu-disc type : Should we do Path MTU discovery on TCP/UDP channel?\n"
316 " 'no' -- Never send DF (Don't Fragment) frames\n"
317 " 'maybe' -- Use per-route hints\n"
318 " 'yes' -- Always DF (Don't Fragment)\n"
319 "--mtu-test : Empirically measure and report MTU.\n"
320#ifdef ENABLE_FRAGMENT
321 "--fragment max : Enable internal datagram fragmentation so that no UDP\n"
322 " datagrams are sent which are larger than max bytes.\n"
323 " Adds 4 bytes of overhead per datagram.\n"
325 "--mssfix [n] : Set upper bound on TCP MSS, default = tun-mtu size\n"
326 " or --fragment max value, whichever is lower.\n"
327 "--sndbuf size : Set the TCP/UDP send buffer size.\n"
328 "--rcvbuf size : Set the TCP/UDP receive buffer size.\n"
329#if defined(TARGET_LINUX)
330 "--mark value : Mark encrypted packets being sent with value. The mark value\n"
331 " can be matched in policy routing and packetfilter rules.\n"
332 "--bind-dev dev : Bind to the given device when making connection to a peer or\n"
333 " listening for connections. This allows sending encrypted packets\n"
334 " via a VRF present on the system.\n"
336 "--txqueuelen n : Set the tun/tap TX queue length to n (Linux only).\n"
337 "--mlock : Disable Paging -- ensures key material and tunnel\n"
338 " data will never be written to disk.\n"
339 "--up cmd : Run command cmd after successful tun device open.\n"
340 " Execute as: cmd tun/tap-dev tun-mtu link-mtu \\\n"
341 " ifconfig-local-ip ifconfig-remote-ip\n"
342 " (pre --user or --group UID/GID change)\n"
343 "--up-delay : Delay tun/tap open and possible --up script execution\n"
344 " until after TCP/UDP connection establishment with peer.\n"
345 "--down cmd : Run command cmd after tun device close.\n"
346 " (post --user/--group UID/GID change and/or --chroot)\n"
347 " (command parameters are same as --up option)\n"
348 "--down-pre : Run --down command before TUN/TAP close.\n"
349 "--up-restart : Run up/down commands for all restarts including those\n"
350 " caused by --ping-restart or SIGUSR1\n"
351 "--user user : Set UID to user after initialization.\n"
352 "--group group : Set GID to group after initialization.\n"
353 "--chroot dir : Chroot to this directory after initialization.\n"
355 "--setcon context: Apply this SELinux context after initialization.\n"
357 "--cd dir : Change to this directory before initialization.\n"
358 "--daemon [name] : Become a daemon after initialization.\n"
359 " The optional 'name' parameter will be passed\n"
360 " as the program name to the system logger.\n"
361 "--syslog [name] : Output to syslog, but do not become a daemon.\n"
362 " See --daemon above for a description of the 'name' parm.\n"
363 "--log file : Output log to file which is created/truncated on open.\n"
364 "--log-append file : Append log to file, or create file if nonexistent.\n"
365 "--suppress-timestamps : Don't log timestamps to stdout/stderr.\n"
366 "--machine-readable-output : Always log timestamp, message flags to stdout/stderr.\n"
367 "--writepid file : Write main process ID to file.\n"
368 "--nice n : Change process priority (>0 = lower, <0 = higher).\n"
369 "--echo [parms ...] : Echo parameters to log output.\n"
370 "--verb n : Set output verbosity to n (default=%d):\n"
371 " (Level 3 is recommended if you want a good summary\n"
372 " of what's happening without being swamped by output).\n"
373 " : 0 -- no output except fatal errors\n"
374 " : 1 -- startup info + connection initiated messages +\n"
375 " non-fatal encryption & net errors\n"
376 " : 2,3 -- show TLS negotiations & route info\n"
377 " : 4 -- show parameters\n"
378 " : 5 -- show 'RrWw' chars on console for each packet sent\n"
379 " and received from TCP/UDP (caps) or tun/tap (lc)\n"
380 " : 6 to 11 -- debug messages of increasing verbosity\n"
381 "--mute n : Log at most n consecutive messages in the same category.\n"
382 "--status file [n] : Write operational status to file every n seconds.\n"
383 "--status-version [n] : Choose the status file format version number.\n"
384 " Currently, n can be 1, 2, or 3 (default=1).\n"
385 "--disable-occ : (DEPRECATED) Disable options consistency check between peers.\n"
387 "--gremlin mask : Special stress testing mode (for debugging only).\n"
390 "--compress alg : Use compression algorithm alg\n"
391 "--allow-compression: Specify whether compression should be allowed\n"
392#if defined(ENABLE_LZO)
393 "--comp-lzo : Use LZO compression -- may add up to 1 byte per\n"
394 " packet for incompressible data.\n"
395 "--comp-noadapt : Don't use adaptive compression when --comp-lzo\n"
399#ifdef ENABLE_MANAGEMENT
400 "--management ip port [pass] : Enable a TCP server on ip:port to handle\n"
401 " management functions. pass is a password file\n"
402 " or 'stdin' to prompt from console.\n"
404 " To listen on a unix domain socket, specific the pathname\n"
405 " in place of ip and use 'unix' as the port number.\n"
407 "--management-client : Management interface will connect as a TCP client to\n"
408 " ip/port rather than listen as a TCP server.\n"
409 "--management-query-passwords : Query management channel for private key\n"
410 " and auth-user-pass passwords.\n"
411 "--management-query-proxy : Query management channel for proxy information.\n"
412 "--management-query-remote : Query management channel for --remote directive.\n"
413 "--management-hold : Start " PACKAGE_NAME
" in a hibernating state, until a client\n"
414 " of the management interface explicitly starts it.\n"
415 "--management-signal : Issue SIGUSR1 when management disconnect event occurs.\n"
416 "--management-forget-disconnect : Forget passwords when management disconnect\n"
418 "--management-up-down : Report tunnel up/down events to management interface.\n"
419 "--management-log-cache n : Cache n lines of log file history for usage\n"
420 " by the management channel.\n"
422 "--management-client-user u : When management interface is a unix socket, only\n"
423 " allow connections from user u.\n"
424 "--management-client-group g : When management interface is a unix socket, only\n"
425 " allow connections from group g.\n"
427 "--management-client-auth : gives management interface client the responsibility\n"
428 " to authenticate clients after their client certificate\n"
429 " has been verified.\n"
432 "--plugin m [str]: Load plug-in module m passing str as an argument\n"
433 " to its initialization function.\n"
435 "--vlan-tagging : Enable 802.1Q-based VLAN tagging.\n"
436 "--vlan-accept tagged|untagged|all : Set VLAN tagging mode. Default is 'all'.\n"
437 "--vlan-pvid v : Sets the Port VLAN Identifier. Defaults to 1.\n"
439 "Multi-Client Server options (when --mode server is used):\n"
440 "--server network netmask : Helper option to easily configure server mode.\n"
441 "--server-ipv6 network/bits : Configure IPv6 server mode.\n"
442 "--server-bridge [IP netmask pool-start-IP pool-end-IP] : Helper option to\n"
443 " easily configure ethernet bridging server mode.\n"
444 "--push \"option\" : Push a config file option back to the peer for remote\n"
445 " execution. Peer must specify --pull in its config file.\n"
446 "--push-reset : Don't inherit global push list for specific\n"
447 " client instance.\n"
448 "--push-remove opt : Remove options matching 'opt' from the push list for\n"
449 " a specific client instance.\n"
450 "--ifconfig-pool start-IP end-IP [netmask] : Set aside a pool of subnets\n"
451 " to be dynamically allocated to connecting clients.\n"
452 "--ifconfig-pool-persist file [seconds] : Persist/unpersist ifconfig-pool\n"
453 " data to file, at seconds intervals (default=600).\n"
454 " If seconds=0, file will be treated as read-only.\n"
455 "--ifconfig-ipv6-pool base-IP/bits : set aside an IPv6 network block\n"
456 " to be dynamically allocated to connecting clients.\n"
457 "--ifconfig-push local remote-netmask : Push an ifconfig option to remote,\n"
458 " overrides --ifconfig-pool dynamic allocation.\n"
459 " Only valid in a client-specific config file.\n"
460 "--ifconfig-ipv6-push local/bits remote : Push an ifconfig-ipv6 option to\n"
461 " remote, overrides --ifconfig-ipv6-pool allocation.\n"
462 " Only valid in a client-specific config file.\n"
463 "--iroute network [netmask] : Route subnet to client.\n"
464 "--iroute-ipv6 network/bits : Route IPv6 subnet to client.\n"
465 " Sets up internal routes only.\n"
466 " Only valid in a client-specific config file.\n"
467 "--disable : Client is disabled.\n"
468 " Only valid in a client-specific config file.\n"
469 "--override-username: Overrides the client-specific username to be used.\n"
470 " Only valid in a client-specific config file.\n"
471 "--verify-client-cert [none|optional|require] : perform no, optional or\n"
472 " mandatory client certificate verification.\n"
473 " Default is to require the client to supply a certificate.\n"
474 "--username-as-common-name : For auth-user-pass authentication, use\n"
475 " the authenticated username as the common name,\n"
476 " rather than the common name from the client cert.\n"
477 "--auth-user-pass-verify cmd method: Query client for username/password and\n"
478 " run command cmd to verify. If method='via-env', pass\n"
479 " user/pass via environment, if method='via-file', pass\n"
480 " user/pass via temporary file.\n"
481 "--auth-gen-token [lifetime] Generate a random authentication token which is pushed\n"
482 " to each client, replacing the password. Useful when\n"
483 " OTP based two-factor auth mechanisms are in use and\n"
484 " --reneg-* options are enabled. Optionally a lifetime in seconds\n"
485 " for generated tokens can be set.\n"
486 "--auth-user-pass-optional : Allow connections by clients that don't\n"
487 " specify a username/password.\n"
488 "--client-to-client : Internally route client-to-client traffic.\n"
489 "--duplicate-cn : Allow multiple clients with the same common name to\n"
490 " concurrently connect.\n"
491 "--client-connect cmd : Run command cmd on client connection.\n"
492 "--client-disconnect cmd : Run command cmd on client disconnection.\n"
493 "--client-config-dir dir : Directory for custom client config files.\n"
494 "--ccd-exclusive : Refuse connection unless custom client config is found.\n"
495 "--tmp-dir dir : Temporary directory, used for --client-connect return file and plugin communication.\n"
496 "--hash-size r v : Set the size of the real address hash table to r and the\n"
497 " virtual address table to v.\n"
498 "--bcast-buffers n : Allocate n broadcast buffers.\n"
499 "--tcp-queue-limit n : Maximum number of queued TCP output packets.\n"
500 "--tcp-nodelay : In server mode, push TCP_NODELAY to clients (it is\n"
501 " enabled by default on the local socket).\n"
502 "--learn-address cmd : Run command cmd to validate client virtual addresses.\n"
503 "--connect-freq n s : Allow a maximum of n new connections per s seconds.\n"
504 "--connect-freq-initial n s : Allow a maximum of n replies for initial connections attempts per s seconds.\n"
505 "--max-clients n : Allow a maximum of n simultaneously connected clients.\n"
506 "--max-routes-per-client n : Allow a maximum of n internal routes per client.\n"
507 "--stale-routes-check n [t] : Remove routes with a last activity timestamp\n"
508 " older than n seconds. Run this check every t\n"
509 " seconds (defaults to n).\n"
510 "--explicit-exit-notify [n] : In UDP server mode send [RESTART] command on exit/restart to connected\n"
511 " clients. n = 1 - reconnect to same server,\n"
512 " 2 - advance to next server, default=1.\n"
514 "--port-share host port [dir] : When run in TCP mode, proxy incoming HTTPS\n"
515 " sessions to a web server at host:port. dir specifies an\n"
516 " optional directory to write origin IP:port data.\n"
519 "Client options (when connecting to a multi-client server):\n"
520 "--client : Helper option to easily configure client mode.\n"
521 "--auth-user-pass [up] : Authenticate with server using username/password.\n"
522 " up is a file containing the username on the first line,\n"
523 " and a password on the second. If either the password or both\n"
524 " the username and the password are omitted OpenVPN will prompt\n"
525 " for them from console. If [up] is 'username-only', only username\n"
526 " will be prompted for from console or management interface.\n"
527 "--pull : Accept certain config file options from the peer as if they\n"
528 " were part of the local config file. Must be specified\n"
529 " when connecting to a '--mode server' remote host.\n"
530 "--pull-filter accept|ignore|reject t : Filter each option received from the\n"
531 " server if it starts with the text t. The action flag accept,\n"
532 " ignore or reject causes the option to be allowed, removed or\n"
533 " rejected with error. May be specified multiple times, and\n"
534 " each filter is applied in the order of appearance.\n"
535 "--dns server <n> <option> <value> [value ...] : Configure option for DNS server #n\n"
536 " Valid options are :\n"
537 " address <addr[:port]> [addr[:port] ...] : server addresses 4/6\n"
538 " resolve-domains <domain> [domain ...] : split domains\n"
539 " dnssec <yes|no|optional> : option to use DNSSEC\n"
540 " transport <DoH|DoT> : query server over HTTPS / TLS\n"
541 " sni <domain> : DNS server name indication\n"
542 "--dns search-domains <domain> [domain ...]:\n"
543 " Add domains to DNS domain search list\n"
544 "--dns-updown cmd|force|disable : Run cmd as user defined dns config command,\n"
545 " force running the default script or disable running it.\n"
546 "--auth-retry t : How to handle auth failures. Set t to\n"
547 " none (default), interact, or nointeract.\n"
548 "--static-challenge t e [<scrv1|concat>]: Enable static challenge/response protocol using\n"
549 " challenge text t, with e indicating echo flag (0|1)\n"
550 " and optional argument scrv1 or concat to use SCRV1 protocol or"
551 " concatenate response with password. Default is scrv1.\n"
552 "--connect-timeout n : when polling possible remote servers to connect to\n"
553 " in a round-robin fashion, spend no more than n seconds\n"
554 " waiting for a response before trying the next server.\n"
555 "--allow-recursive-routing : When this option is set, OpenVPN will not drop\n"
556 " incoming tun packets with same destination as host.\n"
557 "--explicit-exit-notify [n] : On exit/restart, send exit signal to\n"
558 " server/remote. n = # of retries, default=1.\n"
560 "Data Channel Encryption Options (must be compatible between peers):\n"
561 "(These options are meaningful for both Static Key & TLS-mode)\n"
562 "--auth alg : Authenticate packets with HMAC using message\n"
563 " digest algorithm alg (default=%s).\n"
564 " (usually adds 16 or 20 bytes per packet)\n"
565 " Set alg=none to disable authentication.\n"
566 "--cipher alg : Encrypt packets with cipher algorithm alg.\n"
567 " You should usually use --data-ciphers instead.\n"
568 " Set alg=none to disable encryption.\n"
569 "--data-ciphers list : List of ciphers that are allowed to be negotiated.\n"
570#ifndef ENABLE_CRYPTO_MBEDTLS
571 "--engine [name] : Enable OpenSSL hardware crypto engine functionality.\n"
573 "--mute-replay-warnings : Silence the output of replay warnings to log file.\n"
574 "--replay-window n [t] : Use a replay protection sliding window of size n\n"
575 " and a time window of t seconds.\n"
576 " Default n=%d t=%d\n"
577 "--replay-persist file : Persist replay-protection state across sessions\n"
579 "--test-crypto : Run a self-test of crypto features enabled.\n"
580 " For debugging only.\n"
582 "TLS Key Negotiation Options:\n"
583 "(These options are meaningful only for TLS-mode)\n"
584 "--tls-server : Enable TLS and assume server role during TLS handshake.\n"
585 "--tls-client : Enable TLS and assume client role during TLS handshake.\n"
586 "--ca file : Certificate authority file in .pem format containing\n"
587 " root certificate.\n"
588#ifndef ENABLE_CRYPTO_MBEDTLS
589 "--capath dir : A directory of trusted certificates (CAs"
592 "--dh file : File containing Diffie Hellman parameters\n"
593 " in .pem format (for --tls-server only).\n"
594 " Use \"openssl dhparam -out dh1024.pem 1024\" to generate.\n"
595 "--cert file : Local certificate in .pem format or a URI -- must be signed\n"
596 " by a Certificate Authority in --ca file used by the peer.\n"
597 "--extra-certs file : one or more PEM certs that complete the cert chain.\n"
598 "--key file : Local private key in .pem format or a URI.\n"
599 "--tls-version-min <version> ['or-highest'] : sets the minimum TLS version we\n"
600 " will accept from the peer. If version is unrecognized and 'or-highest'\n"
601 " is specified, require max TLS version supported by SSL implementation.\n"
602 "--tls-version-max <version> : sets the maximum TLS version we will use.\n"
603#ifndef ENABLE_CRYPTO_MBEDTLS
604 "--pkcs12 file : PKCS#12 file containing local private key, local certificate\n"
605 " and optionally the root CA certificate.\n"
606 "--x509-username-field : Field in x509 certificate containing the username.\n"
607 " Default is CN in the Subject field.\n"
609 "--verify-hash hash [algo] : Specify fingerprint for level-1 certificate.\n"
610 " Valid algo flags are SHA1 and SHA256. \n"
612 "--cryptoapicert select-string : Load the certificate and private key from the\n"
613 " Windows Certificate System Store.\n"
615 "--tls-cipher l : A list l of allowable TLS ciphers separated by : (optional).\n"
616 "--tls-ciphersuites l: A list of allowed TLS 1.3 cipher suites separated by : (optional)\n"
617 " : Use --show-tls to see a list of supported TLS ciphers (suites).\n"
618 "--tls-cert-profile p : Set the allowed certificate crypto algorithm profile\n"
619 " (default=legacy).\n"
620#ifndef ENABLE_CRYPTO_MBEDTLS
621 "--providers l : A list l of OpenSSL providers to load.\n"
623 "--tls-timeout n : Packet retransmit timeout on TLS control channel\n"
624 " if no ACK from remote within n seconds (default=%d).\n"
625 "--reneg-bytes n : Renegotiate data chan. key after n bytes sent and recvd.\n"
626 "--reneg-pkts n : Renegotiate data chan. key after n packets sent and recvd.\n"
627 "--reneg-sec max [min] : Renegotiate data chan. key after at most max (default=%d)\n"
628 " and at least min (defaults to 90%% of max on servers and equal\n"
629 " to max on clients).\n"
630 "--hand-window n : Data channel key exchange must finalize within n seconds\n"
631 " of handshake initiation by any peer (default=%d).\n"
632 "--tran-window n : Transition window -- old key can live this many seconds\n"
633 " after new key renegotiation begins (default=%d).\n"
634 "--single-session: Allow only one session (reset state on restart).\n"
635 "--tls-exit : Exit on TLS negotiation failure.\n"
636 "--tls-auth f [d]: Add an additional layer of authentication on top of the TLS\n"
637 " control channel to protect against attacks on the TLS stack\n"
638 " and DoS attacks.\n"
639 " f (required) is a shared-secret key file.\n"
640 " The optional d parameter controls key directionality.\n"
641 "--tls-crypt key : Add an additional layer of authenticated encryption on top\n"
642 " of the TLS control channel to hide the TLS certificate,\n"
643 " provide basic post-quantum security and protect against\n"
644 " attacks on the TLS stack and DoS attacks.\n"
645 " key (required) provides the pre-shared key file.\n"
646 "--tls-crypt-v2 key : For clients: use key as a client-specific tls-crypt key.\n"
647 " For servers: use key to decrypt client-specific keys. For\n"
648 " key generation (--genkey tls-crypt-v2-client): use key to\n"
649 " encrypt generated client-specific key. (See --tls-crypt.)\n"
650 "--genkey tls-crypt-v2-client [keyfile] [base64 metadata]: Generate a\n"
651 " fresh tls-crypt-v2 client key, and store to\n"
652 " keyfile. If supplied, include metadata in wrapped key.\n"
653 "--genkey tls-crypt-v2-server [keyfile] [base64 metadata]: Generate a\n"
654 " fresh tls-crypt-v2 server key, and store to keyfile\n"
655 "--tls-crypt-v2-verify cmd : Run command cmd to verify the metadata of the\n"
656 " client-supplied tls-crypt-v2 client key\n"
657 "--tls-crypt-v2-max-age n : Only accept tls-crypt-v2 client keys that have a\n"
658 " timestamp which is at most n days old.\n"
659 "--askpass [file]: Get PEM password from controlling tty before we daemonize.\n"
660 "--auth-nocache : Don't cache --askpass or --auth-user-pass passwords.\n"
661 "--crl-verify crl ['dir']: Check peer certificate against a CRL.\n"
662 "--tls-verify cmd: Run command cmd to verify the X509 name of a\n"
663 " pending TLS connection that has otherwise passed all other\n"
664 " tests of certification. cmd should return 0 to allow\n"
665 " TLS handshake to proceed, or 1 to fail. (cmd is\n"
666 " executed as 'cmd certificate_depth subject')\n"
667 "--verify-x509-name name: Accept connections only from a host with X509 subject\n"
668 " DN name. The remote host must also pass all other tests\n"
669 " of verification.\n"
670#ifndef ENABLE_CRYPTO_MBEDTLS
671 "--ns-cert-type t: (DEPRECATED) Require that peer certificate was signed with \n"
672 " an explicit nsCertType designation t = 'client' | 'server'.\n"
674 "--x509-track x : Save peer X509 attribute x in environment for use by\n"
675 " plugins and management interface.\n"
676 "--keying-material-exporter label len : Save Exported Keying Material (RFC5705)\n"
677 " of len bytes (min. 16 bytes) using label in environment for use by plugins.\n"
678 "--remote-cert-ku v ... : Require that the peer certificate was signed with\n"
679 " explicit key usage, you can specify more than one value.\n"
680 " value should be given in hex format.\n"
681 "--remote-cert-eku oid : Require that the peer certificate was signed with\n"
682 " explicit extended key usage. Extended key usage can be encoded\n"
683 " as an object identifier or OpenSSL string representation.\n"
684 "--remote-cert-tls t: Require that peer certificate was signed with explicit\n"
685 " key usage and extended key usage based on RFC3280 TLS rules.\n"
686 " t = 'client' | 'server'.\n"
690 "--pkcs11-providers provider ... : PKCS#11 provider to load.\n"
691 "--pkcs11-protected-authentication [0|1] ... : Use PKCS#11 protected authentication\n"
692 " path. Set for each provider.\n"
693 "--pkcs11-private-mode hex ... : PKCS#11 private key mode mask.\n"
694 " 0 : Try to determine automatically (default).\n"
696 " 2 : Use SignRecover.\n"
697 " 4 : Use Decrypt.\n"
699 "--pkcs11-cert-private [0|1] ... : Set if login should be performed before\n"
700 " certificate can be accessed. Set for each provider.\n"
701 "--pkcs11-pin-cache seconds : Number of seconds to cache PIN. The default is -1\n"
702 " cache until token is removed.\n"
703 "--pkcs11-id-management : Acquire identity from management interface.\n"
704 "--pkcs11-id serialized-id 'id' : Identity to use, get using standalone --show-pkcs11-ids\n"
707 "SSL Library information:\n"
708 "--show-ciphers : Show cipher algorithms to use with --cipher option.\n"
709 "--show-digests : Show message digest algorithms to use with --auth option.\n"
710 "--show-engines : Show hardware crypto accelerator engines (if available).\n"
711 "--show-tls : Show all TLS ciphers (TLS used only as a control channel).\n"
714 "Windows Specific:\n"
715 "--win-sys path : Pathname of Windows system directory. Default is the pathname\n"
716 " from SystemRoot environment variable.\n"
717 "--ip-win32 method : When using --ifconfig on Windows, set TAP-Windows adapter\n"
718 " IP address using method = manual, netsh, ipapi,\n"
719 " dynamic, or adaptive (default = adaptive).\n"
720 " Dynamic method allows two optional parameters:\n"
721 " offset: DHCP server address offset (> -256 and < 256).\n"
722 " If 0, use network address, if >0, take nth\n"
723 " address forward from network address, if <0,\n"
724 " take nth address backward from broadcast\n"
727 " lease-time: Lease time in seconds.\n"
728 " Default is one year.\n"
729 "--route-method : Which method to use for adding routes on Windows?\n"
730 " adaptive (default) -- Try ipapi then fall back to exe.\n"
731 " ipapi -- Use IP helper API.\n"
732 " exe -- Call the route.exe shell command.\n"
733 "--dhcp-option type [parm] : Set extended TAP-Windows properties, must\n"
734 " be used with --ip-win32 dynamic. For options\n"
735 " which allow multiple addresses,\n"
736 " --dhcp-option must be repeated.\n"
737 " DOMAIN name : Set DNS suffix\n"
738 " DOMAIN-SEARCH entry : Add entry to DNS domain search list\n"
739 " DNS addr : Set domain name server address(es) (IPv4 and IPv6)\n"
740 " NTP : Set NTP server address(es)\n"
741 " NBDD : Set NBDD server address(es)\n"
742 " WINS addr : Set WINS server address(es)\n"
743 " NBT type : Set NetBIOS over TCP/IP Node type\n"
744 " 1: B, 2: P, 4: M, 8: H\n"
745 " NBS id : Set NetBIOS scope ID\n"
746 " DISABLE-NBT : Disable Netbios-over-TCP/IP.\n"
747 "--dhcp-renew : Ask Windows to renew the TAP adapter lease on startup.\n"
748 "--dhcp-pre-release : Ask Windows to release the previous TAP adapter lease on\n"
750 "--register-dns : Run ipconfig /flushdns and ipconfig /registerdns\n"
751 " on connection initiation.\n"
752 "--tap-sleep n : Sleep for n seconds after TAP adapter open before\n"
753 " attempting to set adapter properties.\n"
754 "--pause-exit : When run from a console window, pause before exiting.\n"
755 "--service ex [0|1] : For use when " PACKAGE_NAME
" is being instantiated by a\n"
756 " service, and should not be used directly by end-users.\n"
757 " ex is the name of an event object which, when\n"
758 " signaled, will cause " PACKAGE_NAME
" to exit. A second\n"
759 " optional parameter controls the initial state of ex.\n"
760 "--show-net-up : Show " PACKAGE_NAME
"'s view of routing table and net adapter list\n"
761 " after TAP adapter is up and routes have been added.\n"
762 "--block-outside-dns : Block DNS on other network adapters to prevent DNS leaks\n"
763 "Windows Standalone Options:\n"
765 "--show-adapters : Show all TAP-Windows adapters.\n"
766 "--show-net : Show " PACKAGE_NAME
"'s view of routing table and net adapter list.\n"
767 "--show-valid-subnets : Show valid subnets for --dev tun emulation.\n"
768 "--allow-nonadmin [TAP-adapter] : Allow " PACKAGE_NAME
" running without admin privileges\n"
769 " to access TAP adapter.\n"
772 "Generate a new key :\n"
773 "--genkey tls-auth file : Generate a new random key of type and write to file\n"
774 " (for use with --tls-auth or --tls-crypt)."
775#ifdef ENABLE_FEATURE_TUN_PERSIST
777 "Tun/tap config mode:\n"
778 "--mktun : Create a persistent tunnel.\n"
779 "--rmtun : Remove a persistent tunnel.\n"
780 "--dev tunX|tapX : tun/tap device\n"
781 "--dev-type dt : Device type. See tunnel options above for details.\n"
782 "--user user : User to set privilege to.\n"
783 "--group group : Group to set privilege to.\n"
787 "PKCS#11 standalone options:\n"
788#ifdef DEFAULT_PKCS11_MODULE
789 "--show-pkcs11-ids [provider] [cert_private] : Show PKCS#11 available ids.\n"
791 "--show-pkcs11-ids provider [cert_private] : Show PKCS#11 available ids.\n"
793 " --verb option can be added *BEFORE* this.\n"
796 "General Standalone Options:\n"
798 "--show-gateway [address]: Show info about gateway [to v4/v6 address].\n"
820 o->
ce.
af = AF_UNSPEC;
845#ifdef ENABLE_MANAGEMENT
850#ifdef ENABLE_FEATURE_TUN_PERSIST
891 o->pkcs11_pin_cache_period = -1;
906#ifdef ENABLE_DNS_UPDOWN_BY_DEFAULT
987setenv_foreign_option(
struct options *o,
const char *option,
const char *value,
struct env_set *es)
997 good &=
buf_printf(&env_value,
"dhcp-option %s %s", option, value);
1001 good &=
buf_printf(&env_value,
"dhcp-option %s", option);
1010 msg(
M_WARN,
"foreign_option: name/value overflow");
1022 for (current = *list, prev = NULL; current != NULL; current = current->
next)
1024 if (!strncmp(current->
string,
"foreign_option_",
sizeof(
"foreign_option_") - 1))
1026 const char *tmp_value = strchr(current->
string,
'=');
1027 if (tmp_value && ++tmp_value)
1029 if (!strncmp(tmp_value,
"dhcp-option ",
sizeof(
"dhcp-option ") - 1))
1037 *list = current->
next;
1057 const char *end = strchr(addr,
'/');
1065 size_t len = end - addr;
1067 memcpy(ret, addr, len);
1084 const char *cp = str;
1092 while (*cp && i < nbytes)
1095 if (!isxdigit(cp[0]) || !isxdigit(cp[1]) || (cp[2] !=
':' && cp[2] !=
'\0')
1096 || sscanf(cp,
"%x", &
byte) != 1)
1098 msg(msglevel,
"format error in hash fingerprint: %s", str);
1102 ret->
hash[i++] = (uint8_t)
byte;
1113 msg(msglevel,
"hash fingerprint is wrong length - expected %d bytes, got %d: %s", nbytes, i,
1116 else if (term !=
'\0')
1118 msg(msglevel,
"hash fingerprint too long - expected only %d bytes: %s", nbytes, str);
1143 while ((line =
strsep(&lines,
"\n")))
1146 while (isspace(*line))
1151 if (strlen(line) == 0 || *line ==
'#' || *line ==
';')
1175 struct in6_addr addr;
1178 msg(msglevel,
"--dhcp-option DNS: maximum of %u IPv6 dns servers can be specified",
1183 dns6_list[(*len)++] = addr;
1192 msg(msglevel,
"--dhcp-option %s: maximum of %u %s servers can be specified", name,
1203 array[(*len)++] = addr;
1208 msg(msglevel,
"dhcp-option parameter %s '%s' must be an IP address", name, parm);
1230 msg(msglevel,
"in --iroute %s %s : Bad network/subnet specification", network_str,
1249 msg(msglevel,
"in --iroute-ipv6 %s: Bad IPv6 prefix specification", prefix_str);
1304#ifdef ENABLE_MANAGEMENT
1316 if (flags && !strcmp(flags,
"nct"))
1339 bool succeed =
false;
1340 for (i = 0; i < l->
len; ++i)
1351 for (i = 0; i < l->
len; ++i)
1363 "Note: option http-proxy-override ignored because no TCP-based connection profiles are defined");
1387 const int new_cap = l->
capacity + 1;
1388 const size_t elem_size =
sizeof(*l->
array);
1394 "Unable to process more local options: out of memory. Number of entries = %d",
1399 l->
array = new_array;
1434 "Unable to process more connection options: out of memory. Number of entries = %d",
1470 "Unable to process more remote options: out of memory. Number of entries = %d",
1537 if (key_file && *key_file && !(*key_inline))
1542 msg(
M_FATAL,
"Cannot pre-load keyfile (%s)", *key_file);
1545 *key_file = (
const char *)in.
data;
1553#ifdef ENABLE_CRYPTO_MBEDTLS
1556 msg(
M_USAGE,
"Parameter --capath cannot be used with the mbed TLS version of OpenVPN.");
1561#ifndef ENABLE_CRYPTO_MBEDTLS
1569 const char *
const str =
"You must define CA file (--ca)"
1570#ifndef ENABLE_CRYPTO_MBEDTLS
1571 " or CA path (--capath)"
1573 " and/or peer fingerprint verification (--peer-fingerprint)";
1577#define MUST_BE_UNDEF(parm, parm_name) \
1578 if (options->parm != defaults.parm) \
1580 msg(M_USAGE, use_err, parm_name); \
1582#define MUST_BE_FALSE(condition, parm_name) \
1585 msg(M_USAGE, use_err, parm_name); \
1613 msg(
M_USAGE,
"--proto tcp is ambiguous in this context. Please specify "
1614 "--proto tcp-server or --proto tcp-client");
1623 msg(
M_USAGE,
"multiple --local statements only allowed in --server mode");
1628 msg(
M_USAGE,
"--lladdr can only be used in --dev tap mode");
1636 msg(
M_USAGE,
"only one of --tun-mtu or --link-mtu may be defined");
1641 msg(
M_USAGE,
"--mtu-test only makes sense with --proto udp");
1654 msg(
M_USAGE,
"--local and --remote addresses must be distinct from --ifconfig "
1660 msg(
M_USAGE,
"local and remote/netmask --ifconfig addresses must be different");
1665 msg(
M_USAGE,
"--bind and --nobind can't be used together");
1670 msg(
M_USAGE,
"--lport and --nobind don't make sense when used together");
1675 msg(
M_USAGE,
"--nobind doesn't make sense unless used with --remote");
1685 msg(
M_USAGE,
"--remote and one of the --local addresses are the same");
1691 msg(
M_USAGE,
"--local addresses must be distinct from --ifconfig addresses");
1696 msg(
M_USAGE,
"--local and --nobind don't make sense when used together");
1703#ifdef ENABLE_MANAGEMENT
1709 "--management is not specified, however one or more options which modify the behavior of --management were specified");
1715 msg(
M_USAGE,
"--management-client-(user|group) can only be used on unix domain sockets");
1721 msg(
M_WARN,
"WARNING: Using --management on a TCP port WITHOUT "
1722 "passwords is STRONGLY discouraged and considered insecure");
1727#if !defined(HAVE_XKEY_PROVIDER)
1731 msg(
M_FATAL,
"management-external-key with TLS 1.3 or later requires "
1732 "nopadding argument/support");
1743 msg(
M_USAGE,
"On Windows, --ifconfig is required when --dev tun is used");
1749 msg(
M_USAGE,
"On Windows, --ip-win32 doesn't make sense unless --ifconfig is also used");
1754 const char *prefix =
"Some --dhcp-option or --dns options require DHCP server";
1757 msg(
M_USAGE,
"%s, which is not supported by the selected %s driver", prefix,
1763 msg(
M_USAGE,
"%s, which requires --ip-win32 dynamic or adaptive", prefix);
1772#ifdef ENABLE_FRAGMENT
1775 msg(
M_USAGE,
"--fragment can only be used with --proto udp");
1781 msg(
M_USAGE,
"--remote MUST be used in TCP Client mode");
1786 msg(
M_USAGE,
"--http-proxy MUST be used in TCP Client mode (i.e. --proto "
1792 msg(
M_USAGE,
"--http-proxy not specified but other http proxy options present");
1797 msg(
M_USAGE,
"--http-proxy can not be used together with --socks-proxy");
1802 msg(
M_USAGE,
"--socks-proxy can not be used in TCP Server mode");
1807 msg(
M_USAGE,
"TCP server mode allows at most one --remote address");
1815 const char use_err[] =
"--%s cannot be used with --mode server.";
1817#define USAGE_VALID_SERVER_PROTOS \
1818 "--mode server currently only supports " \
1819 "--proto values of udp, tcp-server, tcp4-server, or tcp6-server"
1820#ifdef TARGET_ANDROID
1821 msg(
M_FATAL,
"--mode server not supported on Android");
1825 msg(
M_USAGE,
"--mode server only works with --dev tun or --dev tap");
1830 msg(
M_WARN,
"--pull-filter ignored for --mode server");
1837 bool has_tcp =
false;
1845 msg(
M_USAGE,
"--port-share only works in TCP server mode "
1846 "(--proto values of tcp-server, tcp4-server, or tcp6-server)");
1851 msg(
M_USAGE,
"--mode server requires --tls-server");
1862 msg(
M_USAGE,
"<connection> cannot be used with --mode server");
1868 msg(
M_USAGE,
"--ipchange cannot be used with --mode server (use "
1869 "--client-connect instead)");
1878 "--connect-freq only works with --mode server --proto udp. Try --max-clients instead.");
1884 "The third parameter to --ifconfig-pool (netmask) is only valid in --dev tap mode");
1889 "--redirect-gateway cannot be used with --mode server (however --push \"redirect-gateway\" is fine)");
1897 "--ifconfig-pool-persist must be used with --ifconfig-pool or --ifconfig-ipv6-pool");
1901 msg(
M_USAGE,
"--ifconfig-ipv6-pool needs --ifconfig-ipv6");
1903 MUST_BE_UNDEF(allow_recursive_routing,
"allow-recursive-routing");
1907 "--auth-user-pass cannot be used with --mode server (it should be used on the client side only)");
1911 msg(
M_USAGE,
"--ccd-exclusive must be used with --client-config-dir");
1915 msg(
M_USAGE,
"--auth-gen-token needs a non-infinite "
1916 "--renegotiate_seconds setting");
1922 "--auth-gen-token renewal time needs to be at least "
1923 " two times --hand-window (%d).",
1929 const char *use_err =
1930 "--%s must be used with --management-client-auth, an --auth-user-pass-verify script, or plugin";
1934 "verify-client-cert none|optional");
1936 "username-as-common-name");
1938 "auth-user-pass-optional");
1943 msg(
M_USAGE,
"--vlan-tagging must be used with --dev tap");
1947 const char use_err[] =
"--%s requires --vlan-tagging";
1954 msg(
M_INFO,
"NOTE: TCP_NODELAY is always enabled locally; "
1955 "--tcp-nodelay is now only useful to push the flag to "
1956 "clients older than 2.7.6.");
1961 const char use_err[] =
"--%s requires --mode server";
1967 MUST_BE_UNDEF(ifconfig_pool_persist_filename,
"ifconfig-pool-persist");
1968 MUST_BE_UNDEF(ifconfig_ipv6_pool_defined,
"ifconfig-ipv6-pool");
1973 MUST_BE_UNDEF(client_crresponse_script,
"client-crresponse");
1974 MUST_BE_UNDEF(client_disconnect_script,
"client-disconnect");
1983 "verify-client-cert");
1988 msg(
M_WARN,
"DEPRECATED OPTION: --tcp-nodelay is always enabled on clients");
1990 MUST_BE_UNDEF(auth_user_pass_verify_script,
"auth-user-pass-verify");
1996 "--port-share requires TCP server mode (--mode server --proto tcp-server)");
1999 MUST_BE_UNDEF(stale_routes_check_interval,
"stale-routes-check");
2003 MUST_BE_UNDEF(force_key_material_export,
"force-key-material-export");
2007 msg(
M_WARN,
"Note: Using --push without --mode server is an "
2008 "unsupported configuration. Negotiation of OpenVPN "
2009 "features is expected to fail.");
2018 msg(
M_USAGE,
"specify only one of --tls-server, --tls-client, or --secret");
2029 msg(msglevel,
"DEPRECATION: No tls-client or tls-server option in "
2030 "configuration detected. OpenVPN 2.8 will remove the "
2031 "functionality to run a VPN without TLS. "
2032 "See the examples section in the manual page for "
2033 "examples of a similar quick setup with peer-fingerprint. "
2034 "OpenVPN 2.7 allows using this configuration when using "
2035 "--allow-deprecated-insecure-static-crypto but you should move "
2036 "to a proper configuration using TLS as soon as possible.");
2041 msg(
M_WARN,
"WARNING: POTENTIALLY DANGEROUS OPTION "
2042 "--verify-client-cert none|optional "
2043 "may accept clients which do not present a certificate");
2046 const unsigned int tls_ver_max =
2048 const unsigned int tls_ver_min =
2051 if (tls_ver_max > 0 && tls_ver_max < tls_ver_min)
2053 msg(
M_USAGE,
"--tls-version-min bigger than --tls-version-max");
2062 msg(
M_WARN,
"Option pkcs11-id is ignored as no pkcs11-providers are specified");
2064 else if (!
options->pkcs11_providers[0] &&
options->pkcs11_id_management)
2067 "Option pkcs11-id-management is ignored as no pkcs11-providers are specified");
2070 if (
options->pkcs11_providers[0])
2075 "Parameter --pkcs11-id cannot be used when --pkcs11-id-management is also specified.");
2077 if (!
options->pkcs11_id_management &&
options->pkcs11_id == NULL)
2080 "Parameter --pkcs11-id or --pkcs11-id-management should be specified.");
2082 const char use_err[] =
2083 "Parameter --%s cannot be used when --pkcs11-provider is also specified.";
2089#ifdef ENABLE_CRYPTOAPI
2095#ifdef ENABLE_CRYPTOAPI
2098 const char use_err[] =
2099 "Parameter --%s cannot be used when --cryptoapicert is also specified.";
2110#ifdef ENABLE_CRYPTO_MBEDTLS
2111 msg(
M_USAGE,
"Parameter --pkcs12 cannot be used with the mbed TLS version of OpenVPN.");
2113 const char use_err[] =
"Parameter --%s cannot be used when --pkcs12 is also specified.";
2125 msg(
M_USAGE,
"--key and --management-external-key are mutually exclusive");
2131 msg(
M_USAGE,
"--cert and --management-external-cert are mutually exclusive");
2136 "--management-external-cert must be used with --management-external-key");
2150 msg(
M_USAGE,
"No client-side authentication method is "
2151 "specified. You must use either "
2152 "--cert/--key, --pkcs12, or "
2153 "--auth-user-pass");
2158 msg(
M_USAGE,
"If you use one of --cert or --key, you must use them both");
2166 "certificate file (--cert) or PKCS#12 file (--pkcs12)");
2171 "private key file (--key) or PKCS#12 file (--pkcs12)");
2177 msg(
M_USAGE,
"--tls-auth and --tls-crypt are mutually exclusive");
2183 "--tls-crypt-v2, --tls-auth and --tls-crypt are mutually exclusive in client mode");
2193 const char use_err[] =
"Parameter %s can only be specified in TLS-mode, "
2194 "i.e. where --tls-server or --tls-client is also specified.";
2201#ifndef ENABLE_CRYPTO_MBEDTLS
2228 MUST_BE_UNDEF(pkcs11_private_mode[0],
"pkcs11-private-mode");
2240 msg(
M_USAGE,
"--auth-user-pass requires --pull");
2309 if (ce->
af == AF_INET6)
2311 msg(
M_INFO,
"WARNING: '--proto udp6' is not compatible with "
2312 "'--socks-proxy' today. Forcing IPv4 mode.");
2316 msg(
M_INFO,
"NOTICE: dual-stack mode for '--proto udp' does not "
2317 "work correctly with '--socks-proxy' today. Forcing IPv4.");
2344#ifdef ENABLE_FRAGMENT
2401 msg(
M_WARN,
"NOTICE: --explicit-exit-notify ignored for --proto tcp");
2430 msg(
M_INFO,
"Flag 'def1' added to --redirect-gateway (iservice is in use)");
2612#ifdef DEFAULT_PKCS11_MODULE
2618 options->pkcs11_providers[0] = DEFAULT_PKCS11_MODULE;
2645 msg(
M_WARN,
"Note: --client-to-client has no effect when using data "
2646 "channel offload: packets are always sent to the VPN "
2647 "interface and then routed based on the system routing table");
2652 msg(
M_WARN,
"Note: '--reneg-bytes' and '--reneg-pkts' are not supported "
2653 "by data channel offload; automatic key renegotiation "
2654 "mechanisms are sufficient for modern ciphers. "
2655 "Ignoring these options.");
2687 "Note: --cipher is not set. OpenVPN versions before 2.5 "
2688 "defaulted to BF-CBC as fallback when cipher negotiation "
2689 "failed in this case. If you need this fallback please add "
2690 "'--data-ciphers-fallback BF-CBC' to your configuration "
2691 "and/or add BF-CBC to --data-ciphers. E.g. "
2692 "--data-ciphers %s:BF-CBC",
2698 "DEPRECATED OPTION: --cipher set to '%s' but missing in "
2699 "--data-ciphers (%s). OpenVPN ignores --cipher for cipher "
2735 if (tls_ver_min == 0)
2743 else if (tls_ver_max == 0 || tls_ver_max >=
TLS_VER_1_2)
2804 "supported by the TLS library. Your system does not support this "
2805 "calculation anymore or your security policy (e.g. FIPS 140-2) "
2806 "forbids it. Connections will only work with peers running "
2807 "OpenVPN 2.6.0 or higher)");
2810 msg(
M_WARN,
"Automatically enabling option "
2811 "--force-tls-key-material-export");
2817#if defined(_WIN32) || defined(TARGET_ANDROID)
2877 msg(
M_WARN,
"WARNING: couldn't copy all --dns search-domains to TUN/TAP");
2886 bool non_standard_server_port =
false;
2891 non_standard_server_port =
true;
2903 bool overflow =
false;
2921 msg(
M_WARN,
"WARNING: couldn't copy all --dns server addresses to TUN/TAP");
2942dhcp_options_postprocess_dns(
struct options *o,
struct env_set *es)
2963 for (
int i = 1; i <= fo_count; ++i)
2968 const char *item_val = strchr(env_str,
'=') + 1;
2975 item_val =
BSTR(&value);
2976 if (strncmp(item_val,
"dhcp-option ", 12) != 0
2977 || (strncmp(item_val + 12,
"ADAPTER-DOMAIN-SUFFIX ", 22) != 0
2978 && strncmp(item_val + 12,
"DOMAIN-SEARCH ", 14) != 0
2979 && strncmp(item_val + 12,
"DOMAIN ", 7) != 0
2980 && strncmp(item_val + 12,
"DNS6 ", 5) != 0
2981 && strncmp(item_val + 12,
"DNS ", 4) != 0))
2996 if (
dhcp->dns_len ||
dhcp->dns6_len)
3002 entry = &domain->
next;
3004 for (
unsigned int i = 0; i <
dhcp->domain_search_list_len; ++i)
3008 search_domain->
name =
dhcp->domain_search_list[i];
3009 entry = &search_domain->
next;
3013 const size_t max_addrs =
SIZE(server->
addr);
3014 for (
unsigned int i = 0; i <
dhcp->dns_len && server->
addr_count < max_addrs; ++i)
3020 for (
unsigned int i = 0; i <
dhcp->dns6_len && server->
addr_count < max_addrs; ++i)
3034 setenv_foreign_option(o,
"DOMAIN", d->
name, es);
3041 bool non_standard_server_port =
false;
3046 non_standard_server_port =
true;
3072 setenv_foreign_option(o, option, value, es);
3129 msg(
M_USAGE,
"--data-ciphers list contains unsupported ciphers or is too long.");
3138 for (
int i = 0; i < rl->
len; ++i)
3210 msg(
M_WARN,
"WARNING: Ignoring option 'dh' in tls-client mode, please only "
3211 "include this in your server configuration");
3214#if ENABLE_MANAGEMENT
3222 msg(
M_INFO,
"Using certificate fingerprint to verify peer (no CA "
3229 msg(
M_USAGE,
"Options 'config stdin' and 'remap-usr1 SIGHUP' are "
3230 "incompatible with each other.");
3257 msg(
M_WARN,
"Note: ignoring --dev-node as it has no effect when using "
3258 "data channel offload");
3279#if defined(_WIN32) || defined(TARGET_ANDROID)
3282 dhcp_options_postprocess_dns(o, es);
3289#if ENABLE_MANAGEMENT
3292 msg(
M_USAGE,
"'auth-user-pass username-only' cannot be used with static challenge");
3324#if defined(_WIN32) || defined(TARGET_ANDROID)
3327 dhcp_options_postprocess_dns(o, es);
3340 if (
streq(str,
"net30"))
3344 else if (
streq(str,
"p2p"))
3348 else if (
streq(str,
"subnet"))
3354 msg(msglevel,
"--topology must be net30, p2p, or subnet");
3396 if (
streq(option,
"interact"))
3400 else if (
streq(option,
"nointeract"))
3404 else if (
streq(option,
"none"))
3410 msg(msglevel,
"--auth-retry method must be 'interact', 'nointeract', or 'none'");
3425 return "nointeract";
3445 fprintf(fp,
"Usage message not available\n");
3495#define LZO_LIB_VER_STR ", LZO ", lzo_version_string()
3497#define LZO_LIB_VER_STR "", ""
3502#undef LZO_LIB_VER_STR
3517#ifdef CONFIGURE_DEFINES
3520#ifdef CONFIGURE_SPECIAL_BUILD
3535 msg(
M_USAGE,
"You must define %s", description);
3543 msg(msglevel,
"only one of --ping-exit or --ping-restart options may be specified");
3551 unsigned int val = 0;
3552 sscanf(str,
"%u", &val);
3557#define VERIFY_PERMISSION(mask) \
3559 if (!verify_permission(p[0], file, line, (mask), permission_mask, option_types_found, \
3560 msglevel, options, is_inline)) \
3568 const uint64_t allowed, uint64_t *found,
const msglvl_t msglevel,
3571 if (!(type & allowed))
3573 msg(msglevel,
"option '%s' cannot be used in this context (%s)", name, file);
3579 msg(msglevel,
"option '%s' is not expected to be inline (%s:%d)", name, file, line);
3600 msg(
M_WARN,
"Option '%s' in %s:%d is ignored by previous <connection> blocks ", name,
3605 msg(
M_WARN,
"Option '%s' is ignored by previous <connection> blocks", name);
3617#define NM_QUOTE_HINT (1 << 0)
3631 msg(msglevel,
"the --%s directive should have at most %d parameter%s.%s", p[0], max - 1,
3632 max >= 3 ?
"s" :
"",
3634 ?
" To pass a list of arguments as one of the parameters, try enclosing them in double quotes (\"\")."
3650#define RESET_OPTION_ROUTES(option_ptr, field) \
3653 option_ptr->field = NULL; \
3654 option_ptr->flags = 0; \
3659 const char *file,
int line,
const msglvl_t msglevel,
3660 const uint64_t permission_mask, uint64_t *option_types_found,
3665 if (
streq(p[0],
"ifconfig") && !p[1])
3671 else if (
streq(p[0],
"ifconfig-ipv6") && !p[1])
3678 else if (
streq(p[0],
"route") && !p[1])
3688 else if (
streq(p[0],
"route-ipv6") && !p[1])
3698 else if (
streq(p[0],
"route-gateway") && !p[1])
3704 else if (
streq(p[0],
"route-metric") && !p[1])
3709 else if (
streq(p[0],
"push-continuation") && !p[1])
3714 else if ((
streq(p[0],
"redirect-gateway") ||
streq(p[0],
"redirect-private")) && !p[1])
3728 else if (
streq(p[0],
"dns") && !p[1])
3734 else if (
streq(p[0],
"topology") && !p[1])
3740 else if (
streq(p[0],
"tun-mtu") && !p[1])
3747 else if (
streq(p[0],
"block-ipv6") && !p[1])
3752#if defined(_WIN32) || defined(TARGET_ANDROID)
3753 else if (
streq(p[0],
"dhcp-option") && !p[1])
3762 memset(o->
dns6, 0,
sizeof(o->
dns6));
3764 memset(o->
dns, 0,
sizeof(o->
dns));
3766 memset(o->
wins, 0,
sizeof(o->
wins));
3768 memset(o->
ntp, 0,
sizeof(o->
ntp));
3770 memset(o->
nbdd, 0,
sizeof(o->
nbdd));
3777#if defined(TARGET_ANDROID)
3778 o->http_proxy_port = 0;
3779 o->http_proxy = NULL;
3784 else if (
streq(p[0],
"block-outside-dns") && !p[1])
3790 else if (
streq(p[0],
"dhcp-option") && !p[1])
3798 msglvl_t msglevel_unknown = msglevel_fc;
3805 msglevel_unknown =
M_WARN;
3809 msg(msglevel_unknown,
3810 "Unrecognized option or missing or extra parameter(s) in %s:%d: -%s (%s)", file, line,
3811 p[0], PACKAGE_VERSION);
3815 msg(msglevel,
"Error occurred trying to remove %s option", p[0]);
3828 msg(msglevel,
"route parameter network/IP '%s' must be a valid address", p[1]);
3833 msg(msglevel,
"route parameter netmask '%s' must be an IP address", p[2]);
3839 msg(msglevel,
"route parameter gateway '%s' must be a valid address", p[3]);
3855 msg(msglevel,
"route-ipv6 parameter network/IP '%s' must be a valid address", p[1]);
3860 msg(msglevel,
"route-ipv6 parameter gateway '%s' must be a valid address", p[2]);
3871 if (
streq(p[1],
"search-domains") && p[2])
3876 msg(msglevel,
"--dns %s contain invalid characters", p[1]);
3880 else if (
streq(p[1],
"server") && p[2] && p[3] && p[4])
3885 msg(msglevel,
"--dns server: invalid priority value '%s'", p[2]);
3892 if (
streq(p[3],
"address"))
3894 for (
int i = 4; p[i]; ++i)
3898 msg(msglevel,
"--dns server %ld: malformed address or maximum exceeded '%s'",
3904 else if (
streq(p[3],
"resolve-domains"))
3908 msg(msglevel,
"--dns server %ld: %s contain invalid characters",
priority, p[3]);
3912 else if (
streq(p[3],
"dnssec") && !p[5])
3914 if (
streq(p[4],
"yes"))
3918 else if (
streq(p[4],
"no"))
3922 else if (
streq(p[4],
"optional"))
3928 msg(msglevel,
"--dns server %ld: malformed dnssec value '%s'",
priority, p[4]);
3932 else if (
streq(p[3],
"transport") && !p[5])
3934 if (
streq(p[4],
"plain"))
3938 else if (
streq(p[4],
"DoH"))
3942 else if (
streq(p[4],
"DoT"))
3948 msg(msglevel,
"--dns server %ld: malformed transport value '%s'",
priority, p[4]);
3952 else if (
streq(p[3],
"sni") && !p[5])
3956 msg(msglevel,
"--dns server %ld: %s contains invalid characters",
priority, p[3]);
3964 "--dns server %ld: unknown option type '%s' or missing or unknown parameter",
3971 msg(msglevel,
"--dns: unknown option type '%s' or missing or unknown parameter", p[1]);
3979 const char *file,
int line,
const int level,
const msglvl_t msglevel,
3980 const uint64_t permission_mask, uint64_t *option_types_found,
3986 if (
streq(p[0],
"route") && p[1] && !p[5])
4004 else if (
streq(p[0],
"route-ipv6") && p[1] && !p[4])
4022 else if (
streq(p[0],
"redirect-gateway") ||
streq(p[0],
"redirect-private"))
4040 else if (
streq(p[0],
"dns") && p[1])
4054#if defined(_WIN32) || defined(TARGET_ANDROID)
4055 else if (
streq(p[0],
"dhcp-option") && p[1] && !p[3])
4081#if defined(TARGET_ANDROID)
4082 o->http_proxy_port = 0;
4083 o->http_proxy = NULL;
4089 else if (
streq(p[0],
"dhcp-option") && p[1] && !p[3])
4100 option_types_found, es);
4103 msg(msglevel,
"Error occurred trying to update %s option", p[0]);
4108 const char *type,
bool in_chroot)
4113 "Multiple --%s scripts defined. "
4114 "The previously configured script is overridden.",
4117 *script = new_script;
4122 char script_name[100];
4123 snprintf(script_name,
sizeof(script_name),
"--%s script", type);
4138 msg(
M_WARN,
"WARNING: Compression for receiving enabled. "
4139 "Compression has been used in the past to break encryption. "
4140 "Compression support is deprecated and we recommend to disable "
4150 ret = ret || (
options->pkcs11_providers[0] != NULL);
4152#ifdef ENABLE_CRYPTOAPI
4159#if defined(__GNUC__) || defined(__clang__)
4160#pragma GCC diagnostic push
4161#pragma GCC diagnostic ignored "-Wsign-compare"
4166 const int level,
const msglvl_t msglevel,
const uint64_t permission_mask,
4167 uint64_t *option_types_found,
struct env_set *es)
4183 p[2] =
"setenv opt";
4191 file =
"[CMD-LINE]";
4194 if (
streq(p[0],
"help"))
4200 msg(msglevel,
"--help does not accept any parameters");
4204 if (
streq(p[0],
"version") && !p[1])
4209 else if (
streq(p[0],
"config") && p[1] && !p[2])
4220 option_types_found, es);
4223 else if (
streq(p[0],
"show-gateway") && !p[2])
4228 struct in6_addr remote_ipv6 = IN6ADDR_ANY_INIT;
4247 else if (
streq(p[0],
"echo") ||
streq(p[0],
"parameter"))
4271 if (p[1] && strncmp(p[1],
"msg", 3) == 0)
4273 msg(
M_INFO,
"%s:%s", pull_mode ?
"ECHO-PULL" :
"ECHO",
BSTR(&
string));
4275#ifdef ENABLE_MANAGEMENT
4284 msg(
M_WARN,
"echo/parameter option overflow");
4287#ifdef ENABLE_MANAGEMENT
4288 else if (
streq(p[0],
"management") && p[1] && p[2] && !p[4])
4291 if (
streq(p[2],
"unix"))
4293#if UNIX_SOCK_SUPPORT
4296 msg(msglevel,
"MANAGEMENT: this platform does not support unix domain sockets");
4308 else if (
streq(p[0],
"management-client-user") && p[1] && !p[2])
4313 else if (
streq(p[0],
"management-client-group") && p[1] && !p[2])
4318 else if (
streq(p[0],
"management-query-passwords") && !p[1])
4323 else if (
streq(p[0],
"management-query-remote") && !p[1])
4328 else if (
streq(p[0],
"management-query-proxy") && !p[1])
4333 else if (
streq(p[0],
"management-hold") && !p[1])
4338 else if (
streq(p[0],
"management-signal") && !p[1])
4343 else if (
streq(p[0],
"management-forget-disconnect") && !p[1])
4348 else if (
streq(p[0],
"management-up-down") && !p[1])
4353 else if (
streq(p[0],
"management-client") && !p[1])
4358 else if (
streq(p[0],
"management-external-key"))
4361 for (
int j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
4363 if (
streq(p[j],
"nopadding"))
4367 else if (
streq(p[j],
"pkcs1"))
4371 else if (
streq(p[j],
"pss"))
4375 else if (
streq(p[j],
"digest"))
4381 msg(msglevel,
"Unknown management-external-key flag: %s", p[j]);
4394 else if (
streq(p[0],
"management-external-cert") && p[1] && !p[2])
4400 else if (
streq(p[0],
"management-client-auth") && !p[1])
4405 else if (
streq(p[0],
"management-log-cache") && p[1] && !p[2])
4409 p[0], 1, INT_MAX, msglevel))
4416 else if (
streq(p[0],
"plugin") && p[1])
4425 msg(msglevel,
"plugin add failed: %s", p[1]);
4430 else if (
streq(p[0],
"mode") && p[1] && !p[2])
4433 if (
streq(p[1],
"p2p"))
4437 else if (
streq(p[1],
"server"))
4443 msg(msglevel,
"Bad --mode parameter: %s", p[1]);
4447 else if (
streq(p[0],
"dev") && p[1] && !p[2])
4452 else if (
streq(p[0],
"dev-type") && p[1] && !p[2])
4458 else if (
streq(p[0],
"windows-driver") && p[1] && !p[2])
4462 "DEPRECATED OPTION: windows-driver: In OpenVPN 2.7, the default Windows driver is ovpn-dco. "
4463 "If incompatible options are used, OpenVPN will fall back to tap-windows6. Wintun support has been removed.");
4466 else if (
streq(p[0],
"disable-dco"))
4470 else if (
streq(p[0],
"dev-node") && p[1] && !p[2])
4475 else if (
streq(p[0],
"lladdr") && p[1] && !p[2])
4484 msg(msglevel,
"lladdr parm '%s' must be a MAC address", p[1]);
4488 else if (
streq(p[0],
"topology") && p[1] && !p[2])
4493 else if (
streq(p[0],
"tun-ipv6") && !p[1])
4498 "Note: option tun-ipv6 is ignored because modern operating systems do not need special IPv6 tun handling anymore.");
4501#ifdef ENABLE_IPROUTE
4502 else if (
streq(p[0],
"iproute") && p[1] && !p[2])
4505 iproute_path = p[1];
4508 else if (
streq(p[0],
"ifconfig") && p[1] && p[2] && !p[3])
4519 msg(msglevel,
"ifconfig parms '%s' and '%s' must be valid addresses", p[1], p[2]);
4523 else if (
streq(p[0],
"ifconfig-ipv6") && p[1] && p[2] && !p[3])
4525 unsigned int netbits;
4530 if (netbits < 64 || netbits > 124)
4532 msg(msglevel,
"ifconfig-ipv6: /netbits must be between 64 and 124, not '/%u'",
4543 msg(msglevel,
"ifconfig-ipv6 parms '%s' and '%s' must be valid addresses", p[1], p[2]);
4547 else if (
streq(p[0],
"ifconfig-noexec") && !p[1])
4552 else if (
streq(p[0],
"ifconfig-nowarn") && !p[1])
4557 else if (
streq(p[0],
"local") && p[1] && !p[4])
4569 if (strcmp(p[1],
"*") != 0)
4584 else if (
streq(p[0],
"remote-random") && !p[1])
4589 else if (
streq(p[0],
"connection") && p[1] && !p[3])
4600 option_types_found, es);
4604 "Each 'connection' block must contain exactly one 'remote' directive");
4620 else if (
streq(p[0],
"ignore-unknown-option") && p[1])
4625 const char **ignore;
4629 for (i = 1; p[i]; i++)
4649 for (j = 1; p[j]; j++)
4652 if (p[j][0] ==
'-' && p[j][1] ==
'-')
4665#if ENABLE_MANAGEMENT
4666 else if (
streq(p[0],
"http-proxy-override") && p[1] && p[2] && !p[4])
4676 else if (
streq(p[0],
"remote") && p[1] && !p[4])
4694 msg(msglevel,
"remote: bad protocol associated with host %s: '%s'", p[1], p[3]);
4715 else if (
streq(p[0],
"resolv-retry") && p[1] && !p[2])
4718 if (
streq(p[1],
"infinite"))
4727 else if ((
streq(p[0],
"preresolve") ||
streq(p[0],
"ip-remote-hint")) && !p[2])
4738 else if (
streq(p[0],
"connect-retry") && p[1] && !p[3])
4749 msg(
M_WARN,
"connect retry wait interval truncated to %d",
4759 else if ((
streq(p[0],
"connect-timeout") ||
streq(p[0],
"server-poll-timeout")) && p[1]
4765 else if (
streq(p[0],
"connect-retry-max") && p[1] && !p[2])
4770 else if (
streq(p[0],
"ipchange") && p[1])
4780 else if (
streq(p[0],
"float") && !p[1])
4786 else if (
streq(p[0],
"gremlin") && p[1] && !p[2])
4792 else if (
streq(p[0],
"chroot") && p[1] && !p[2])
4797 else if (
streq(p[0],
"cd") && p[1] && !p[2])
4802 msg(
M_ERR,
"cd to '%s' failed", p[1]);
4807#ifdef ENABLE_SELINUX
4808 else if (
streq(p[0],
"setcon") && p[1] && !p[2])
4811 options->selinux_context = p[1];
4814 else if (
streq(p[0],
"writepid") && p[1] && !p[2])
4819 else if (
streq(p[0],
"up") && p[1])
4828 else if (
streq(p[0],
"down") && p[1])
4837 else if (
streq(p[0],
"down-pre") && !p[1])
4842 else if (
streq(p[0],
"up-delay") && !p[1])
4847 else if (
streq(p[0],
"up-restart") && !p[1])
4852 else if (
streq(p[0],
"syslog") && !p[2])
4857 else if (
streq(p[0],
"daemon") && !p[2])
4871 "WARNING: Multiple --daemon directives specified, ignoring --daemon %s. (Note that initscripts sometimes add their own --daemon directive.)",
4877 else if (
streq(p[0],
"log") && p[1] && !p[2])
4883 else if (
streq(p[0],
"suppress-timestamps") && !p[1])
4889 else if (
streq(p[0],
"machine-readable-output") && !p[1])
4895 else if (
streq(p[0],
"log-append") && p[1] && !p[2])
4901 else if (
streq(p[0],
"mlock") && !p[1])
4906#if ENABLE_IP_PKTINFO
4907 else if (
streq(p[0],
"multihome") && !p[2])
4911 if (p[1] &&
streq(p[1],
"same-interface"))
4917 msg(msglevel,
"Unknown parameter to --multihome: %s", p[1]);
4921 else if (
streq(p[0],
"verb") && p[1] && !p[2])
4936 "NOTE: debug verbosity (--verb %d) is enabled but this build is "
4937 "built with --enable-small that lacks support for high --verb settings",
4942 else if (
streq(p[0],
"mute") && p[1] && !p[2])
4947 else if (
streq(p[0],
"errors-to-stderr") && !p[1])
4952 else if (
streq(p[0],
"status") && p[1] && !p[3])
4961 else if (
streq(p[0],
"status-version") && p[1] && !p[2])
4969 else if (
streq(p[0],
"remap-usr1") && p[1] && !p[2])
4972 if (
streq(p[1],
"SIGHUP"))
4976 else if (
streq(p[1],
"SIGTERM"))
4982 msg(msglevel,
"--remap-usr1 parm must be 'SIGHUP' or 'SIGTERM'");
4986 else if ((
streq(p[0],
"link-mtu") ||
streq(p[0],
"udp-mtu")) && p[1] && !p[2])
4992 else if (
streq(p[0],
"tun-mtu") && p[1] && !p[3])
5008 else if (
streq(p[0],
"tun-mtu-max") && p[1] && !p[2])
5013 else if (
streq(p[0],
"tun-mtu-extra") && p[1] && !p[2])
5021 else if (
streq(p[0],
"max-packet-size") && p[1] && !p[2])
5030 "Note: max-packet-size value outside of allowed "
5031 "control channel packet size (%d to %d), will use %d "
5041#ifdef ENABLE_FRAGMENT
5042 else if (
streq(p[0],
"mtu-dynamic"))
5045 msg(msglevel,
"--mtu-dynamic has been replaced by --fragment");
5048 else if (
streq(p[0],
"fragment") && p[1] && !p[3])
5056 if (p[2] &&
streq(p[2],
"mtu"))
5062 msg(msglevel,
"Unknown parameter to --fragment: %s", p[2]);
5066 else if (
streq(p[0],
"mtu-disc") && p[1] && !p[2])
5071 else if (
streq(p[0],
"mtu-test") && !p[1])
5076 else if (
streq(p[0],
"nice") && p[1] && !p[2])
5081 else if (
streq(p[0],
"rcvbuf") && p[1] && !p[2])
5086 else if (
streq(p[0],
"sndbuf") && p[1] && !p[2])
5091 else if (
streq(p[0],
"mark") && p[1] && !p[2])
5093#if defined(TARGET_LINUX)
5098 else if (
streq(p[0],
"socket-flags"))
5106 if (!
streq(p[j],
"TCP_NODELAY"))
5108 msg(msglevel,
"unknown socket flag: %s", p[j]);
5113 else if (
streq(p[0],
"bind-dev") && p[1])
5116 if (strlen(p[1]) < IFNAMSIZ)
5122 msg(msglevel,
"argument to --bind-dev is longer than allowed %d", IFNAMSIZ - 1);
5127 else if (
streq(p[0],
"txqueuelen") && p[1] && !p[2])
5133 msg(msglevel,
"--txqueuelen not supported on this OS");
5137 else if (
streq(p[0],
"shaper") && p[1] && !p[2])
5145 else if (
streq(p[0],
"port") && p[1] && !p[2])
5150 else if (
streq(p[0],
"lport") && p[1] && !p[2])
5155 if (!
streq(p[1],
"0"))
5161 else if (
streq(p[0],
"rport") && p[1] && !p[2])
5166 else if (
streq(p[0],
"bind") && !p[2])
5170 if (p[1] &&
streq(p[1],
"ipv6only"))
5175 else if (
streq(p[0],
"nobind") && !p[1])
5180 else if (
streq(p[0],
"fast-io") && !p[1])
5183 msg(
M_WARN,
"DEPRECATED OPTION: --fast-io option ignored.");
5185 else if (
streq(p[0],
"inactive") && p[1] && !p[3])
5195 "WARNING: '--inactive' with a 'bytes' value"
5196 " >2 Gbyte was silently ignored in older versions. If "
5197 " your VPN exits unexpectedly with 'Inactivity timeout'"
5198 " in %d seconds, revisit this value.",
5203 else if (
streq(p[0],
"session-timeout") && p[1] && !p[2])
5208 else if (
streq(p[0],
"proto") && p[1] && !p[2])
5215 msg(msglevel,
"Bad protocol: '%s'. Allowed protocols with --proto option: %s", p[1],
5222 else if (
streq(p[0],
"proto-force") && p[1] && !p[2])
5227 if (proto_force < 0)
5229 msg(msglevel,
"Bad --proto-force protocol: '%s'", p[1]);
5234 else if (
streq(p[0],
"http-proxy") && p[1] && !p[5])
5243 msg(msglevel,
"http-proxy port number not defined");
5257 if (
streq(p[3],
"auto"))
5261 else if (
streq(p[3],
"auto-nct"))
5281 else if (
streq(p[0],
"http-proxy-user-pass") && p[1])
5289 else if (
streq(p[0],
"http-proxy-retry") ||
streq(p[0],
"socks-proxy-retry") ||
streq(p[0],
"http-proxy-timeout"))
5292 msg(
M_WARN,
"DEPRECATED OPTION: %s option ignored.", p[0]);
5294 else if (
streq(p[0],
"http-proxy-option") && p[1] && !p[4])
5301 if (
streq(p[1],
"VERSION") && p[2] && !p[3])
5305 else if (
streq(p[1],
"AGENT") && p[2] && !p[3])
5309 else if ((
streq(p[1],
"EXT1") ||
streq(p[1],
"EXT2") ||
streq(p[1],
"CUSTOM-HEADER"))
5328 msg(msglevel,
"Cannot use more than %d http-proxy-option CUSTOM-HEADER : '%s'",
5335 custom_header->
name = p[2];
5336 custom_header->
content = p[3];
5341 msg(msglevel,
"Bad http-proxy-option or missing or extra parameter: '%s'", p[1]);
5344 else if (
streq(p[0],
"socks-proxy") && p[1] && !p[4])
5359 else if (
streq(p[0],
"keepalive") && p[1] && p[2] && !p[3])
5367 else if (
streq(p[0],
"ping") && p[1] && !p[2])
5373 else if (
streq(p[0],
"ping-exit") && p[1] && !p[2])
5380 else if (
streq(p[0],
"ping-restart") && p[1] && !p[2])
5387 else if (
streq(p[0],
"ping-timer-rem") && !p[1])
5392 else if (
streq(p[0],
"explicit-exit-notify") && !p[2])
5404 else if (
streq(p[0],
"persist-tun") && !p[1])
5409 else if (
streq(p[0],
"persist-key") && !p[1])
5412 msg(
M_WARN,
"DEPRECATED OPTION: --persist-key option ignored. "
5413 "Keys are now always persisted across restarts. ");
5415 else if (
streq(p[0],
"persist-local-ip") && !p[1])
5420 else if (
streq(p[0],
"persist-remote-ip") && !p[1])
5425 else if (
streq(p[0],
"client-nat") && p[1] && p[2] && p[3] && p[4] && !p[5])
5431 else if (
streq(p[0],
"route-table") && p[1] && !p[2])
5434 msg(
M_WARN,
"NOTE: --route-table is supported only on Linux when SITNL is built-in");
5439 else if (
streq(p[0],
"route") && p[1] && !p[5])
5449 else if (
streq(p[0],
"route-ipv6") && p[1] && !p[4])
5459 else if (
streq(p[0],
"max-routes") && !p[2])
5461 msg(
M_WARN,
"DEPRECATED OPTION: --max-routes option ignored.");
5463 else if (
streq(p[0],
"route-gateway") && p[1] && !p[2])
5466 if (
streq(p[1],
"dhcp"))
5479 msg(msglevel,
"route-gateway parm '%s' must be a valid address", p[1]);
5484 else if (
streq(p[0],
"route-ipv6-gateway") && p[1] && !p[2])
5492 msg(msglevel,
"route-ipv6-gateway parm '%s' must be a valid address", p[1]);
5496 else if (
streq(p[0],
"route-metric") && p[1] && !p[2])
5501 else if (
streq(p[0],
"route-delay") && !p[3])
5518 else if (
streq(p[0],
"route-up") && p[1])
5527 else if (
streq(p[0],
"route-pre-down") && p[1])
5536 else if (
streq(p[0],
"route-noexec") && !p[1])
5541 else if (
streq(p[0],
"route-nopull") && !p[1])
5546 else if (
streq(p[0],
"pull-filter") && p[1] && p[2] && !p[3])
5552 if (strcmp(
"accept", p[1]) == 0)
5556 else if (strcmp(
"ignore", p[1]) == 0)
5560 else if (strcmp(
"reject", p[1]) == 0)
5566 msg(msglevel,
"Unknown --pull-filter type: %s", p[1]);
5570 f->
size = strlen(p[2]);
5572 else if (
streq(p[0],
"allow-pull-fqdn") && !p[1])
5577 else if (
streq(p[0],
"redirect-gateway") ||
streq(p[0],
"redirect-private"))
5585 msg(
M_WARN,
"WARNING: You have specified redirect-gateway and "
5586 "redirect-private at the same time (or the same option "
5587 "multiple times). This is not well supported and may lead to "
5588 "unexpected results");
5593 if (
streq(p[0],
"redirect-gateway"))
5597 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
5599 if (
streq(p[j],
"local"))
5603 else if (
streq(p[j],
"autolocal"))
5607 else if (
streq(p[j],
"def1"))
5609#ifndef TARGET_ANDROID
5618 else if (
streq(p[j],
"bypass-dhcp"))
5622 else if (
streq(p[j],
"bypass-dns"))
5626 else if (
streq(p[j],
"block-local"))
5630 else if (
streq(p[j],
"ipv6"))
5635 else if (
streq(p[j],
"!ipv4"))
5641 msg(msglevel,
"unknown --%s flag: %s", p[0], p[j]);
5647 setenv_int(es,
"route_redirect_gateway_ipv4",
5652 setenv_int(es,
"route_redirect_gateway_ipv6",
5660 else if (
streq(p[0],
"block-ipv6") && !p[1])
5665 else if (
streq(p[0],
"remote-random-hostname") && !p[1])
5670 else if (
streq(p[0],
"setenv") && p[1] && !p[3])
5673 if (
streq(p[1],
"REMOTE_RANDOM_HOSTNAME") && !p[2])
5677 else if (
streq(p[1],
"GENERIC_CONFIG"))
5679 msg(msglevel,
"this is a generic configuration and cannot directly be used");
5682 else if (
streq(p[1],
"PUSH_PEER_INFO") && !p[2])
5686 else if (
streq(p[1],
"SERVER_POLL_TIMEOUT") && p[2])
5692 if (
streq(p[1],
"FORWARD_COMPATIBLE") && p[2] &&
streq(p[2],
"1"))
5699 else if (
streq(p[0],
"compat-mode") && p[1] && !p[3])
5701 unsigned int major, minor, patch;
5702 if (!(sscanf(p[1],
"%u.%u.%u", &major, &minor, &patch) == 3))
5704 msg(msglevel,
"cannot parse version number for --compat-mode: %s", p[1]);
5710 else if (
streq(p[0],
"setenv-safe") && p[1] && !p[3])
5715 else if (
streq(p[0],
"script-security") && p[1] && !p[2])
5724 else if (
streq(p[0],
"mssfix") && !p[3])
5754 if (p[2] &&
streq(p[2],
"mtu"))
5758 else if (p[2] &&
streq(p[2],
"fixed"))
5764 msg(msglevel,
"Unknown parameter to --mssfix: %s", p[2]);
5767 else if (
streq(p[0],
"disable-occ") && !p[1])
5772 else if (
streq(p[0],
"server") && p[1] && p[2] && !p[4])
5781 if (error || !network || !netmask)
5783 msg(msglevel,
"error parsing --server parameters");
5792 if (
streq(p[3],
"nopool"))
5798 msg(msglevel,
"error parsing --server: %s is not a recognized flag", p[3]);
5803 else if (
streq(p[0],
"server-ipv6") && p[1] && !p[2])
5806 struct in6_addr network;
5807 unsigned int netbits = 0;
5812 msg(msglevel,
"error parsing --server-ipv6 parameter");
5815 if (netbits < 64 || netbits > 124)
5817 msg(msglevel,
"--server-ipv6 settings: network must be between /64 and /124 (not /%u)",
5826 else if (
streq(p[0],
"server-bridge") && p[1] && p[2] && p[3] && p[4] && !p[5])
5830 in_addr_t ip, netmask, pool_start, pool_end;
5837 if (error || !ip || !netmask || !pool_start || !pool_end)
5839 msg(msglevel,
"error parsing --server-bridge parameters");
5848 else if (
streq(p[0],
"server-bridge") && p[1] &&
streq(p[1],
"nogw") && !p[2])
5854 else if (
streq(p[0],
"server-bridge") && !p[1])
5859 else if (
streq(p[0],
"push") && p[1] && !p[2])
5864 else if (
streq(p[0],
"push-reset") && !p[1])
5869 else if (
streq(p[0],
"push-remove") && p[1] && !p[2])
5875 else if (
streq(p[0],
"ifconfig-pool") && p[1] && p[2] && !p[4])
5890 msg(msglevel,
"error parsing --ifconfig-pool parameters");
5906 else if (
streq(p[0],
"ifconfig-pool-persist") && p[1] && !p[3])
5915 else if (
streq(p[0],
"ifconfig-ipv6-pool") && p[1] && !p[2])
5918 struct in6_addr network;
5919 unsigned int netbits = 0;
5924 msg(msglevel,
"error parsing --ifconfig-ipv6-pool parameters");
5927 if (netbits < 64 || netbits > 124)
5930 "--ifconfig-ipv6-pool settings: network must be between /64 and /124 (not /%u)",
5939 else if (
streq(p[0],
"hash-size") && p[1] && p[2] && !p[4])
5945 || !
atoi_constrained(p[2], &
virtual,
"hash-size virtual", 1, INT_MAX, msglevel))
5962 else if (
streq(p[0],
"connect-freq") && p[1] && p[2] && !p[3])
5967 if (!
atoi_constrained(p[1], &cf_max,
"connect-freq n", 1, INT_MAX, msglevel)
5968 || !
atoi_constrained(p[2], &cf_per,
"connect-freq seconds", 1, INT_MAX, msglevel))
5975 else if (
streq(p[0],
"connect-freq-initial") && p[1] && p[2] && !p[3])
5980 if (!
atoi_constrained(p[1], &cf_max,
"connect-freq-initial n", 1, INT_MAX, msglevel)
5981 || !
atoi_constrained(p[2], &cf_per,
"connect-freq-initial seconds", 1, INT_MAX, msglevel))
5988 else if (
streq(p[0],
"max-clients") && p[1] && !p[2])
5996 else if (
streq(p[0],
"max-routes-per-client") && p[1] && !p[2])
6001 else if (
streq(p[0],
"client-cert-not-required") && !p[1])
6005 "REMOVED OPTION: --client-cert-not-required, use '--verify-client-cert none' instead");
6007 else if (
streq(p[0],
"verify-client-cert") && !p[2])
6016 if (
streq(p[1],
"none"))
6020 else if (
streq(p[1],
"optional"))
6024 else if (!
streq(p[1],
"require"))
6027 "parameter to --verify-client-cert must be 'none', 'optional' or 'require'");
6032 else if (
streq(p[0],
"username-as-common-name") && !p[1])
6037 else if (
streq(p[0],
"auth-user-pass-optional") && !p[1])
6042 else if (
streq(p[0],
"opt-verify") && !p[1])
6045 msg(
M_INFO,
"DEPRECATED OPTION: --opt-verify was removed in OpenVPN 2.7.");
6047 else if (
streq(p[0],
"auth-user-pass-verify") && p[1])
6056 if (
streq(p[2],
"via-env"))
6060 else if (
streq(p[2],
"via-file"))
6067 "second parm to --auth-user-pass-verify must be 'via-env' or 'via-file'");
6074 "--auth-user-pass-verify requires a second parameter ('via-env' or 'via-file')");
6078 "auth-user-pass-verify",
true);
6080 else if (
streq(p[0],
"auth-gen-token"))
6086 for (
int i = 2; i <
MAX_PARMS && p[i] != NULL; i++)
6093 else if (
streq(p[i],
"external-auth"))
6099 msg(msglevel,
"Invalid argument to auth-gen-token: %s (%d)", p[i], i);
6103 else if (
streq(p[0],
"auth-gen-token-secret") && p[1] && !p[2])
6109 else if (
streq(p[0],
"client-connect") && p[1])
6118 else if (
streq(p[0],
"client-crresponse") && p[1])
6128 else if (
streq(p[0],
"client-disconnect") && p[1])
6138 else if (
streq(p[0],
"learn-address") && p[1])
6147 else if (
streq(p[0],
"tmp-dir") && p[1] && !p[2])
6152 else if (
streq(p[0],
"client-config-dir") && p[1] && !p[2])
6157 else if (
streq(p[0],
"ccd-exclusive") && !p[1])
6162 else if (
streq(p[0],
"bcast-buffers") && p[1] && !p[2])
6167 else if (
streq(p[0],
"tcp-queue-limit") && p[1] && !p[2])
6173 else if (
streq(p[0],
"port-share") && p[1] && p[2] && !p[4])
6176 options->port_share_host = p[1];
6177 options->port_share_port = p[2];
6178 options->port_share_journal_dir = p[3];
6181 else if (
streq(p[0],
"client-to-client") && !p[1])
6186 else if (
streq(p[0],
"duplicate-cn") && !p[1])
6191 else if (
streq(p[0],
"iroute") && p[1] && !p[3])
6196 else if (
streq(p[0],
"iroute-ipv6") && p[1] && !p[2])
6201 else if (
streq(p[0],
"ifconfig-push") && p[1] && p[2] && !p[4])
6208 if (local && remote_netmask)
6221 msg(msglevel,
"cannot parse --ifconfig-push addresses");
6225 else if (
streq(p[0],
"ifconfig-push-constraint") && p[1] && p[2] && !p[3])
6232 if (network && netmask)
6240 msg(msglevel,
"cannot parse --ifconfig-push-constraint addresses");
6244 else if (
streq(p[0],
"ifconfig-ipv6-push") && p[1] && !p[3])
6246 struct in6_addr local, remote;
6247 unsigned int netbits;
6253 msg(msglevel,
"cannot parse --ifconfig-ipv6-push addresses");
6261 msg(msglevel,
"cannot parse --ifconfig-ipv6-push addresses");
6271 "second argument to --ifconfig-ipv6-push missing and no global --ifconfig-ipv6 address set");
6282 else if (
streq(p[0],
"disable") && !p[1])
6287 else if (
streq(p[0],
"override-username") && p[1] && !p[2])
6293 "override-username exceeds the maximum length of %d "
6306 else if (
streq(p[0],
"tcp-nodelay") && !p[1])
6311 else if (
streq(p[0],
"stale-routes-check") && p[1] && !p[3])
6313 int ageing_time, check_interval;
6316 if (!
atoi_constrained(p[1], &ageing_time,
"stale-routes-check age", 1, INT_MAX, msglevel))
6324 "stale-routes-check interval", 1, INT_MAX, msglevel))
6331 check_interval = ageing_time;
6338 else if (
streq(p[0],
"client") && !p[1])
6343 else if (
streq(p[0],
"pull") && !p[1])
6348 else if (
streq(p[0],
"push-continuation") && p[1] && !p[2])
6353 else if (
streq(p[0],
"auth-user-pass") && !p[2])
6357 if (p[1] &&
streq(p[1],
"username-only"))
6372 else if (
streq(p[0],
"auth-retry") && p[1] && !p[2])
6377#ifdef ENABLE_MANAGEMENT
6378 else if (
streq(p[0],
"static-challenge") && p[1] && p[2] && !p[4])
6382 if (
boolean_flag(p[2],
"static-challenge echo", msglevel))
6386 if (p[3] &&
streq(p[3],
"concat"))
6390 else if (p[3] && !
streq(p[3],
"scrv1"))
6392 msg(msglevel,
"--static-challenge: unknown format indicator '%s'", p[3]);
6397 else if (
streq(p[0],
"msg-channel") && p[1])
6401 HANDLE process = GetCurrentProcess();
6402 HANDLE handle = (HANDLE)((intptr_t)atoll(p[1]));
6404 DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))
6406 msg(msglevel,
"could not duplicate service pipe handle");
6411 msg(msglevel,
"--msg-channel is only supported on Windows");
6416 else if (
streq(p[0],
"win-sys") && p[1] && !p[2])
6419 if (
streq(p[1],
"env"))
6421 msg(
M_INFO,
"NOTE: --win-sys env is default from OpenVPN 2.3. "
6422 "This entry will now be ignored. "
6423 "Please remove this entry from your configuration file.");
6430 else if (
streq(p[0],
"route-method") && p[1] && !p[2])
6433 if (
streq(p[1],
"adaptive"))
6437 else if (
streq(p[1],
"ipapi"))
6441 else if (
streq(p[1],
"exe"))
6447 msg(msglevel,
"--route method must be 'adaptive', 'ipapi', or 'exe'");
6451 else if (
streq(p[0],
"ip-win32") && p[1] && !p[4])
6460 msg(msglevel,
"Bad --ip-win32 method: '%s'. Allowed methods: %s", p[1],
6474 if (!
streq(p[2],
"default"))
6478 if (!
atoi_constrained(p[2], &offset,
"ip-win32 offset", -256, 256, msglevel))
6489 "ip-win32 lease time", 30, INT_MAX, msglevel))
6500 else if (
streq(p[0],
"dns-updown") && p[1])
6508 if (
streq(p[1],
"disable"))
6513 else if (
streq(p[1],
"force"))
6518 dns->
updown = DEFAULT_DNS_UPDOWN;
6533 else if (
streq(p[0],
"dns") && p[1])
6541 else if (
streq(p[0],
"dhcp-option") && p[1])
6544#if defined(_WIN32) || defined(TARGET_ANDROID)
6549 bool dhcp_optional =
false;
6551 if ((
streq(p[1],
"DOMAIN") ||
streq(p[1],
"ADAPTER_DOMAIN_SUFFIX")) && p[2] && !p[3])
6555 msg(msglevel,
"--dhcp-option %s contains invalid characters", p[1]);
6559 dhcp->domain = p[2];
6560 dhcp_optional =
true;
6562 else if (
streq(p[1],
"DOMAIN-SEARCH") && p[2] && !p[3])
6566 msg(msglevel,
"--dhcp-option %s contains invalid characters", p[1]);
6572 dhcp->domain_search_list[
dhcp->domain_search_list_len++] = p[2];
6576 msg(msglevel,
"--dhcp-option %s: maximum of %d search entries can be specified",
6579 dhcp_optional =
true;
6581 else if ((
streq(p[1],
"DNS") ||
streq(p[1],
"DNS6")) && p[2] && !p[3]
6584 if (strstr(p[2],
":"))
6591 dhcp_optional =
true;
6594#if defined(_WIN32) || defined(TARGET_ANDROID)
6595 else if (
streq(p[1],
"NBS") && p[2] && !p[3])
6600 else if (
streq(p[1],
"NBT") && p[2] && !p[3])
6603 if (!(t == 1 || t == 2 || t == 4 || t == 8))
6605 msg(msglevel,
"--dhcp-option NBT: parameter (%d) must be 1, 2, 4, or 8", t);
6611 else if (
streq(p[1],
"WINS") && p[2] && !p[3])
6616 else if (
streq(p[1],
"NTP") && p[2] && !p[3])
6621 else if (
streq(p[1],
"NBDD") && p[2] && !p[3])
6626 else if (
streq(p[1],
"DISABLE-NBT") && !p[2])
6631#if defined(TARGET_ANDROID)
6632 else if (
streq(p[1],
"PROXY_HTTP") && p[3] && !p[4])
6635 o->http_proxy = p[2];
6640 msg(msglevel,
"--dhcp-option: unknown option type '%s' or missing or unknown parameter",
6645 setenv_foreign_option(
options, p[1], p[2], es);
6650#if defined(_WIN32) || defined(TARGET_ANDROID)
6656 else if (
streq(p[0],
"show-adapters") && !p[1])
6662 else if (
streq(p[0],
"show-net") && !p[1])
6669 else if (
streq(p[0],
"show-net-up") && !p[1])
6674 else if (
streq(p[0],
"tap-sleep") && p[1] && !p[2])
6682 else if (
streq(p[0],
"dhcp-renew") && !p[1])
6687 else if (
streq(p[0],
"dhcp-pre-release") && !p[1])
6693 else if (
streq(p[0],
"dhcp-release") && !p[1])
6695 msg(
M_WARN,
"Obsolete option --dhcp-release detected. This is now on by default");
6697 else if (
streq(p[0],
"dhcp-internal") && p[1] && !p[2])
6699 unsigned int adapter_index;
6702 adapter_index =
atou(p[1]);
6714 else if (
streq(p[0],
"register-dns") && !p[1])
6719 else if (
streq(p[0],
"block-outside-dns") && !p[1])
6724 else if (
streq(p[0],
"rdns-internal") && !p[1])
6740 else if (
streq(p[0],
"show-valid-subnets") && !p[1])
6746 else if (
streq(p[0],
"pause-exit") && !p[1])
6751 else if (
streq(p[0],
"service") && p[1] && !p[3])
6760 else if (
streq(p[0],
"allow-nonadmin") && !p[2])
6766 else if (
streq(p[0],
"user") && p[1] && !p[2])
6769 msg(
M_WARN,
"NOTE: --user option is not implemented on Windows");
6771 else if (
streq(p[0],
"group") && p[1] && !p[2])
6774 msg(
M_WARN,
"NOTE: --group option is not implemented on Windows");
6777 else if (
streq(p[0],
"user") && p[1] && !p[2])
6782 else if (
streq(p[0],
"group") && p[1] && !p[2])
6787 else if (
streq(p[0],
"dhcp-option") && p[1] && !p[3])
6790 setenv_foreign_option(
options, p[1], p[2], es);
6792 else if (
streq(p[0],
"route-method") && p[1] && !p[2])
6798#if PASSTOS_CAPABILITY
6799 else if (
streq(p[0],
"passtos") && !p[1])
6805 else if (
streq(p[0],
"allow-compression") && p[1] && !p[2])
6809 if (
streq(p[1],
"no"))
6814 msg(msglevel,
"'--allow-compression no' conflicts with "
6815 " enabling compression");
6822 "Cannot set allow-compression to '%s' "
6823 "after set to 'no'",
6827 else if (
streq(p[1],
"asym"))
6831 else if (
streq(p[1],
"yes"))
6834 "DEPRECATED OPTION: \"--allow-compression yes\" has been removed. "
6835 "We will use \"asym\" mode instead. See the manual page for more information.");
6842 "bad allow-compression option: %s -- "
6843 "must be 'yes', 'no', or 'asym'",
6848 else if (
streq(p[0],
"comp-lzo") && !p[2])
6858 if (
streq(p[1],
"no"))
6866 else if (!(
streq(p[1],
"yes") ||
streq(p[1],
"adaptive")))
6868 msg(msglevel,
"bad comp-lzo option: %s -- must be 'yes', 'no', or 'adaptive'",
6875 else if (
streq(p[0],
"comp-noadapt") && !p[1])
6879 else if (
streq(p[0],
"compress") && !p[2])
6882 const char *alg =
"stub";
6888 if (
streq(alg,
"stub"))
6893 else if (
streq(alg,
"stub-v2"))
6898 else if (
streq(alg,
"migrate"))
6903 else if (
streq(alg,
"lzo"))
6908 else if (
streq(alg,
"lz4"))
6913 else if (
streq(alg,
"lz4-v2"))
6919 msg(msglevel,
"bad comp option: %s", alg);
6925 else if (
streq(p[0],
"show-ciphers") && !p[1])
6930 else if (
streq(p[0],
"show-digests") && !p[1])
6935 else if (
streq(p[0],
"show-engines") && !p[1])
6940 else if (
streq(p[0],
"key-direction") && p[1] && !p[2])
6947 if (key_direction >= 0)
6963 else if (
streq(p[0],
"secret") && p[1] && !p[3])
6965 msg(
M_WARN,
"DEPRECATED OPTION: The option --secret is deprecated.");
6969 if (!is_inline && p[2])
6974 if (key_direction >= 0)
6984 else if (
streq(p[0],
"allow-deprecated-insecure-static-crypto"))
6989 else if (
streq(p[0],
"genkey") && !p[4])
6999 if (
streq(p[1],
"secret") ||
streq(p[1],
"tls-auth") ||
streq(p[1],
"tls-crypt"))
7003 else if (
streq(p[1],
"tls-crypt-v2-server"))
7007 else if (
streq(p[1],
"tls-crypt-v2-client"))
7015 else if (
streq(p[1],
"auth-token"))
7021 msg(msglevel,
"unknown --genkey type: %s", p[1]);
7029 else if (
streq(p[0],
"auth") && p[1] && !p[2])
7034 else if (
streq(p[0],
"cipher") && p[1] && !p[2])
7039 else if (
streq(p[0],
"data-ciphers-fallback") && p[1] && !p[2])
7045 else if ((
streq(p[0],
"data-ciphers") ||
streq(p[0],
"ncp-ciphers")) && p[1] && !p[2])
7048 if (
streq(p[0],
"ncp-ciphers"))
7050 msg(
M_INFO,
"Note: Treating option '--ncp-ciphers' as "
7051 " '--data-ciphers' (renamed in OpenVPN 2.5).");
7055 else if (
streq(p[0],
"key-derivation") && p[1])
7060 if (
streq(p[1],
"tls-ekm"))
7066 msg(msglevel,
"Unknown key-derivation method %s", p[1]);
7069 else if (
streq(p[0],
"protocol-flags") && p[1])
7075 for (
size_t j = 1; j <
MAX_PARMS && p[j] != NULL; j++)
7077 if (
streq(p[j],
"cc-exit"))
7081 else if (
streq(p[j],
"tls-ekm"))
7085 else if (
streq(p[j],
"dyn-tls-crypt"))
7089 else if (
streq(p[j],
"aead-epoch"))
7095 msg(msglevel,
"Unknown protocol-flags flag: %s", p[j]);
7099 else if (
streq(p[0],
"force-tls-key-material-export"))
7104 else if (
streq(p[0],
"app-custom-control") && p[1] && !p[2])
7109 msg(msglevel,
"App custom control protocols must only contain "
7110 "alphanumeric characters, '-', and '_'.");
7115 else if (
streq(p[0],
"custom-control") && p[1] && p[2] && p[3] && !p[4])
7125 msg(msglevel,
"App custom control list from server contains "
7126 "unsupported protocols");
7132 if (!
streq(p[2],
"6:A") && !
streq(p[2],
"A:6"))
7134 msg(msglevel,
"App custom control encoding must be base64 and ascii");
7145 else if (
streq(p[0],
"prng") && p[1] && !p[3])
7147 msg(
M_WARN,
"NOTICE: --prng option ignored (SSL library PRNG is used)");
7149 else if (
streq(p[0],
"no-replay") && !p[1])
7153 msg(
M_FATAL,
"--no-replay was removed in OpenVPN 2.7. "
7154 "Update your configuration.");
7156 else if (
streq(p[0],
"replay-window") && !p[3])
7178 msg(msglevel,
"replay-window option is missing window size parameter");
7182 else if (
streq(p[0],
"mute-replay-warnings") && !p[1])
7187 else if (
streq(p[0],
"replay-persist") && p[1] && !p[2])
7192 else if (
streq(p[0],
"test-crypto") && !p[1])
7197#ifndef ENABLE_CRYPTO_MBEDTLS
7198 else if (
streq(p[0],
"engine") && !p[2])
7211 else if (
streq(p[0],
"providers") && p[1])
7213 for (
size_t j = 1; j <
MAX_PARMS && p[j] != NULL; j++)
7218 else if (
streq(p[0],
"show-tls") && !p[1])
7223 else if ((
streq(p[0],
"show-curves") ||
streq(p[0],
"show-groups")) && !p[1])
7228 else if (
streq(p[0],
"ecdh-curve") && p[1] && !p[2])
7231 msg(
M_WARN,
"Consider setting groups/curves preference with "
7232 "tls-groups instead of forcing a specific curve with "
7236 else if (
streq(p[0],
"tls-server") && !p[1])
7241 else if (
streq(p[0],
"tls-client") && !p[1])
7246 else if (
streq(p[0],
"ca") && p[1] && !p[2])
7252#ifndef ENABLE_CRYPTO_MBEDTLS
7253 else if (
streq(p[0],
"capath") && p[1] && !p[2])
7259 else if (
streq(p[0],
"dh") && p[1] && !p[2])
7265 else if (
streq(p[0],
"cert") && p[1] && !p[2])
7271 else if (
streq(p[0],
"extra-certs") && p[1] && !p[2])
7277 else if ((
streq(p[0],
"verify-hash") && p[1] && !p[3])
7278 || (
streq(p[0],
"peer-fingerprint") && p[1] && !p[2]))
7282 int verify_hash_depth = 0;
7283 if (
streq(p[0],
"verify-hash"))
7285 msg(
M_WARN,
"DEPRECATED OPTION: The option --verify-hash is deprecated. "
7286 "You should switch to the either use the level 1 certificate as "
7287 "--ca option, use --tls-verify or use --peer-fingerprint");
7289 verify_hash_depth = 1;
7299 "ERROR: Setting %s not allowed. --verify-hash and"
7300 " --peer-fingerprint are mutually exclusive",
7305 if (
streq(p[0],
"verify-hash"))
7307 if ((!p[2] && !is_inline) || (p[2] &&
streq(p[2],
"SHA1")))
7312 else if (p[2] && !
streq(p[2],
"SHA256"))
7315 "invalid or unsupported hashing algorithm: %s "
7316 "(only SHA1 and SHA256 are supported)",
7336 while (listend->
next)
7338 listend = listend->
next;
7340 listend->
next = newlist;
7343#if defined(ENABLE_CRYPTOAPI) && defined(HAVE_XKEY_PROVIDER)
7344 else if (
streq(p[0],
"cryptoapicert") && p[1] && !p[2])
7350 else if (
streq(p[0],
"key") && p[1] && !p[2])
7356 else if (
streq(p[0],
"tls-version-min") && p[1] && !p[3])
7362 msg(msglevel,
"unknown tls-version-min parameter: %s", p[1]);
7366#ifdef ENABLE_CRYPTO_MBEDTLS
7369 msg(
M_WARN,
"--tls-version-min %s is not supported by mbedtls, using 1.2", p[1]);
7377 else if (
streq(p[0],
"tls-version-max") && p[1] && !p[2])
7383 msg(msglevel,
"unknown tls-version-max parameter: %s", p[1]);
7389#ifndef ENABLE_CRYPTO_MBEDTLS
7390 else if (
streq(p[0],
"pkcs12") && p[1] && !p[2])
7397 else if (
streq(p[0],
"askpass") && !p[2])
7409 else if (
streq(p[0],
"auth-nocache") && !p[1])
7414 else if (
streq(p[0],
"auth-token") && p[1] && !p[2])
7418#ifdef ENABLE_MANAGEMENT
7425 else if (
streq(p[0],
"auth-token-user") && p[1] && !p[2])
7430 else if (
streq(p[0],
"single-session") && !p[1])
7435 else if (
streq(p[0],
"push-peer-info") && !p[1])
7440 else if (
streq(p[0],
"tls-exit") && !p[1])
7445 else if (
streq(p[0],
"tls-cipher") && p[1] && !p[2])
7450 else if (
streq(p[0],
"tls-cert-profile") && p[1] && !p[2])
7455 else if (
streq(p[0],
"tls-ciphersuites") && p[1] && !p[2])
7460 else if (
streq(p[0],
"tls-groups") && p[1] && !p[2])
7465 else if (
streq(p[0],
"crl-verify") && p[1] && ((p[2] &&
streq(p[2],
"dir")) || !p[2]))
7468 if (p[2] &&
streq(p[2],
"dir"))
7475 else if (
streq(p[0],
"tls-verify") && p[1])
7485 else if (
streq(p[0],
"tls-export-cert") && p[1] && !p[2])
7490 else if (
streq(p[0],
"compat-names"))
7493 msg(msglevel,
"--compat-names was removed in OpenVPN 2.5. "
7494 "Update your configuration.");
7497 else if (
streq(p[0],
"no-name-remapping") && !p[1])
7500 msg(msglevel,
"--no-name-remapping was removed in OpenVPN 2.5. "
7501 "Update your configuration.");
7504 else if (
streq(p[0],
"verify-x509-name") && p[1] && strlen(p[1]) && !p[3])
7510 if (
streq(p[2],
"subject"))
7514 else if (
streq(p[2],
"name"))
7518 else if (
streq(p[2],
"name-prefix"))
7524 msg(msglevel,
"unknown X.509 name type: %s", p[2]);
7531 else if (
streq(p[0],
"ns-cert-type") && p[1] && !p[2])
7533#ifdef ENABLE_CRYPTO_MBEDTLS
7534 msg(msglevel,
"--ns-cert-type is not available with mbedtls.");
7538 if (
streq(p[1],
"server"))
7542 else if (
streq(p[1],
"client"))
7548 msg(msglevel,
"--ns-cert-type must be 'client' or 'server'");
7553 else if (
streq(p[0],
"remote-cert-ku"))
7558 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
7568 else if (
streq(p[0],
"remote-cert-eku") && p[1] && !p[2])
7573 else if (
streq(p[0],
"remote-cert-tls") && p[1] && !p[2])
7577 if (
streq(p[1],
"server"))
7582 else if (
streq(p[1],
"client"))
7589 msg(msglevel,
"--remote-cert-tls must be 'client' or 'server'");
7593 else if (
streq(p[0],
"tls-timeout") && p[1] && !p[2])
7605 else if (
streq(p[0],
"reneg-bytes") && p[1] && !p[2])
7613 else if (
streq(p[0],
"reneg-pkts") && p[1] && !p[2])
7621 else if (
streq(p[0],
"reneg-sec") && p[1] && !p[3])
7631 else if (
streq(p[0],
"debug-aead-usage-limit-override"))
7638 msg(
M_VERB0,
"Warning: --debug-aead-usage-limit-override should "
7639 "only be used by developers and in specific tests.");
7644 else if (
streq(p[0],
"hand-window") && p[1] && !p[2])
7649 else if (
streq(p[0],
"tran-window") && p[1] && !p[2])
7654 else if (
streq(p[0],
"tls-auth") && p[1] && !p[3])
7656 int key_direction = -1;
7665 if (!is_inline && p[2])
7668 if (key_direction < 0)
7681 if (!is_inline && p[2])
7684 if (key_direction < 0)
7692 else if (
streq(p[0],
"tls-crypt") && p[1] && !p[3])
7706 else if (
streq(p[0],
"tls-crypt-v2") && p[1] && !p[3])
7720 if (p[2] &&
streq(p[2],
"force-cookie"))
7724 else if (p[2] &&
streq(p[2],
"allow-noncookie"))
7730 msg(msglevel,
"Unsupported tls-crypt-v2 argument: %s", p[2]);
7733 else if (
streq(p[0],
"tls-crypt-v2-verify") && p[1] && !p[2])
7738 else if (
streq(p[0],
"tls-crypt-v2-max-age") && p[1])
7746 else if (
streq(p[0],
"x509-track") && p[1] && !p[2])
7751 else if (
streq(p[0],
"x509-username-field") && p[1])
7754 for (
size_t j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
7760 msg(msglevel,
"Unsupported x509-username-field extension: %s", s);
7766 else if (
streq(p[0],
"show-pkcs11-ids") && !p[3])
7768 const char *provider = p[1];
7769 bool cert_private = (p[2] == NULL ? false
7770 :
boolean_flag(p[2],
"show-pkcs11-ids private", msglevel));
7772#ifdef DEFAULT_PKCS11_MODULE
7775 provider = DEFAULT_PKCS11_MODULE;
7780 long i = strtol(provider, &endp, 10);
7786 provider = DEFAULT_PKCS11_MODULE;
7793 msg(msglevel,
"--show-pkcs11-ids requires a provider parameter");
7800 show_pkcs11_ids(provider, cert_private);
7803 else if (
streq(p[0],
"pkcs11-providers") && p[1])
7809 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
7811 options->pkcs11_providers[j - 1] = p[j];
7814 else if (
streq(p[0],
"pkcs11-protected-authentication"))
7818 for (
int j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
7820 options->pkcs11_protected_authentication[j - 1] =
7824 else if (
streq(p[0],
"pkcs11-private-mode") && p[1])
7830 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
7832 sscanf(p[j],
"%x", &(
options->pkcs11_private_mode[j - 1]));
7835 else if (
streq(p[0],
"pkcs11-cert-private"))
7839 for (
int j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
7844 else if (
streq(p[0],
"pkcs11-pin-cache") && p[1] && !p[2])
7849 else if (
streq(p[0],
"pkcs11-id") && p[1] && !p[2])
7854 else if (
streq(p[0],
"pkcs11-id-management") && !p[1])
7857 options->pkcs11_id_management =
true;
7860 else if (
streq(p[0],
"rmtun") && !p[1])
7866 else if (
streq(p[0],
"mktun") && !p[1])
7872 else if (
streq(p[0],
"peer-id") && p[1] && !p[2])
7878 else if (
streq(p[0],
"keying-material-exporter") && p[1] && p[2])
7882 if (strncmp(p[1],
"EXPORTER", 8))
7884 msg(msglevel,
"Keying material exporter label must begin with "
7895 p[0], 16, 4095, msglevel))
7902 else if (
streq(p[0],
"allow-recursive-routing") && !p[1])
7907 else if (
streq(p[0],
"vlan-tagging") && !p[1])
7912 else if (
streq(p[0],
"vlan-accept") && p[1] && !p[2])
7915 if (
streq(p[1],
"tagged"))
7919 else if (
streq(p[1],
"untagged"))
7923 else if (
streq(p[1],
"all"))
7929 msg(msglevel,
"--vlan-accept must be 'tagged', 'untagged' or 'all'");
7933 else if (
streq(p[0],
"vlan-pvid") && p[1] && !p[2])
7947 msglvl_t msglevel_unknown = msglevel_fc;
7954 msglevel_unknown =
M_WARN;
7960 msg(msglevel_unknown,
7961 "Unrecognized option or missing or extra parameter(s) in %s:%d: %s (%s)", file,
7962 line, p[0], PACKAGE_VERSION);
7966 msg(msglevel_unknown,
"Unrecognized option or missing or extra parameter(s): --%s (%s)",
7967 p[0], PACKAGE_VERSION);
7974#if defined(__GNUC__) || defined(__clang__)
7975#pragma GCC diagnostic pop
struct buffer get_list_intersection(struct gc_arena *gc, const char *list1, const char *list2)
Calculates the intersection of two list that are both separated by : Items in the result will have th...
void buf_clear(struct buffer *buf)
Zeroise and reset a buffer.
bool buf_printf(struct buffer *buf, const char *format,...)
printf-style append to a buffer with overflow check.
void gc_transfer(struct gc_arena *dest, struct gc_arena *src)
Move all allocations from one garbage collection arena to another.
bool string_class(const char *str, const unsigned int inclusive, const unsigned int exclusive)
Test whether all characters in a string satisfy a character class filter.
void * gc_realloc(void *ptr, size_t size, struct gc_arena *a)
allows to realloc a pointer previously allocated by gc_malloc or gc_realloc
bool string_defined_equal(const char *s1, const char *s2)
compare two strings which might be NULL, but NULL is never equal
void * gc_malloc(size_t size, bool clear, struct gc_arena *a)
Allocate memory and, optionally, zero it.
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
Allocate a buffer of the given size under garbage collection.
int string_array_len(const char **array)
Return the number of elements in a NULL-terminated array of strings.
struct buffer buffer_read_from_file(const char *filename, struct gc_arena *gc)
buffer_read_from_file - copy the content of a file into a buffer
char * string_substitute(const char *src, char from, char to, struct gc_arena *gc)
char * string_alloc(const char *str, struct gc_arena *gc)
Duplicate a string, allocating memory under garbage collection.
Buffer management functions and garbage collection.
static void gc_detach(struct gc_arena *a)
Detach all allocations from an arena without freeing them.
#define BSTR(buf)
Return the buffer content pointer cast to char *.
#define ALLOC_ARRAY_GC(dptr, type, n, gc)
Allocate a garbage-collected array of n elements of the given type.
#define streq(x, y)
helper to work around the semantics of the strcmp() return value
static bool buf_valid(const struct buffer *buf)
Return true iff buf is valid.
static void gc_init(struct gc_arena *a)
Initialise a garbage collection arena to an empty state.
static const char * buf_cstr(const struct buffer *buf)
Return the buffer content pointer cast to const char *.
static int buf_len(const struct buffer *buf)
Return the length of the buffer content.
#define ALLOC_OBJ_CLEAR_GC(dptr, type, gc)
Allocate and zero-initialise a garbage-collected object of the given type.
#define CC_UNDERBAR
underscore
#define ALLOC_OBJ_GC(dptr, type, gc)
Allocate a garbage-collected object of the given type (uninitialised).
static void gc_free(struct gc_arena *a)
Free all allocations in a garbage collection arena.
#define CC_ALNUM
alphanumeric isalnum()
static struct gc_arena gc_new(void)
Allocate and return a new, empty garbage collection arena.
bool check_cmd_access(const char *command, const char *opt, const char *chroot)
Verifies that the path in the "command" that comes after certain script options (e....
void options_postprocess_filechecks(struct options *options)
Sanity check of all file/dir options.
void add_client_nat_to_option_list(struct client_nat_option_list *dest, const char *type, const char *network, const char *netmask, const char *foreign_network, msglvl_t msglevel)
struct client_nat_option_list * new_client_nat_list(struct gc_arena *gc)
struct client_nat_option_list * clone_client_nat_option_list(const struct client_nat_option_list *src, struct gc_arena *gc)
void copy_client_nat_option_list(struct client_nat_option_list *dest, const struct client_nat_option_list *src)
#define TLS_CHANNEL_BUF_SIZE
#define TLS_CHANNEL_MTU_MIN
bool check_compression_settings_valid(const struct compress_options *info, msglvl_t msglevel)
Checks if the compression settings are valid.
#define COMP_F_ALLOW_STUB_ONLY
Only accept stub compression, even with COMP_F_ADVERTISE_STUBS_ONLY we still accept other compression...
#define COMP_F_SWAP
initial command byte is swapped with last byte in buffer to preserve payload alignment
#define COMP_ALG_LZ4
LZ4 algorithm.
#define COMP_F_ALLOW_NOCOMP_ONLY
Do not allow compression framing (breaks DCO).
#define COMP_F_ALLOW_ASYM
Compression was explicitly set to allow asymetric compression.
#define COMP_ALGV2_UNCOMPRESSED
#define COMP_ALG_STUB
support compression command byte and framing without actual compression
#define COMP_ALG_LZO
LZO algorithm.
#define COMP_F_ADVERTISE_STUBS_ONLY
tell server that we only support compression stubs
#define COMP_F_MIGRATE
push stub-v2 or comp-lzo no when we see a client with comp-lzo in occ
static bool comp_non_stub_enabled(const struct compress_options *info)
char * strsep(char **stringp, const char *delim)
int ascii2keydirection(msglvl_t msglevel, const char *str)
bool check_tls_prf_working(void)
Checks if the current TLS library supports the TLS 1.0 PRF with MD5+SHA1 that OpenVPN uses when TLS K...
Data Channel Cryptography Module.
#define CO_USE_TLS_KEY_MATERIAL_EXPORT
Bit-flag indicating that data channel key derivation is done using TLS keying material export [RFC570...
#define CO_USE_DYNAMIC_TLS_CRYPT
Bit-flag indicating that renegotiations are using tls-crypt with a TLS-EKM derived key.
#define CO_EPOCH_DATA_KEY_FORMAT
Bit-flag indicating the epoch the data format.
#define KEY_DIRECTION_BIDIRECTIONAL
#define CO_USE_CC_EXIT_NOTIFY
Bit-flag indicating that explicit exit notifies should be sent via the control channel instead of usi...
#define SHA_DIGEST_LENGTH
#define SHA256_DIGEST_LENGTH
static bool dco_check_startup_option(msglvl_t msglevel, const struct options *o)
static bool dco_check_option(msglvl_t msglevel, const struct options *o)
static const char * dco_version_string(struct gc_arena *gc)
bool dns_options_verify(msglvl_t msglevel, const struct dns_options *o)
Checks validity of DNS options.
void dns_options_postprocess_pull(struct dns_options *o)
Merges pulled DNS servers with static ones into an ordered list.
bool dns_server_addr_parse(struct dns_server *server, const char *addr)
Parses a string IPv4 or IPv6 address and optional colon separated port, into a in_addr or in6_addr re...
bool dns_domain_list_append(struct dns_domain **entry, char **domains, struct gc_arena *gc)
Appends safe DNS domain parameters to a linked list.
struct dns_server * dns_server_get(struct dns_server **entry, long priority, struct gc_arena *gc)
Find or create DNS server with priority in a linked list.
bool dns_server_priority_parse(long *priority, const char *str, bool pulled)
Parses a string DNS server priority and validates it.
struct dns_options clone_dns_options(const struct dns_options *o, struct gc_arena *gc)
Makes a deep copy of the passed DNS options.
void dns_options_preprocess_pull(struct dns_options *o)
Saves and resets the server options, so that pulled ones don't mix in.
static bool dns_updown_user_set(const struct dns_options *o)
Returns whether dns-updown is user defined.
static bool dns_updown_forced(const struct dns_options *o)
Returns whether dns-updown is forced to run.
static bool validate_domain(const char *domain)
void setenv_int(struct env_set *es, const char *name, int value)
void setenv_str_i(struct env_set *es, const char *name, const char *value, const int i)
void setenv_str(struct env_set *es, const char *name, const char *value)
const char * env_set_get(const struct env_set *es, const char *name)
void setenv_str_safe(struct env_set *es, const char *name, const char *value)
bool env_set_del(struct env_set *es, const char *str)
void setenv_long_long(struct env_set *es, const char *name, long long value)
Interface functions to the internal and external multiplexers.
#define RELIABLE_MAX_INITIAL_TIMEOUT
Maximum initial timeout (–tls-timeout) we accept.
void helper_setdefault_topology(struct options *o)
Set –topology default depending on –mode.
void helper_tcp_nodelay(struct options *o)
void helper_client_server(struct options *o)
void helper_keepalive(struct options *o)
static int max_int(int x, int y)
static int constrain_int(int x, int min, int max)
static int tls_verify(struct openvpn_plugin_args_func_in const *args)
void management_auth_token(const char *token)
void management_echo(struct management *man, const char *string, const bool pull)
#define MF_FORGET_DISCONNECT
#define MF_EXTERNAL_KEY_PKCS1PAD
#define MF_EXTERNAL_KEY_PSSPAD
#define MF_EXTERNAL_KEY_NOPADDING
#define MF_QUERY_PASSWORDS
#define MF_EXTERNAL_KEY_DIGEST
#define MF_CONNECT_AS_CLIENT
int translate_mtu_discover_type_name(const char *name)
#define TAP_MTU_EXTRA_DEFAULT
#define TUN_MTU_MAX
Maximum MTU we accept for MTU related options.
static bool learn_address_script(const struct multi_context *m, const struct multi_instance *mi, const char *op, const struct mroute_addr *addr)
static int net_ctx_init(const struct context *c, openvpn_net_ctx_t *ctx)
void errors_to_stderr(void)
void open_syslog(const char *pgmname, bool stdio_to_null)
void redirect_stdout_stderr(const char *file, bool append)
void openvpn_exit(const int status)
void set_suppress_timestamps(bool suppressed)
void set_machine_readable_output(bool parsable)
FILE * msg_fp(const msglvl_t flags)
bool set_debug_level(const int level, const unsigned int flags)
#define OPENVPN_EXIT_STATUS_USAGE
#define OPENVPN_EXIT_STATUS_GOOD
#define RESET_OPTION_ROUTES(option_ptr, field)
static void rol6_check_alloc(struct options *options)
static void options_postprocess_verify_ce(const struct options *options, const struct connection_entry *ce)
static void options_postprocess_mutate_ce(struct options *o, struct connection_entry *ce)
static void usage_version(void)
static struct pull_filter * alloc_pull_filter(struct options *o)
#define USAGE_VALID_SERVER_PROTOS
static void pre_connect_save(struct options *o)
static void setenv_connection_entry(struct env_set *es, const struct connection_entry *e, const int i)
static int global_auth_retry
bool options_postprocess_pull(struct options *o, struct env_set *es)
void remove_option(struct context *c, struct options *options, char *p[], bool is_inline, const char *file, int line, const msglvl_t msglevel, const uint64_t permission_mask, uint64_t *option_types_found, struct env_set *es)
Resets options found in the PUSH_UPDATE message that are preceded by the - flag.
void uninit_options(struct options *o)
static void connection_entry_load_re(struct connection_entry *ce, const struct remote_entry *re)
int parse_topology(const char *str, const msglvl_t msglevel)
void show_windows_version(const unsigned int flags)
#define VERIFY_PERMISSION(mask)
bool key_is_external(const struct options *options)
static void check_ca_required(const struct options *options)
static struct http_proxy_options * parse_http_proxy_override(const char *server, const char *port, const char *flags, struct gc_arena *gc)
void init_options(struct options *o)
static void options_postprocess_mutate_le(const struct connection_entry *ce, struct local_entry *le, int mode)
static void tuntap_options_postprocess_dns(struct options *o)
Postprocess DNS related settings.
static void dhcp_option_dns6_parse(const char *parm, struct in6_addr *dns6_list, unsigned int *len, msglvl_t msglevel)
static char * get_ipv6_addr_no_netbits(const char *addr, struct gc_arena *gc)
Returns newly allocated string containing address part without "/nn".
static void option_iroute_ipv6(struct options *o, const char *prefix_str, msglvl_t msglevel)
static bool check_route_option(struct options *options, char *p[], const msglvl_t msglevel, bool pull_mode)
void show_dco_version(const unsigned int flags)
void rol_check_alloc(struct options *options)
static struct local_list * alloc_local_list_if_undef(struct connection_entry *ce, struct gc_arena *gc)
static void dhcp_option_address_parse(const char *name, const char *parm, in_addr_t *array, unsigned int *len, msglvl_t msglevel)
static void helper_hashmap_sizes(struct options *o)
Sets the internal hash maps sizes according to the max_clients.
static bool verify_permission(const char *name, const char *file, int line, const uint64_t type, const uint64_t allowed, uint64_t *found, const msglvl_t msglevel, const struct options *options, bool is_inline)
static void set_user_script(struct options *options, const char **script, const char *new_script, const char *type, bool in_chroot)
void update_option(struct context *c, struct options *options, char *p[], bool is_inline, const char *file, int line, const int level, const msglvl_t msglevel, const uint64_t permission_mask, uint64_t *option_types_found, struct env_set *es)
Processes an option to update.
static struct verify_hash_list * parse_hash_fingerprint_multiline(const char *str, int nbytes, msglvl_t msglevel, struct gc_arena *gc)
Parses a string consisting of multiple lines of hexstrings and checks if each string has the correct ...
static bool no_more_than_n_args(const msglvl_t msglevel, char *p[], const int max, const unsigned int flags)
void options_postprocess(struct options *options, struct env_set *es)
const char * auth_retry_print(void)
static struct remote_entry * alloc_remote_entry(struct options *options, const msglvl_t msglevel)
void show_library_versions(const unsigned int flags)
void setenv_settings(struct env_set *es, const struct options *o)
static const char usage_message[]
static struct connection_list * alloc_connection_list_if_undef(struct options *options)
static msglvl_t msglevel_forward_compatible(const struct options *options, const msglvl_t msglevel)
static void cnol_check_alloc(struct options *options)
static void options_postprocess_mutate(struct options *o, struct env_set *es)
void options_detach(struct options *o)
static unsigned int atou(const char *str)
void pre_connect_restore(struct options *o, struct gc_arena *gc)
static struct pull_filter_list * alloc_pull_filter_list(struct options *o)
const char * print_topology(const int topology)
static struct verify_hash_list * parse_hash_fingerprint(const char *str, int nbytes, msglvl_t msglevel, struct gc_arena *gc)
Parses a hexstring and checks if the string has the correct length.
static bool check_dns_option(struct options *options, char *p[], const msglvl_t msglevel, bool pull_mode)
static void options_postprocess_cipher(struct options *o)
static void options_set_backwards_compatible_options(struct options *o)
Changes default values so that OpenVPN can be compatible with the user specified version.
static void show_compression_warning(const struct compress_options *info)
#define MUST_BE_FALSE(condition, parm_name)
#define MUST_BE_UNDEF(parm, parm_name)
static void options_postprocess_http_proxy_override(struct options *o)
static void options_postprocess_mutate_invariant(struct options *options)
const char title_string[]
static void setenv_local_entry(struct env_set *es, const struct local_entry *e, const int i)
static void remap_redirect_gateway_flags(struct options *opt)
bool auth_retry_set(const msglvl_t msglevel, const char *option)
static struct remote_list * alloc_remote_list_if_undef(struct options *options)
static bool check_route6_option(struct options *options, char *p[], const msglvl_t msglevel, bool pull_mode)
void notnull(const char *arg, const char *description)
static struct local_entry * alloc_local_entry(struct connection_entry *ce, const msglvl_t msglevel, struct gc_arena *gc)
static void options_process_mutate_prf(struct options *o)
void add_option(struct options *options, char *p[], bool is_inline, const char *file, int line, const int level, const msglvl_t msglevel, const uint64_t permission_mask, uint64_t *option_types_found, struct env_set *es)
bool has_udp_in_local_list(const struct options *options)
static void option_iroute(struct options *o, const char *network_str, const char *netmask_str, msglvl_t msglevel)
static void options_postprocess_verify(const struct options *o)
static void connection_entry_preload_key(const char **key_file, bool *key_inline, struct gc_arena *gc)
static struct connection_entry * alloc_connection_entry(struct options *options, const msglvl_t msglevel)
static bool need_compatibility_before(const struct options *o, unsigned int version)
The option –compat-mode is used to set up default settings to values used on the specified openvpn ve...
#define MODE_POINT_TO_POINT
#define PUF_TYPE_ACCEPT
filter type to accept a matching option
#define SF_TCP_NODELAY_HELPER
#define OPT_P_INSTANCE
allowed in ccd, client-connect etc
#define OPT_P_NCP
Negotiable crypto parameters.
#define OPT_P_ROUTE_TABLE
#define CONNECTION_LIST_SIZE
#define OPT_P_U_REDIR_GATEWAY
#define OPT_P_EXPLICIT_NOTIFY
#define PUF_TYPE_IGNORE
filter type to ignore a matching option
static bool dco_enabled(const struct options *o)
Returns whether the current configuration has dco enabled.
#define PUF_TYPE_REJECT
filter type to reject and trigger SIGUSR1
void read_config_file(struct options *options, const char *file, int level, const char *top_file, const int top_line, const msglvl_t msglevel, const uint64_t permission_mask, uint64_t *option_types_found, struct env_set *es)
@ GENKEY_TLS_CRYPTV2_SERVER
@ GENKEY_TLS_CRYPTV2_CLIENT
#define SF_NO_PUSH_ROUTE_GATEWAY
#define PLUGIN_OPTION_LIST(opt)
#define ROUTE_OPTION_FLAGS(o)
static void show_debug_warning(const unsigned int flags)
#define OPT_P_ROUTE_EXTRAS
void read_config_string(const char *prefix, struct options *options, const char *config, const msglvl_t msglevel, const uint64_t permission_mask, uint64_t *option_types_found, struct env_set *es)
#define MAN_CLIENT_AUTH_ENABLED(opt)
@ VLAN_ONLY_UNTAGGED_OR_PRIORITY
bool boolean_flag(const char *str, const char *name, msglvl_t msglevel)
Converts a str to an boolean if the string can be parsed as either 0 or 1.
int atoi_warn(const char *str, msglvl_t msglevel)
Converts a str to an integer if the string can be represented as an integer number.
int positive_atoi(const char *str, msglvl_t msglevel)
Converts a str to a positive number if the string represents a postive integer number.
bool positive_atoll(const char *str, int64_t *value, const char *name, msglvl_t msglevel)
Converts a str to an integer if the string can be represented as an integer number and is >= 0.
bool valid_integer(const char *str, bool positive)
Checks if the string is a valid integer by checking if it can be converted to an integer.
bool atoi_constrained(const char *str, int *value, const char *name, int min, int max, msglvl_t msglevel)
Converts a str to an integer if the string can be represented as an integer number and is between min...
#define MAX_SEQ_BACKTRACK
#define MIN_SEQ_BACKTRACK
#define DEFAULT_SEQ_BACKTRACK
#define MAX_TIME_BACKTRACK
#define DEFAULT_TIME_BACKTRACK
#define MIN_TIME_BACKTRACK
struct plugin_option_list * plugin_option_list_new(struct gc_arena *gc)
bool plugin_option_list_add(struct plugin_option_list *list, char **p, struct gc_arena *gc)
bool ifconfig_pool_verify_range(const msglvl_t msglevel, const in_addr_t start, const in_addr_t end)
#define OPENVPN_8021Q_MIN_VID
#define OPENVPN_8021Q_MAX_VID
struct http_proxy_options * init_http_proxy_options_once(struct http_proxy_options **hpo, struct gc_arena *gc)
#define MAX_CUSTOM_HTTP_HEADER
void push_reset(struct options *o)
void push_options(struct options *o, char **p, msglvl_t msglevel, struct gc_arena *gc)
void clone_push_list(struct options *o)
void push_remove_option(struct options *o, const char *p)
in_addr_t get_ip_addr(const char *ip_string, msglvl_t msglevel, bool *error)
bool get_ipv6_addr(const char *hostname, struct in6_addr *network, unsigned int *netbits, msglvl_t msglevel)
Translate an IPv6 addr or hostname from string form to in6_addr.
in_addr_t getaddr(unsigned int flags, const char *hostname, int resolve_retry_seconds, bool *succeeded, struct signal_info *sig_info)
Translate an IPv4 addr or hostname from string form to in_addr_t.
#define GETADDR_HOST_ORDER
static bool ipv6_addr_safe_hexplusbits(const char *ipv6_prefix_spec)
bool is_special_addr(const char *addr_str)
struct route_option_list * clone_route_option_list(const struct route_option_list *src, struct gc_arena *a)
int netmask_to_netbits2(in_addr_t netmask)
struct route_ipv6_option_list * new_route_ipv6_option_list(struct gc_arena *a)
void delete_routes_v6(struct route_ipv6_list *rl6, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx)
void get_default_gateway_ipv6(struct route_ipv6_gateway_info *rgi6, const struct in6_addr *dest, openvpn_net_ctx_t *ctx)
void add_route_ipv6_to_option_list(struct route_ipv6_option_list *l, const char *prefix, const char *gateway, const char *metric, int table_id)
void copy_route_option_list(struct route_option_list *dest, const struct route_option_list *src, struct gc_arena *a)
void copy_route_ipv6_option_list(struct route_ipv6_option_list *dest, const struct route_ipv6_option_list *src, struct gc_arena *a)
void print_default_gateway(const msglvl_t msglevel, const struct route_gateway_info *rgi, const struct route_ipv6_gateway_info *rgi6)
void get_default_gateway(struct route_gateway_info *rgi, in_addr_t dest, openvpn_net_ctx_t *ctx)
Retrieves the best gateway for a given destination based on the routing table.
struct route_ipv6_option_list * clone_route_ipv6_option_list(const struct route_ipv6_option_list *src, struct gc_arena *a)
struct route_option_list * new_route_option_list(struct gc_arena *a)
void show_routes(msglvl_t msglevel)
void delete_routes_v4(struct route_list *rl, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx)
void add_route_to_option_list(struct route_option_list *l, const char *network, const char *netmask, const char *gateway, const char *metric, int table_id)
#define ROUTE_METHOD_SERVICE
#define ROUTE_METHOD_IPAPI
#define ROUTE_METHOD_ADAPTIVE
void script_security_set(int level)
#define SSEC_PW_ENV
allow calling of built-in programs and user-defined scripts that may receive a password as an environ...
#define SSEC_NONE
strictly no calling of external programs
#define RESOLV_RETRY_INFINITE
#define SF_USE_IP_PKTINFO
#define SF_HOST_RANDOMIZE
#define SF_PKTINFO_COPY_IIF
const char * proto2ascii(int proto, sa_family_t af, bool display_form)
bool mac_addr_safe(const char *mac_addr)
const char * proto2ascii_all(struct gc_arena *gc)
sa_family_t ascii2af(const char *proto_name)
bool ipv6_addr_safe(const char *ipv6_text_addr)
const char * print_in6_addr(struct in6_addr a6, unsigned int flags, struct gc_arena *gc)
bool ip_or_dns_addr_safe(const char *addr, const bool allow_fqdn)
int ascii2proto(const char *proto_name)
const char * print_in_addr_t(in_addr_t addr, unsigned int flags, struct gc_arena *gc)
bool ip_addr_dotted_quad_safe(const char *dotted_quad)
static bool proto_is_net(int proto)
static bool proto_is_udp(int proto)
Returns if the protocol being used is UDP.
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP).
void ssl_set_auth_token_user(const char *username)
void ssl_set_auth_nocache(void)
int tls_version_parse(const char *vstr, const char *extra)
void ssl_set_auth_token(const char *token)
bool ssl_get_auth_nocache(void)
static bool push_peer_info(struct buffer *buf, const struct tls_multi *multi, struct tls_session *session)
Prepares the IV_ and UV_ variables that are part of the exchange to signal the peer's capabilities.
Control Channel SSL/Data channel negotiation module.
#define X509_USERNAME_FIELD_DEFAULT
const char * get_ssl_library_version(void)
return a pointer to a static memory area containing the name and version number of the SSL library in...
#define TLS_VER_BAD
Parse a TLS version specifier.
#define EXPORT_KEY_DATA_LABEL
int tls_version_max(void)
Return the maximum TLS version (as a TLS_VER_x constant) supported by current SSL implementation.
#define SSLF_TLS_VERSION_MAX_SHIFT
#define SSLF_CLIENT_CERT_OPTIONAL
#define SSLF_AUTH_USER_PASS_OPTIONAL
#define SSLF_CLIENT_CERT_NOT_REQUIRED
#define SSLF_CRL_VERIFY_DIR
#define SSLF_TLS_DEBUG_ENABLED
#define SSLF_TLS_VERSION_MAX_MASK
#define SSLF_TLS_VERSION_MIN_SHIFT
#define SSLF_TLS_VERSION_MIN_MASK
#define SSLF_USERNAME_AS_COMMON_NAME
void options_postprocess_setdefault_ncpciphers(struct options *o)
Checks for availibility of Chacha20-Poly1305 and sets the ncp_cipher to either AES-256-GCM:AES-128-GC...
bool tls_item_in_cipher_list(const char *item, const char *list)
Return true iff item is present in the colon-separated zero-terminated cipher list.
void append_cipher_to_ncp_list(struct options *o, const char *ciphername)
Appends the cipher specified by the ciphernamer parameter to to the o->ncp_ciphers list.
char * mutate_ncp_cipher_list(const char *list, struct gc_arena *gc)
Check whether the ciphers in the supplied list are supported.
Control Channel SSL/Data dynamic negotiation Module This file is split from ssl.h to be able to unit ...
Control Channel Verification Module.
#define OPENVPN_KU_REQUIRED
Require keyUsage to be present in cert (0xFFFF is an invalid KU value).
#define VERIFY_X509_SUBJECT_DN
#define VERIFY_X509_SUBJECT_RDN
#define NS_CERT_CHECK_CLIENT
Do not perform Netscape certificate type verification.
#define VERIFY_X509_SUBJECT_RDN_PREFIX
#define NS_CERT_CHECK_SERVER
Do not perform Netscape certificate type verification.
bool x509_username_field_ext_supported(const char *extname)
Return true iff the supplied extension field is supported by the –x509-username-field option.
void x509_track_add(const struct x509_track **ll_head, const char *name, msglvl_t msglevel, struct gc_arena *gc)
Wrapper structure for dynamically allocated memory.
uint8_t * data
Pointer to the allocated memory.
struct local_list * local_list
int connect_retry_seconds
bool tls_crypt_v2_force_cookie
int connect_retry_seconds_max
const char * tls_crypt_file
const char * tls_crypt_v2_file
bool tun_mtu_extra_defined
const char * socks_proxy_port
struct http_proxy_options * http_proxy_options
bool tls_crypt_file_inline
bool tls_auth_file_inline
int explicit_exit_notification
const char * socks_proxy_authfile
const char * socks_proxy_server
const char * tls_auth_file
bool tls_crypt_v2_file_inline
struct connection_entry ** array
struct route_list * route_list
List of routing information.
struct route_ipv6_list * route_ipv6_list
struct tuntap * tuntap
Tun/tap virtual network interface.
Contains all state information for one tunnel.
openvpn_net_ctx_t net_ctx
Networking API opaque context.
struct options options
Options loaded from command line or configuration file.
struct context_1 c1
Level 1 context.
in_addr_t dns[N_DHCP_ADDR]
struct dns_server * servers
struct dhcp_options from_dhcp
enum dns_updown_flags updown_flags
struct dns_domain * search_domains
union dns_server_addr::@004207021271366206052324250021344162110133065024 in
struct dns_server_addr addr[8]
struct dns_domain * domains
enum dns_server_transport transport
Garbage collection arena used to keep track of dynamically allocated memory.
const char * http_version
const char * auth_method_string
struct http_custom_header custom_headers[MAX_CUSTOM_HTTP_HEADER]
const char * auth_file_up
struct iroute_ipv6 * next
struct local_entry ** array
struct tuntap_options tuntap_options
int ping_rec_timeout_action
bool tuntap_options_defined
struct route_option_list * routes
struct compress_options comp
const char * ifconfig_local
struct dns_options dns_options
const char * route_default_gateway
const char * ifconfig_ipv6_local
struct route_ipv6_option_list * routes_ipv6
struct client_nat_option_list * client_nat
const char * route_ipv6_default_gateway
int resolve_retry_seconds
const char * genkey_extra_data
struct compress_options comp
struct http_proxy_options * http_proxy_override
int push_ifconfig_ipv6_netbits
const char * acc_protocols
The app custom control protocols we should announce as supported.
struct connection_list * connection_list
const char * management_port
bool tls_crypt_file_inline
const char * ifconfig_ipv6_remote
int max_routes_per_client
const char * ncp_ciphers_conf
The original ncp_ciphers specified by the user in the configuration.
enum vlan_acceptable_frames vlan_accept
in_addr_t push_ifconfig_constraint_network
struct options_pre_connect * pre_connect
int renegotiate_seconds_min
const char * auth_token_secret_file
unsigned int imported_protocol_flags
const char * tls_export_peer_cert_dir
const char * cryptoapi_cert
unsigned int backwards_compatible
What version we should try to be compatible with as major * 10000 + minor * 100 + patch,...
hash_algo_type verify_hash_algo
int scheduled_exit_interval
int stale_routes_ageing_time
int management_state_buffer_size
const char * tls_auth_file
struct provider_list providers
struct in6_addr server_network_ipv6
int management_echo_buffer_size
bool use_peer_id
Whether the data channel uses the DATA_V2 header (peer-id).
unsigned remote_cert_ku[MAX_PARMS]
bool server_bridge_defined
const char * keying_material_exporter_label
const char * remote_cert_eku
in_addr_t ifconfig_pool_netmask
bool server_bridge_proxy_dhcp
bool allow_recursive_routing
const char * exit_event_name
const char * ifconfig_ipv6_local
bool auth_user_pass_verify_script_via_file
int ifconfig_pool_persist_refresh_freq
int pushed_acc_max_message_length
the maximum length of an ACC control channel message via push message
uint64_t push_option_types_found
bool push_ifconfig_defined
bool ifconfig_pool_defined
const char * packet_id_file
const char * tls_crypt_v2_file
int management_log_history_cache
in_addr_t server_bridge_netmask
const char * ip_remote_hint
struct route_option_list * routes
in_addr_t ifconfig_pool_end
int64_t inactivity_minimum_bytes
bool ifconfig_ipv6_pool_defined
unsigned int server_flags
bool push_ifconfig_ipv6_blocked
const char * client_disconnect_script
struct remote_list * remote_list
const char * key_pass_file
bool mute_replay_warnings
const char * tls_crypt_file
const char * ifconfig_local
char * x509_username_field[MAX_PARMS]
struct connection_entry ce
const char * pushed_acc_negotiated_protocols
the protocols that are negotiated with the peer.
struct iroute_ipv6 * iroutes_ipv6
struct push_list push_list
struct tuntap_options tuntap_options
struct verify_hash_list * verify_hash
const char * tls_cert_profile
int64_t renegotiate_packets
unsigned int management_flags
const char * route_default_gateway
in_addr_t push_ifconfig_local_alias
struct dns_options dns_options
bool exit_event_initial_state
struct static_challenge_info sc_info
bool auth_token_call_auth
uint32_t virtual_hash_size
const char * learn_address_script
const char * auth_user_pass_file
int stale_routes_check_interval
struct plugin_option_list * plugin_list
const char * tls_crypt_v2_verify_script
const char * auth_user_pass_verify_script
const char * extra_certs_file
int ifconfig_ipv6_pool_netbits
in_addr_t push_ifconfig_constraint_netmask
const char * route_ipv6_default_gateway
bool priv_key_file_inline
int ping_rec_timeout_action
bool auth_user_pass_file_inline
bool enable_ncp_fallback
If defined fall back to ciphername if NCP fails.
const char * route_predown_script
in_addr_t push_ifconfig_local
const char ** ignore_unknown_option
int64_t aead_usage_limit_override
Debug override to trigger AEAD usage limit early.
int route_default_table_id
bool auth_token_secret_file_inline
bool extra_certs_file_inline
bool push_ifconfig_constraint_defined
int keying_material_exporter_length
bool force_key_material_export
const char * cipher_list_tls13
int status_file_update_freq
const char * management_client_user
bool allow_deprecated_insecure_static_crypto
struct pull_filter_list * pull_filter_list
const char * management_certificate
const char * genkey_filename
const struct x509_track * x509_track
bool auth_user_pass_username_only
bool shared_secret_file_inline
struct in6_addr push_ifconfig_ipv6_remote
const char * management_addr
const char * client_connect_script
const char * verify_x509_name
bool route_gateway_via_dhcp
bool push_ifconfig_ipv6_defined
const char * override_username
const char * client_crresponse_script
struct route_ipv6_option_list * routes_ipv6
bool machine_readable_output
const char * priv_key_file
bool tls_auth_file_inline
bool tls_crypt_v2_file_inline
in_addr_t server_bridge_pool_start
struct client_nat_option_list * client_nat
struct in6_addr push_ifconfig_ipv6_local
uint64_t push_update_options_found
const char * ifconfig_remote_netmask
in_addr_t server_bridge_pool_end
enum tun_driver_type windows_driver
int64_t renegotiate_bytes
const char * route_script
in_addr_t ifconfig_pool_start
const char * management_user_pass
unsigned int server_netbits_ipv6
in_addr_t push_ifconfig_remote_netmask
in_addr_t server_bridge_ip
const char * shared_secret_file
const char * management_client_group
struct in6_addr ifconfig_ipv6_pool_base
const char * client_config_dir
enum genkey_type genkey_type
const char * ifconfig_pool_persist_filename
int ifconfig_ipv6_netbits
const char * names[MAX_PARMS]
struct pull_filter * tail
struct pull_filter * head
struct pull_filter * next
struct remote_entry ** array
const char * challenge_text
struct in6_addr dns6[N_DHCP_ADDR]
in_addr_t nbdd[N_DHCP_ADDR]
in_addr_t ntp[N_DHCP_ADDR]
in_addr_t wins[N_DHCP_ADDR]
uint8_t netbios_node_type
in_addr_t dns[N_DHCP_ADDR]
const char * netbios_scope
unsigned int domain_search_list_len
bool dhcp_masq_custom_offset
const char * domain_search_list[N_SEARCH_LIST_LEN]
struct verify_hash_list * next
uint8_t hash[SHA256_DIGEST_LENGTH]
unsigned short sa_family_t
static bool pkcs11_id_management
void ipconfig_register_dns(const struct env_set *es)
int dev_type_enum(const char *dev, const char *dev_type)
void show_tap_win_adapters(msglvl_t msglevel, msglvl_t warnlevel)
bool dhcp_renew_by_adapter_index(const DWORD adapter_index)
int ascii2ipset(const char *name)
bool dhcp_release_by_adapter_index(const DWORD adapter_index)
void tap_allow_nonadmin_access(const char *dev_node)
void show_adapters(msglvl_t msglevel)
const char * ipset2ascii_all(struct gc_arena *gc)
void show_valid_win32_tun_subnets(void)
const char * print_tun_backend_driver(enum tun_driver_type driver)
Return a string representation of the tun backed driver type.
#define IPW32_SET_ADAPTIVE
#define DHCP_OPTIONS_DHCP_REQUIRED
#define N_SEARCH_LIST_LEN
#define IPW32_SET_DHCP_MASQ
@ WINDOWS_DRIVER_UNSPECIFIED
@ WINDOWS_DRIVER_TAP_WINDOWS6
#define IPW32_SET_ADAPTIVE_DELAY_WINDOW
#define DHCP_OPTIONS_DHCP_OPTIONAL
static bool is_tun_afunix(const char *devnode)
Checks whether a –dev-node parameter specifies a AF_UNIX device.
void set_win_sys_path(const char *newpath, struct env_set *es)
const char * win32_version_string(struct gc_arena *gc)
Get Windows version string with architecture info.
void set_pause_exit_win32(void)