Merge ~danilogondolfo/netplan/+git/ubuntu:mantic_0_107_1_sru into ~ubuntu-core-dev/netplan/+git/ubuntu:ubuntu-mantic

Proposed by Danilo Egea Gondolfo
Status: Merged
Merged at revision: a28328d79bc426adf65bc6026cb81174174072de
Proposed branch: ~danilogondolfo/netplan/+git/ubuntu:mantic_0_107_1_sru
Merge into: ~ubuntu-core-dev/netplan/+git/ubuntu:ubuntu-mantic
Diff against target: 7418 lines (+4749/-562)
62 files modified
Doxyfile (+2688/-0)
debian/changelog (+69/-0)
debian/control (+2/-1)
debian/extra/PLACEHOLDER (+4/-0)
debian/netplan.io.preinst (+17/-0)
debian/patches/0001-parse-nm-wg-append-the-correct-prefix-to-IPv6-addres.patch (+77/-0)
debian/patches/0007-tests-assert-generated-.service-files-in-assert_srio.patch (+26/-0)
debian/patches/0008-tests-sriov-test-if-the-generated-netplan-rebind-ser.patch (+57/-0)
debian/patches/0009-sriov-don-t-generate-duplicate-entries-in-the-rebind.patch (+96/-0)
debian/patches/lp2041727/0004-cli-utils-introduce-systemctl_is_installed-helper.patch (+63/-0)
debian/patches/lp2041727/0005-Update-ovs.py-to-check-if-ovsdb-server.service-is-in.patch (+75/-0)
debian/patches/series (+6/-11)
debian/rules (+0/-4)
debian/tests/prep-testbed.sh (+3/-0)
dev/null (+0/-371)
doc/apidoc/inc-netplan.md (+4/-0)
doc/apidoc/inc-parse-nm.md (+4/-0)
doc/apidoc/inc-parse.md (+4/-0)
doc/apidoc/inc-types.md (+4/-0)
doc/apidoc/inc-util.md (+4/-0)
doc/apidoc/index.md (+52/-0)
doc/conf.py (+29/-1)
doc/contribute-docs.md (+26/-0)
doc/howto.md (+1/-0)
doc/netplan-everywhere.md (+54/-60)
doc/netplan-yaml.md (+5/-3)
doc/reference.md (+3/-3)
doc/requirements.txt (+1/-0)
doc/spelling_wordlist.txt (+36/-4)
examples/bonding.yaml (+1/-0)
examples/wpa3_enterprise.yaml (+26/-0)
include/netplan.h (+4/-0)
include/parse-nm.h (+4/-0)
include/parse.h (+4/-0)
include/types.h (+4/-0)
include/util.h (+21/-0)
netplan_cli/cli/commands/apply.py (+19/-1)
netplan_cli/cli/commands/try_command.py (+1/-2)
netplan_cli/cli/utils.py (+14/-0)
src/abi.h (+14/-0)
src/names.c (+4/-0)
src/netplan.c (+7/-1)
src/networkd.c (+77/-39)
src/nm.c (+49/-6)
src/parse-nm.c (+43/-6)
src/parse.c (+76/-18)
src/types-internal.h (+3/-0)
src/types.c (+3/-1)
src/util-internal.h (+3/-0)
src/util.c (+10/-0)
src/validation.c (+2/-4)
tests/generator/test_auth.py (+5/-2)
tests/generator/test_common.py (+88/-3)
tests/generator/test_tunnels.py (+9/-12)
tests/generator/test_wifis.py (+372/-8)
tests/integration/ovs.py (+4/-1)
tests/integration/regressions.py (+27/-0)
tests/integration/routing.py (+1/-0)
tests/integration/tunnels.py (+43/-0)
tests/parser/test_keyfile.py (+370/-0)
tests/test_libnetplan.py (+19/-0)
tests/test_utils.py (+12/-0)
Reviewer Review Type Date Requested Status
Lukas Märdian Approve
Ubuntu Core Development Team Pending
Review via email: mp+462773@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Lukas Märdian (slyon) wrote :

* rm .pyc/__pycache__ in python3-netplan.preinst? => Do we want/need this in Noble, too? (Can you create a Salsa MR against debian/unstable?)
* d/control: We might want to keep the openvswitch-switch <!nocheck> build-depends on armhf, as it's still built on Mantic
=> This would allow getting rid of debian/patches/0002-ovs-disable-StartLimitBurst-in-the-ovs-cleanup-servi.patch, too. IMO
=> non-blocking: As the OVS autopkgtests are skipped on armhf, too, due to missing kernel module in the container
* note (non-blocking): The 0.107.1-3ubuntu0.23.10.1 version string is (currently) bigger than what we have in noble-release, but this will be resolved by 1.0-1 in noble-proposed (stuck due to armhf time_t)
=> We should probably keep this version string as-is

LGTM! I'm just slightly concerned about the first bullet point and a little bit about the 2nd (for not reducing OVS test coverage on armhf)

review: Approve
Revision history for this message
Lukas Märdian (slyon) wrote :

We discussed the .preinst situation out-of-band and agreed that python3-netplan does not own any files in /usr/share/netplan, so should not touch those and the script should stay within the netplan.io binary.

Builds are looking good in https://launchpad.net/~danilogondolfo/+archive/ubuntu/netplan-sru/+packages

Revision history for this message
Danilo Egea Gondolfo (danilogondolfo) wrote :

I also submitted the netplan.io.preinst script to Debian https://salsa.debian.org/debian/netplan.io/-/merge_requests/12

Revision history for this message
Lukas Märdian (slyon) wrote :

Update scan failed

At least one of the branches involved have failed to scan. You can manually schedule a rescan if required.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/Doxyfile b/Doxyfile
0new file mode 1006440new file mode 100644
index 0000000..19db167
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,2688 @@
1# Doxyfile 1.9.4
2
3# This file describes the settings to be used by the documentation system
4# doxygen (www.doxygen.org) for a project.
5#
6# All text after a double hash (##) is considered a comment and is placed in
7# front of the TAG it is preceding.
8#
9# All text after a single hash (#) is considered a comment and will be ignored.
10# The format is:
11# TAG = value [value, ...]
12# For lists, items can also be appended using:
13# TAG += value [value, ...]
14# Values that contain spaces should be placed between quotes (\" \").
15#
16# Note:
17#
18# Use doxygen to compare the used configuration file with the template
19# configuration file:
20# doxygen -x [configFile]
21# Use doxygen to compare the used configuration file with the template
22# configuration file without replacing the environment variables:
23# doxygen -x_noenv [configFile]
24
25#---------------------------------------------------------------------------
26# Project related configuration options
27#---------------------------------------------------------------------------
28
29# This tag specifies the encoding used for all characters in the configuration
30# file that follow. The default is UTF-8 which is also the encoding used for all
31# text before the first occurrence of this tag. Doxygen uses libiconv (or the
32# iconv built into libc) for the transcoding. See
33# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
34# The default value is: UTF-8.
35
36DOXYFILE_ENCODING = UTF-8
37
38# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
39# double-quotes, unless you are using Doxywizard) that should identify the
40# project for which the documentation is generated. This name is used in the
41# title of most generated pages and in a few other places.
42# The default value is: My Project.
43
44PROJECT_NAME = "Netplan"
45
46# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
47# could be handy for archiving the generated documentation or if some version
48# control system is used.
49
50PROJECT_NUMBER =
51
52# Using the PROJECT_BRIEF tag one can provide an optional one line description
53# for a project that appears at the top of each page and should give viewer a
54# quick idea about the purpose of the project. Keep the description short.
55
56PROJECT_BRIEF =
57
58# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
59# in the documentation. The maximum height of the logo should not exceed 55
60# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
61# the logo to the output directory.
62
63PROJECT_LOGO =
64
65# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
66# into which the generated documentation will be written. If a relative path is
67# entered, it will be relative to the location where doxygen was started. If
68# left blank the current directory will be used.
69
70OUTPUT_DIRECTORY =
71
72# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
73# sub-directories (in 2 levels) under the output directory of each output format
74# and will distribute the generated files over these directories. Enabling this
75# option can be useful when feeding doxygen a huge amount of source files, where
76# putting all generated files in the same directory would otherwise causes
77# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
78# control the number of sub-directories.
79# The default value is: NO.
80
81CREATE_SUBDIRS = NO
82
83# Controls the number of sub-directories that will be created when
84# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
85# level increment doubles the number of directories, resulting in 4096
86# directories at level 8 which is the default and also the maximum value. The
87# sub-directories are organized in 2 levels, the first level always has a fixed
88# numer of 16 directories.
89# Minimum value: 0, maximum value: 8, default value: 8.
90# This tag requires that the tag CREATE_SUBDIRS is set to YES.
91
92CREATE_SUBDIRS_LEVEL = 8
93
94# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
95# characters to appear in the names of generated files. If set to NO, non-ASCII
96# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
97# U+3044.
98# The default value is: NO.
99
100ALLOW_UNICODE_NAMES = NO
101
102# The OUTPUT_LANGUAGE tag is used to specify the language in which all
103# documentation generated by doxygen is written. Doxygen will use this
104# information to generate all constant output in the proper language.
105# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
106# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
107# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
108# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
109# English messages), Korean, Korean-en (Korean with English messages), Latvian,
110# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
111# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
112# Swedish, Turkish, Ukrainian and Vietnamese.
113# The default value is: English.
114
115OUTPUT_LANGUAGE = English
116
117# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
118# descriptions after the members that are listed in the file and class
119# documentation (similar to Javadoc). Set to NO to disable this.
120# The default value is: YES.
121
122BRIEF_MEMBER_DESC = YES
123
124# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
125# description of a member or function before the detailed description
126#
127# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
128# brief descriptions will be completely suppressed.
129# The default value is: YES.
130
131REPEAT_BRIEF = YES
132
133# This tag implements a quasi-intelligent brief description abbreviator that is
134# used to form the text in various listings. Each string in this list, if found
135# as the leading text of the brief description, will be stripped from the text
136# and the result, after processing the whole list, is used as the annotated
137# text. Otherwise, the brief description is used as-is. If left blank, the
138# following values are used ($name is automatically replaced with the name of
139# the entity):The $name class, The $name widget, The $name file, is, provides,
140# specifies, contains, represents, a, an and the.
141
142ABBREVIATE_BRIEF = "The $name class" \
143 "The $name widget" \
144 "The $name file" \
145 is \
146 provides \
147 specifies \
148 contains \
149 represents \
150 a \
151 an \
152 the
153
154# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
155# doxygen will generate a detailed section even if there is only a brief
156# description.
157# The default value is: NO.
158
159ALWAYS_DETAILED_SEC = NO
160
161# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
162# inherited members of a class in the documentation of that class as if those
163# members were ordinary class members. Constructors, destructors and assignment
164# operators of the base classes will not be shown.
165# The default value is: NO.
166
167INLINE_INHERITED_MEMB = NO
168
169# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
170# before files name in the file list and in the header files. If set to NO the
171# shortest path that makes the file name unique will be used
172# The default value is: YES.
173
174FULL_PATH_NAMES = YES
175
176# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
177# Stripping is only done if one of the specified strings matches the left-hand
178# part of the path. The tag can be used to show relative paths in the file list.
179# If left blank the directory from which doxygen is run is used as the path to
180# strip.
181#
182# Note that you can specify absolute paths here, but also relative paths, which
183# will be relative from the directory where doxygen is started.
184# This tag requires that the tag FULL_PATH_NAMES is set to YES.
185
186STRIP_FROM_PATH =
187
188# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
189# path mentioned in the documentation of a class, which tells the reader which
190# header file to include in order to use a class. If left blank only the name of
191# the header file containing the class definition is used. Otherwise one should
192# specify the list of include paths that are normally passed to the compiler
193# using the -I flag.
194
195STRIP_FROM_INC_PATH =
196
197# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
198# less readable) file names. This can be useful is your file systems doesn't
199# support long names like on DOS, Mac, or CD-ROM.
200# The default value is: NO.
201
202SHORT_NAMES = NO
203
204# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
205# first line (until the first dot) of a Javadoc-style comment as the brief
206# description. If set to NO, the Javadoc-style will behave just like regular Qt-
207# style comments (thus requiring an explicit @brief command for a brief
208# description.)
209# The default value is: NO.
210
211JAVADOC_AUTOBRIEF = NO
212
213# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
214# such as
215# /***************
216# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
217# Javadoc-style will behave just like regular comments and it will not be
218# interpreted by doxygen.
219# The default value is: NO.
220
221JAVADOC_BANNER = NO
222
223# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
224# line (until the first dot) of a Qt-style comment as the brief description. If
225# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
226# requiring an explicit \brief command for a brief description.)
227# The default value is: NO.
228
229QT_AUTOBRIEF = NO
230
231# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
232# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
233# a brief description. This used to be the default behavior. The new default is
234# to treat a multi-line C++ comment block as a detailed description. Set this
235# tag to YES if you prefer the old behavior instead.
236#
237# Note that setting this tag to YES also means that rational rose comments are
238# not recognized any more.
239# The default value is: NO.
240
241MULTILINE_CPP_IS_BRIEF = NO
242
243# By default Python docstrings are displayed as preformatted text and doxygen's
244# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
245# doxygen's special commands can be used and the contents of the docstring
246# documentation blocks is shown as doxygen documentation.
247# The default value is: YES.
248
249PYTHON_DOCSTRING = YES
250
251# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
252# documentation from any documented member that it re-implements.
253# The default value is: YES.
254
255INHERIT_DOCS = YES
256
257# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
258# page for each member. If set to NO, the documentation of a member will be part
259# of the file/class/namespace that contains it.
260# The default value is: NO.
261
262SEPARATE_MEMBER_PAGES = NO
263
264# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
265# uses this value to replace tabs by spaces in code fragments.
266# Minimum value: 1, maximum value: 16, default value: 4.
267
268TAB_SIZE = 4
269
270# This tag can be used to specify a number of aliases that act as commands in
271# the documentation. An alias has the form:
272# name=value
273# For example adding
274# "sideeffect=@par Side Effects:^^"
275# will allow you to put the command \sideeffect (or @sideeffect) in the
276# documentation, which will result in a user-defined paragraph with heading
277# "Side Effects:". Note that you cannot put \n's in the value part of an alias
278# to insert newlines (in the resulting output). You can put ^^ in the value part
279# of an alias to insert a newline as if a physical newline was in the original
280# file. When you need a literal { or } or , in the value part of an alias you
281# have to escape them by means of a backslash (\), this can lead to conflicts
282# with the commands \{ and \} for these it is advised to use the version @{ and
283# @} or use a double escape (\\{ and \\})
284
285ALIASES =
286
287# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
288# only. Doxygen will then generate output that is more tailored for C. For
289# instance, some of the names that are used will be different. The list of all
290# members will be omitted, etc.
291# The default value is: NO.
292
293OPTIMIZE_OUTPUT_FOR_C = NO
294
295# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
296# Python sources only. Doxygen will then generate output that is more tailored
297# for that language. For instance, namespaces will be presented as packages,
298# qualified scopes will look different, etc.
299# The default value is: NO.
300
301OPTIMIZE_OUTPUT_JAVA = NO
302
303# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
304# sources. Doxygen will then generate output that is tailored for Fortran.
305# The default value is: NO.
306
307OPTIMIZE_FOR_FORTRAN = NO
308
309# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
310# sources. Doxygen will then generate output that is tailored for VHDL.
311# The default value is: NO.
312
313OPTIMIZE_OUTPUT_VHDL = NO
314
315# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
316# sources only. Doxygen will then generate output that is more tailored for that
317# language. For instance, namespaces will be presented as modules, types will be
318# separated into more groups, etc.
319# The default value is: NO.
320
321OPTIMIZE_OUTPUT_SLICE = NO
322
323# Doxygen selects the parser to use depending on the extension of the files it
324# parses. With this tag you can assign which parser to use for a given
325# extension. Doxygen has a built-in mapping, but you can override or extend it
326# using this tag. The format is ext=language, where ext is a file extension, and
327# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
328# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
329# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
330# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
331# tries to guess whether the code is fixed or free formatted code, this is the
332# default for Fortran type files). For instance to make doxygen treat .inc files
333# as Fortran files (default is PHP), and .f files as C (default is Fortran),
334# use: inc=Fortran f=C.
335#
336# Note: For files without extension you can use no_extension as a placeholder.
337#
338# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
339# the files are not read by doxygen. When specifying no_extension you should add
340# * to the FILE_PATTERNS.
341#
342# Note see also the list of default file extension mappings.
343
344EXTENSION_MAPPING =
345
346# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
347# according to the Markdown format, which allows for more readable
348# documentation. See https://daringfireball.net/projects/markdown/ for details.
349# The output of markdown processing is further processed by doxygen, so you can
350# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
351# case of backward compatibilities issues.
352# The default value is: YES.
353
354MARKDOWN_SUPPORT = YES
355
356# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
357# to that level are automatically included in the table of contents, even if
358# they do not have an id attribute.
359# Note: This feature currently applies only to Markdown headings.
360# Minimum value: 0, maximum value: 99, default value: 5.
361# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
362
363TOC_INCLUDE_HEADINGS = 5
364
365# When enabled doxygen tries to link words that correspond to documented
366# classes, or namespaces to their corresponding documentation. Such a link can
367# be prevented in individual cases by putting a % sign in front of the word or
368# globally by setting AUTOLINK_SUPPORT to NO.
369# The default value is: YES.
370
371AUTOLINK_SUPPORT = YES
372
373# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
374# to include (a tag file for) the STL sources as input, then you should set this
375# tag to YES in order to let doxygen match functions declarations and
376# definitions whose arguments contain STL classes (e.g. func(std::string);
377# versus func(std::string) {}). This also make the inheritance and collaboration
378# diagrams that involve STL classes more complete and accurate.
379# The default value is: NO.
380
381BUILTIN_STL_SUPPORT = NO
382
383# If you use Microsoft's C++/CLI language, you should set this option to YES to
384# enable parsing support.
385# The default value is: NO.
386
387CPP_CLI_SUPPORT = NO
388
389# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
390# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
391# will parse them like normal C++ but will assume all classes use public instead
392# of private inheritance when no explicit protection keyword is present.
393# The default value is: NO.
394
395SIP_SUPPORT = NO
396
397# For Microsoft's IDL there are propget and propput attributes to indicate
398# getter and setter methods for a property. Setting this option to YES will make
399# doxygen to replace the get and set methods by a property in the documentation.
400# This will only work if the methods are indeed getting or setting a simple
401# type. If this is not the case, or you want to show the methods anyway, you
402# should set this option to NO.
403# The default value is: YES.
404
405IDL_PROPERTY_SUPPORT = YES
406
407# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
408# tag is set to YES then doxygen will reuse the documentation of the first
409# member in the group (if any) for the other members of the group. By default
410# all members of a group must be documented explicitly.
411# The default value is: NO.
412
413DISTRIBUTE_GROUP_DOC = NO
414
415# If one adds a struct or class to a group and this option is enabled, then also
416# any nested class or struct is added to the same group. By default this option
417# is disabled and one has to add nested compounds explicitly via \ingroup.
418# The default value is: NO.
419
420GROUP_NESTED_COMPOUNDS = NO
421
422# Set the SUBGROUPING tag to YES to allow class member groups of the same type
423# (for instance a group of public functions) to be put as a subgroup of that
424# type (e.g. under the Public Functions section). Set it to NO to prevent
425# subgrouping. Alternatively, this can be done per class using the
426# \nosubgrouping command.
427# The default value is: YES.
428
429SUBGROUPING = YES
430
431# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
432# are shown inside the group in which they are included (e.g. using \ingroup)
433# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
434# and RTF).
435#
436# Note that this feature does not work in combination with
437# SEPARATE_MEMBER_PAGES.
438# The default value is: NO.
439
440INLINE_GROUPED_CLASSES = NO
441
442# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
443# with only public data fields or simple typedef fields will be shown inline in
444# the documentation of the scope in which they are defined (i.e. file,
445# namespace, or group documentation), provided this scope is documented. If set
446# to NO, structs, classes, and unions are shown on a separate page (for HTML and
447# Man pages) or section (for LaTeX and RTF).
448# The default value is: NO.
449
450INLINE_SIMPLE_STRUCTS = NO
451
452# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
453# enum is documented as struct, union, or enum with the name of the typedef. So
454# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
455# with name TypeT. When disabled the typedef will appear as a member of a file,
456# namespace, or class. And the struct will be named TypeS. This can typically be
457# useful for C code in case the coding convention dictates that all compound
458# types are typedef'ed and only the typedef is referenced, never the tag name.
459# The default value is: NO.
460
461TYPEDEF_HIDES_STRUCT = NO
462
463# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
464# cache is used to resolve symbols given their name and scope. Since this can be
465# an expensive process and often the same symbol appears multiple times in the
466# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
467# doxygen will become slower. If the cache is too large, memory is wasted. The
468# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
469# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
470# symbols. At the end of a run doxygen will report the cache usage and suggest
471# the optimal cache size from a speed point of view.
472# Minimum value: 0, maximum value: 9, default value: 0.
473
474LOOKUP_CACHE_SIZE = 0
475
476# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
477# during processing. When set to 0 doxygen will based this on the number of
478# cores available in the system. You can set it explicitly to a value larger
479# than 0 to get more control over the balance between CPU load and processing
480# speed. At this moment only the input processing can be done using multiple
481# threads. Since this is still an experimental feature the default is set to 1,
482# which effectively disables parallel processing. Please report any issues you
483# encounter. Generating dot graphs in parallel is controlled by the
484# DOT_NUM_THREADS setting.
485# Minimum value: 0, maximum value: 32, default value: 1.
486
487NUM_PROC_THREADS = 1
488
489#---------------------------------------------------------------------------
490# Build related configuration options
491#---------------------------------------------------------------------------
492
493# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
494# documentation are documented, even if no documentation was available. Private
495# class members and static file members will be hidden unless the
496# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
497# Note: This will also disable the warnings about undocumented members that are
498# normally produced when WARNINGS is set to YES.
499# The default value is: NO.
500
501EXTRACT_ALL = NO
502
503# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
504# be included in the documentation.
505# The default value is: NO.
506
507EXTRACT_PRIVATE = NO
508
509# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
510# methods of a class will be included in the documentation.
511# The default value is: NO.
512
513EXTRACT_PRIV_VIRTUAL = NO
514
515# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
516# scope will be included in the documentation.
517# The default value is: NO.
518
519EXTRACT_PACKAGE = NO
520
521# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
522# included in the documentation.
523# The default value is: NO.
524
525EXTRACT_STATIC = NO
526
527# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
528# locally in source files will be included in the documentation. If set to NO,
529# only classes defined in header files are included. Does not have any effect
530# for Java sources.
531# The default value is: YES.
532
533EXTRACT_LOCAL_CLASSES = YES
534
535# This flag is only useful for Objective-C code. If set to YES, local methods,
536# which are defined in the implementation section but not in the interface are
537# included in the documentation. If set to NO, only methods in the interface are
538# included.
539# The default value is: NO.
540
541EXTRACT_LOCAL_METHODS = NO
542
543# If this flag is set to YES, the members of anonymous namespaces will be
544# extracted and appear in the documentation as a namespace called
545# 'anonymous_namespace{file}', where file will be replaced with the base name of
546# the file that contains the anonymous namespace. By default anonymous namespace
547# are hidden.
548# The default value is: NO.
549
550EXTRACT_ANON_NSPACES = NO
551
552# If this flag is set to YES, the name of an unnamed parameter in a declaration
553# will be determined by the corresponding definition. By default unnamed
554# parameters remain unnamed in the output.
555# The default value is: YES.
556
557RESOLVE_UNNAMED_PARAMS = YES
558
559# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
560# undocumented members inside documented classes or files. If set to NO these
561# members will be included in the various overviews, but no documentation
562# section is generated. This option has no effect if EXTRACT_ALL is enabled.
563# The default value is: NO.
564
565HIDE_UNDOC_MEMBERS = NO
566
567# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
568# undocumented classes that are normally visible in the class hierarchy. If set
569# to NO, these classes will be included in the various overviews. This option
570# has no effect if EXTRACT_ALL is enabled.
571# The default value is: NO.
572
573HIDE_UNDOC_CLASSES = NO
574
575# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
576# declarations. If set to NO, these declarations will be included in the
577# documentation.
578# The default value is: NO.
579
580HIDE_FRIEND_COMPOUNDS = NO
581
582# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
583# documentation blocks found inside the body of a function. If set to NO, these
584# blocks will be appended to the function's detailed documentation block.
585# The default value is: NO.
586
587HIDE_IN_BODY_DOCS = NO
588
589# The INTERNAL_DOCS tag determines if documentation that is typed after a
590# \internal command is included. If the tag is set to NO then the documentation
591# will be excluded. Set it to YES to include the internal documentation.
592# The default value is: NO.
593
594INTERNAL_DOCS = NO
595
596# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
597# able to match the capabilities of the underlying filesystem. In case the
598# filesystem is case sensitive (i.e. it supports files in the same directory
599# whose names only differ in casing), the option must be set to YES to properly
600# deal with such files in case they appear in the input. For filesystems that
601# are not case sensitive the option should be set to NO to properly deal with
602# output files written for symbols that only differ in casing, such as for two
603# classes, one named CLASS and the other named Class, and to also support
604# references to files without having to specify the exact matching casing. On
605# Windows (including Cygwin) and MacOS, users should typically set this option
606# to NO, whereas on Linux or other Unix flavors it should typically be set to
607# YES.
608# The default value is: system dependent.
609
610CASE_SENSE_NAMES = YES
611
612# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
613# their full class and namespace scopes in the documentation. If set to YES, the
614# scope will be hidden.
615# The default value is: NO.
616
617HIDE_SCOPE_NAMES = NO
618
619# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
620# append additional text to a page's title, such as Class Reference. If set to
621# YES the compound reference will be hidden.
622# The default value is: NO.
623
624HIDE_COMPOUND_REFERENCE= NO
625
626# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
627# will show which file needs to be included to use the class.
628# The default value is: YES.
629
630SHOW_HEADERFILE = YES
631
632# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
633# the files that are included by a file in the documentation of that file.
634# The default value is: YES.
635
636SHOW_INCLUDE_FILES = YES
637
638# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
639# grouped member an include statement to the documentation, telling the reader
640# which file to include in order to use the member.
641# The default value is: NO.
642
643SHOW_GROUPED_MEMB_INC = NO
644
645# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
646# files with double quotes in the documentation rather than with sharp brackets.
647# The default value is: NO.
648
649FORCE_LOCAL_INCLUDES = NO
650
651# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
652# documentation for inline members.
653# The default value is: YES.
654
655INLINE_INFO = YES
656
657# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
658# (detailed) documentation of file and class members alphabetically by member
659# name. If set to NO, the members will appear in declaration order.
660# The default value is: YES.
661
662SORT_MEMBER_DOCS = YES
663
664# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
665# descriptions of file, namespace and class members alphabetically by member
666# name. If set to NO, the members will appear in declaration order. Note that
667# this will also influence the order of the classes in the class list.
668# The default value is: NO.
669
670SORT_BRIEF_DOCS = NO
671
672# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
673# (brief and detailed) documentation of class members so that constructors and
674# destructors are listed first. If set to NO the constructors will appear in the
675# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
676# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
677# member documentation.
678# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
679# detailed member documentation.
680# The default value is: NO.
681
682SORT_MEMBERS_CTORS_1ST = NO
683
684# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
685# of group names into alphabetical order. If set to NO the group names will
686# appear in their defined order.
687# The default value is: NO.
688
689SORT_GROUP_NAMES = NO
690
691# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
692# fully-qualified names, including namespaces. If set to NO, the class list will
693# be sorted only by class name, not including the namespace part.
694# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
695# Note: This option applies only to the class list, not to the alphabetical
696# list.
697# The default value is: NO.
698
699SORT_BY_SCOPE_NAME = NO
700
701# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
702# type resolution of all parameters of a function it will reject a match between
703# the prototype and the implementation of a member function even if there is
704# only one candidate or it is obvious which candidate to choose by doing a
705# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
706# accept a match between prototype and implementation in such cases.
707# The default value is: NO.
708
709STRICT_PROTO_MATCHING = NO
710
711# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
712# list. This list is created by putting \todo commands in the documentation.
713# The default value is: YES.
714
715GENERATE_TODOLIST = YES
716
717# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
718# list. This list is created by putting \test commands in the documentation.
719# The default value is: YES.
720
721GENERATE_TESTLIST = YES
722
723# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
724# list. This list is created by putting \bug commands in the documentation.
725# The default value is: YES.
726
727GENERATE_BUGLIST = YES
728
729# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
730# the deprecated list. This list is created by putting \deprecated commands in
731# the documentation.
732# The default value is: YES.
733
734GENERATE_DEPRECATEDLIST= YES
735
736# The ENABLED_SECTIONS tag can be used to enable conditional documentation
737# sections, marked by \if <section_label> ... \endif and \cond <section_label>
738# ... \endcond blocks.
739
740ENABLED_SECTIONS =
741
742# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
743# initial value of a variable or macro / define can have for it to appear in the
744# documentation. If the initializer consists of more lines than specified here
745# it will be hidden. Use a value of 0 to hide initializers completely. The
746# appearance of the value of individual variables and macros / defines can be
747# controlled using \showinitializer or \hideinitializer command in the
748# documentation regardless of this setting.
749# Minimum value: 0, maximum value: 10000, default value: 30.
750
751MAX_INITIALIZER_LINES = 30
752
753# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
754# the bottom of the documentation of classes and structs. If set to YES, the
755# list will mention the files that were used to generate the documentation.
756# The default value is: YES.
757
758SHOW_USED_FILES = YES
759
760# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
761# will remove the Files entry from the Quick Index and from the Folder Tree View
762# (if specified).
763# The default value is: YES.
764
765SHOW_FILES = YES
766
767# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
768# page. This will remove the Namespaces entry from the Quick Index and from the
769# Folder Tree View (if specified).
770# The default value is: YES.
771
772SHOW_NAMESPACES = YES
773
774# The FILE_VERSION_FILTER tag can be used to specify a program or script that
775# doxygen should invoke to get the current version for each file (typically from
776# the version control system). Doxygen will invoke the program by executing (via
777# popen()) the command command input-file, where command is the value of the
778# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
779# by doxygen. Whatever the program writes to standard output is used as the file
780# version. For an example see the documentation.
781
782FILE_VERSION_FILTER =
783
784# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
785# by doxygen. The layout file controls the global structure of the generated
786# output files in an output format independent way. To create the layout file
787# that represents doxygen's defaults, run doxygen with the -l option. You can
788# optionally specify a file name after the option, if omitted DoxygenLayout.xml
789# will be used as the name of the layout file. See also section "Changing the
790# layout of pages" for information.
791#
792# Note that if you run doxygen from a directory containing a file called
793# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
794# tag is left empty.
795
796LAYOUT_FILE =
797
798# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
799# the reference definitions. This must be a list of .bib files. The .bib
800# extension is automatically appended if omitted. This requires the bibtex tool
801# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
802# For LaTeX the style of the bibliography can be controlled using
803# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
804# search path. See also \cite for info how to create references.
805
806CITE_BIB_FILES =
807
808#---------------------------------------------------------------------------
809# Configuration options related to warning and progress messages
810#---------------------------------------------------------------------------
811
812# The QUIET tag can be used to turn on/off the messages that are generated to
813# standard output by doxygen. If QUIET is set to YES this implies that the
814# messages are off.
815# The default value is: NO.
816
817QUIET = NO
818
819# The WARNINGS tag can be used to turn on/off the warning messages that are
820# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
821# this implies that the warnings are on.
822#
823# Tip: Turn warnings on while writing the documentation.
824# The default value is: YES.
825
826WARNINGS = YES
827
828# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
829# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
830# will automatically be disabled.
831# The default value is: YES.
832
833WARN_IF_UNDOCUMENTED = YES
834
835# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
836# potential errors in the documentation, such as documenting some parameters in
837# a documented function twice, or documenting parameters that don't exist or
838# using markup commands wrongly.
839# The default value is: YES.
840
841WARN_IF_DOC_ERROR = YES
842
843# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
844# function parameter documentation. If set to NO, doxygen will accept that some
845# parameters have no documentation without warning.
846# The default value is: YES.
847
848WARN_IF_INCOMPLETE_DOC = YES
849
850# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
851# are documented, but have no documentation for their parameters or return
852# value. If set to NO, doxygen will only warn about wrong parameter
853# documentation, but not about the absence of documentation. If EXTRACT_ALL is
854# set to YES then this flag will automatically be disabled. See also
855# WARN_IF_INCOMPLETE_DOC
856# The default value is: NO.
857
858WARN_NO_PARAMDOC = NO
859
860# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
861# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
862# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
863# at the end of the doxygen process doxygen will return with a non-zero status.
864# Possible values are: NO, YES and FAIL_ON_WARNINGS.
865# The default value is: NO.
866
867WARN_AS_ERROR = NO
868
869# The WARN_FORMAT tag determines the format of the warning messages that doxygen
870# can produce. The string should contain the $file, $line, and $text tags, which
871# will be replaced by the file and line number from which the warning originated
872# and the warning text. Optionally the format may contain $version, which will
873# be replaced by the version of the file (if it could be obtained via
874# FILE_VERSION_FILTER)
875# See also: WARN_LINE_FORMAT
876# The default value is: $file:$line: $text.
877
878WARN_FORMAT = "$file:$line: $text"
879
880# In the $text part of the WARN_FORMAT command it is possible that a reference
881# to a more specific place is given. To make it easier to jump to this place
882# (outside of doxygen) the user can define a custom "cut" / "paste" string.
883# Example:
884# WARN_LINE_FORMAT = "'vi $file +$line'"
885# See also: WARN_FORMAT
886# The default value is: at line $line of file $file.
887
888WARN_LINE_FORMAT = "at line $line of file $file"
889
890# The WARN_LOGFILE tag can be used to specify a file to which warning and error
891# messages should be written. If left blank the output is written to standard
892# error (stderr). In case the file specified cannot be opened for writing the
893# warning and error messages are written to standard error. When as file - is
894# specified the warning and error messages are written to standard output
895# (stdout).
896
897WARN_LOGFILE =
898
899#---------------------------------------------------------------------------
900# Configuration options related to the input files
901#---------------------------------------------------------------------------
902
903# The INPUT tag is used to specify the files and/or directories that contain
904# documented source files. You may enter file names like myfile.cpp or
905# directories like /usr/src/myproject. Separate the files or directories with
906# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
907# Note: If this tag is empty the current directory is searched.
908
909INPUT = src/ include/
910
911# This tag can be used to specify the character encoding of the source files
912# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
913# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
914# documentation (see:
915# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
916# The default value is: UTF-8.
917
918INPUT_ENCODING = UTF-8
919
920# If the value of the INPUT tag contains directories, you can use the
921# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
922# *.h) to filter out the source-files in the directories.
923#
924# Note that for custom extensions or not directly supported extensions you also
925# need to set EXTENSION_MAPPING for the extension otherwise the files are not
926# read by doxygen.
927#
928# Note the list of default checked file patterns might differ from the list of
929# default file extension mappings.
930#
931# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
932# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
933# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
934# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
935# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
936# *.vhdl, *.ucf, *.qsf and *.ice.
937
938#FILE_PATTERNS = *.c *.h
939
940# The RECURSIVE tag can be used to specify whether or not subdirectories should
941# be searched for input files as well.
942# The default value is: NO.
943
944RECURSIVE = YES
945
946# The EXCLUDE tag can be used to specify files and/or directories that should be
947# excluded from the INPUT source files. This way you can easily exclude a
948# subdirectory from a directory tree whose root is specified with the INPUT tag.
949#
950# Note that relative paths are relative to the directory from which doxygen is
951# run.
952
953EXCLUDE =
954
955# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
956# directories that are symbolic links (a Unix file system feature) are excluded
957# from the input.
958# The default value is: NO.
959
960EXCLUDE_SYMLINKS = NO
961
962# If the value of the INPUT tag contains directories, you can use the
963# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
964# certain files from those directories.
965#
966# Note that the wildcards are matched against the file with absolute path, so to
967# exclude all test directories for example use the pattern */test/*
968
969EXCLUDE_PATTERNS = */tests/* */doc/*
970
971# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
972# (namespaces, classes, functions, etc.) that should be excluded from the
973# output. The symbol name can be a fully qualified name, a word, or if the
974# wildcard * is used, a substring. Examples: ANamespace, AClass,
975# ANamespace::AClass, ANamespace::*Test
976#
977# Note that the wildcards are matched against the file with absolute path, so to
978# exclude all test directories use the pattern */test/*
979
980EXCLUDE_SYMBOLS =
981
982# The EXAMPLE_PATH tag can be used to specify one or more files or directories
983# that contain example code fragments that are included (see the \include
984# command).
985
986EXAMPLE_PATH =
987
988# If the value of the EXAMPLE_PATH tag contains directories, you can use the
989# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
990# *.h) to filter out the source-files in the directories. If left blank all
991# files are included.
992
993EXAMPLE_PATTERNS = *
994
995# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
996# searched for input files to be used with the \include or \dontinclude commands
997# irrespective of the value of the RECURSIVE tag.
998# The default value is: NO.
999
1000EXAMPLE_RECURSIVE = NO
1001
1002# The IMAGE_PATH tag can be used to specify one or more files or directories
1003# that contain images that are to be included in the documentation (see the
1004# \image command).
1005
1006IMAGE_PATH =
1007
1008# The INPUT_FILTER tag can be used to specify a program that doxygen should
1009# invoke to filter for each input file. Doxygen will invoke the filter program
1010# by executing (via popen()) the command:
1011#
1012# <filter> <input-file>
1013#
1014# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
1015# name of an input file. Doxygen will then use the output that the filter
1016# program writes to standard output. If FILTER_PATTERNS is specified, this tag
1017# will be ignored.
1018#
1019# Note that the filter must not add or remove lines; it is applied before the
1020# code is scanned, but not when the output code is generated. If lines are added
1021# or removed, the anchors will not be placed correctly.
1022#
1023# Note that for custom extensions or not directly supported extensions you also
1024# need to set EXTENSION_MAPPING for the extension otherwise the files are not
1025# properly processed by doxygen.
1026
1027INPUT_FILTER =
1028
1029# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
1030# basis. Doxygen will compare the file name with each pattern and apply the
1031# filter if there is a match. The filters are a list of the form: pattern=filter
1032# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
1033# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
1034# patterns match the file name, INPUT_FILTER is applied.
1035#
1036# Note that for custom extensions or not directly supported extensions you also
1037# need to set EXTENSION_MAPPING for the extension otherwise the files are not
1038# properly processed by doxygen.
1039
1040FILTER_PATTERNS =
1041
1042# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
1043# INPUT_FILTER) will also be used to filter the input files that are used for
1044# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
1045# The default value is: NO.
1046
1047FILTER_SOURCE_FILES = NO
1048
1049# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
1050# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
1051# it is also possible to disable source filtering for a specific pattern using
1052# *.ext= (so without naming a filter).
1053# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
1054
1055FILTER_SOURCE_PATTERNS =
1056
1057# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
1058# is part of the input, its contents will be placed on the main page
1059# (index.html). This can be useful if you have a project on for instance GitHub
1060# and want to reuse the introduction page also for the doxygen output.
1061
1062USE_MDFILE_AS_MAINPAGE =
1063
1064#---------------------------------------------------------------------------
1065# Configuration options related to source browsing
1066#---------------------------------------------------------------------------
1067
1068# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
1069# generated. Documented entities will be cross-referenced with these sources.
1070#
1071# Note: To get rid of all source code in the generated output, make sure that
1072# also VERBATIM_HEADERS is set to NO.
1073# The default value is: NO.
1074
1075SOURCE_BROWSER = NO
1076
1077# Setting the INLINE_SOURCES tag to YES will include the body of functions,
1078# classes and enums directly into the documentation.
1079# The default value is: NO.
1080
1081INLINE_SOURCES = NO
1082
1083# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
1084# special comment blocks from generated source code fragments. Normal C, C++ and
1085# Fortran comments will always remain visible.
1086# The default value is: YES.
1087
1088STRIP_CODE_COMMENTS = YES
1089
1090# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
1091# entity all documented functions referencing it will be listed.
1092# The default value is: NO.
1093
1094REFERENCED_BY_RELATION = NO
1095
1096# If the REFERENCES_RELATION tag is set to YES then for each documented function
1097# all documented entities called/used by that function will be listed.
1098# The default value is: NO.
1099
1100REFERENCES_RELATION = NO
1101
1102# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
1103# to YES then the hyperlinks from functions in REFERENCES_RELATION and
1104# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
1105# link to the documentation.
1106# The default value is: YES.
1107
1108REFERENCES_LINK_SOURCE = YES
1109
1110# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
1111# source code will show a tooltip with additional information such as prototype,
1112# brief description and links to the definition and documentation. Since this
1113# will make the HTML file larger and loading of large files a bit slower, you
1114# can opt to disable this feature.
1115# The default value is: YES.
1116# This tag requires that the tag SOURCE_BROWSER is set to YES.
1117
1118SOURCE_TOOLTIPS = YES
1119
1120# If the USE_HTAGS tag is set to YES then the references to source code will
1121# point to the HTML generated by the htags(1) tool instead of doxygen built-in
1122# source browser. The htags tool is part of GNU's global source tagging system
1123# (see https://www.gnu.org/software/global/global.html). You will need version
1124# 4.8.6 or higher.
1125#
1126# To use it do the following:
1127# - Install the latest version of global
1128# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
1129# - Make sure the INPUT points to the root of the source tree
1130# - Run doxygen as normal
1131#
1132# Doxygen will invoke htags (and that will in turn invoke gtags), so these
1133# tools must be available from the command line (i.e. in the search path).
1134#
1135# The result: instead of the source browser generated by doxygen, the links to
1136# source code will now point to the output of htags.
1137# The default value is: NO.
1138# This tag requires that the tag SOURCE_BROWSER is set to YES.
1139
1140USE_HTAGS = NO
1141
1142# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
1143# verbatim copy of the header file for each class for which an include is
1144# specified. Set to NO to disable this.
1145# See also: Section \class.
1146# The default value is: YES.
1147
1148VERBATIM_HEADERS = YES
1149
1150# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
1151# clang parser (see:
1152# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
1153# performance. This can be particularly helpful with template rich C++ code for
1154# which doxygen's built-in parser lacks the necessary type information.
1155# Note: The availability of this option depends on whether or not doxygen was
1156# generated with the -Duse_libclang=ON option for CMake.
1157# The default value is: NO.
1158
1159CLANG_ASSISTED_PARSING = NO
1160
1161# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
1162# tag is set to YES then doxygen will add the directory of each input to the
1163# include path.
1164# The default value is: YES.
1165# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
1166
1167CLANG_ADD_INC_PATHS = YES
1168
1169# If clang assisted parsing is enabled you can provide the compiler with command
1170# line options that you would normally use when invoking the compiler. Note that
1171# the include paths will already be set by doxygen for the files and directories
1172# specified with INPUT and INCLUDE_PATH.
1173# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
1174
1175CLANG_OPTIONS =
1176
1177# If clang assisted parsing is enabled you can provide the clang parser with the
1178# path to the directory containing a file called compile_commands.json. This
1179# file is the compilation database (see:
1180# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
1181# options used when the source files were built. This is equivalent to
1182# specifying the -p option to a clang tool, such as clang-check. These options
1183# will then be passed to the parser. Any options specified with CLANG_OPTIONS
1184# will be added as well.
1185# Note: The availability of this option depends on whether or not doxygen was
1186# generated with the -Duse_libclang=ON option for CMake.
1187
1188CLANG_DATABASE_PATH =
1189
1190#---------------------------------------------------------------------------
1191# Configuration options related to the alphabetical class index
1192#---------------------------------------------------------------------------
1193
1194# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
1195# compounds will be generated. Enable this if the project contains a lot of
1196# classes, structs, unions or interfaces.
1197# The default value is: YES.
1198
1199ALPHABETICAL_INDEX = YES
1200
1201# In case all classes in a project start with a common prefix, all classes will
1202# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
1203# can be used to specify a prefix (or a list of prefixes) that should be ignored
1204# while generating the index headers.
1205# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
1206
1207IGNORE_PREFIX =
1208
1209#---------------------------------------------------------------------------
1210# Configuration options related to the HTML output
1211#---------------------------------------------------------------------------
1212
1213# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
1214# The default value is: YES.
1215
1216GENERATE_HTML = YES
1217
1218# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
1219# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1220# it.
1221# The default directory is: html.
1222# This tag requires that the tag GENERATE_HTML is set to YES.
1223
1224HTML_OUTPUT = html
1225
1226# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
1227# generated HTML page (for example: .htm, .php, .asp).
1228# The default value is: .html.
1229# This tag requires that the tag GENERATE_HTML is set to YES.
1230
1231HTML_FILE_EXTENSION = .html
1232
1233# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
1234# each generated HTML page. If the tag is left blank doxygen will generate a
1235# standard header.
1236#
1237# To get valid HTML the header file that includes any scripts and style sheets
1238# that doxygen needs, which is dependent on the configuration options used (e.g.
1239# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
1240# default header using
1241# doxygen -w html new_header.html new_footer.html new_stylesheet.css
1242# YourConfigFile
1243# and then modify the file new_header.html. See also section "Doxygen usage"
1244# for information on how to generate the default header that doxygen normally
1245# uses.
1246# Note: The header is subject to change so you typically have to regenerate the
1247# default header when upgrading to a newer version of doxygen. For a description
1248# of the possible markers and block names see the documentation.
1249# This tag requires that the tag GENERATE_HTML is set to YES.
1250
1251HTML_HEADER =
1252
1253# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
1254# generated HTML page. If the tag is left blank doxygen will generate a standard
1255# footer. See HTML_HEADER for more information on how to generate a default
1256# footer and what special commands can be used inside the footer. See also
1257# section "Doxygen usage" for information on how to generate the default footer
1258# that doxygen normally uses.
1259# This tag requires that the tag GENERATE_HTML is set to YES.
1260
1261HTML_FOOTER =
1262
1263# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
1264# sheet that is used by each HTML page. It can be used to fine-tune the look of
1265# the HTML output. If left blank doxygen will generate a default style sheet.
1266# See also section "Doxygen usage" for information on how to generate the style
1267# sheet that doxygen normally uses.
1268# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
1269# it is more robust and this tag (HTML_STYLESHEET) will in the future become
1270# obsolete.
1271# This tag requires that the tag GENERATE_HTML is set to YES.
1272
1273HTML_STYLESHEET =
1274
1275# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
1276# cascading style sheets that are included after the standard style sheets
1277# created by doxygen. Using this option one can overrule certain style aspects.
1278# This is preferred over using HTML_STYLESHEET since it does not replace the
1279# standard style sheet and is therefore more robust against future updates.
1280# Doxygen will copy the style sheet files to the output directory.
1281# Note: The order of the extra style sheet files is of importance (e.g. the last
1282# style sheet in the list overrules the setting of the previous ones in the
1283# list). For an example see the documentation.
1284# This tag requires that the tag GENERATE_HTML is set to YES.
1285
1286HTML_EXTRA_STYLESHEET =
1287
1288# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
1289# other source files which should be copied to the HTML output directory. Note
1290# that these files will be copied to the base HTML output directory. Use the
1291# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
1292# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
1293# files will be copied as-is; there are no commands or markers available.
1294# This tag requires that the tag GENERATE_HTML is set to YES.
1295
1296HTML_EXTRA_FILES =
1297
1298# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
1299# will adjust the colors in the style sheet and background images according to
1300# this color. Hue is specified as an angle on a color-wheel, see
1301# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
1302# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
1303# purple, and 360 is red again.
1304# Minimum value: 0, maximum value: 359, default value: 220.
1305# This tag requires that the tag GENERATE_HTML is set to YES.
1306
1307HTML_COLORSTYLE_HUE = 220
1308
1309# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
1310# in the HTML output. For a value of 0 the output will use gray-scales only. A
1311# value of 255 will produce the most vivid colors.
1312# Minimum value: 0, maximum value: 255, default value: 100.
1313# This tag requires that the tag GENERATE_HTML is set to YES.
1314
1315HTML_COLORSTYLE_SAT = 100
1316
1317# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
1318# luminance component of the colors in the HTML output. Values below 100
1319# gradually make the output lighter, whereas values above 100 make the output
1320# darker. The value divided by 100 is the actual gamma applied, so 80 represents
1321# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
1322# change the gamma.
1323# Minimum value: 40, maximum value: 240, default value: 80.
1324# This tag requires that the tag GENERATE_HTML is set to YES.
1325
1326HTML_COLORSTYLE_GAMMA = 80
1327
1328# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
1329# page will contain the date and time when the page was generated. Setting this
1330# to YES can help to show when doxygen was last run and thus if the
1331# documentation is up to date.
1332# The default value is: NO.
1333# This tag requires that the tag GENERATE_HTML is set to YES.
1334
1335HTML_TIMESTAMP = NO
1336
1337# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
1338# documentation will contain a main index with vertical navigation menus that
1339# are dynamically created via JavaScript. If disabled, the navigation index will
1340# consists of multiple levels of tabs that are statically embedded in every HTML
1341# page. Disable this option to support browsers that do not have JavaScript,
1342# like the Qt help browser.
1343# The default value is: YES.
1344# This tag requires that the tag GENERATE_HTML is set to YES.
1345
1346HTML_DYNAMIC_MENUS = YES
1347
1348# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
1349# documentation will contain sections that can be hidden and shown after the
1350# page has loaded.
1351# The default value is: NO.
1352# This tag requires that the tag GENERATE_HTML is set to YES.
1353
1354HTML_DYNAMIC_SECTIONS = NO
1355
1356# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
1357# shown in the various tree structured indices initially; the user can expand
1358# and collapse entries dynamically later on. Doxygen will expand the tree to
1359# such a level that at most the specified number of entries are visible (unless
1360# a fully collapsed tree already exceeds this amount). So setting the number of
1361# entries 1 will produce a full collapsed tree by default. 0 is a special value
1362# representing an infinite number of entries and will result in a full expanded
1363# tree by default.
1364# Minimum value: 0, maximum value: 9999, default value: 100.
1365# This tag requires that the tag GENERATE_HTML is set to YES.
1366
1367HTML_INDEX_NUM_ENTRIES = 100
1368
1369# If the GENERATE_DOCSET tag is set to YES, additional index files will be
1370# generated that can be used as input for Apple's Xcode 3 integrated development
1371# environment (see:
1372# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
1373# create a documentation set, doxygen will generate a Makefile in the HTML
1374# output directory. Running make will produce the docset in that directory and
1375# running make install will install the docset in
1376# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
1377# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
1378# genXcode/_index.html for more information.
1379# The default value is: NO.
1380# This tag requires that the tag GENERATE_HTML is set to YES.
1381
1382GENERATE_DOCSET = NO
1383
1384# This tag determines the name of the docset feed. A documentation feed provides
1385# an umbrella under which multiple documentation sets from a single provider
1386# (such as a company or product suite) can be grouped.
1387# The default value is: Doxygen generated docs.
1388# This tag requires that the tag GENERATE_DOCSET is set to YES.
1389
1390DOCSET_FEEDNAME = "Doxygen generated docs"
1391
1392# This tag determines the URL of the docset feed. A documentation feed provides
1393# an umbrella under which multiple documentation sets from a single provider
1394# (such as a company or product suite) can be grouped.
1395# This tag requires that the tag GENERATE_DOCSET is set to YES.
1396
1397DOCSET_FEEDURL =
1398
1399# This tag specifies a string that should uniquely identify the documentation
1400# set bundle. This should be a reverse domain-name style string, e.g.
1401# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
1402# The default value is: org.doxygen.Project.
1403# This tag requires that the tag GENERATE_DOCSET is set to YES.
1404
1405DOCSET_BUNDLE_ID = org.doxygen.Project
1406
1407# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
1408# the documentation publisher. This should be a reverse domain-name style
1409# string, e.g. com.mycompany.MyDocSet.documentation.
1410# The default value is: org.doxygen.Publisher.
1411# This tag requires that the tag GENERATE_DOCSET is set to YES.
1412
1413DOCSET_PUBLISHER_ID = org.doxygen.Publisher
1414
1415# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
1416# The default value is: Publisher.
1417# This tag requires that the tag GENERATE_DOCSET is set to YES.
1418
1419DOCSET_PUBLISHER_NAME = Publisher
1420
1421# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
1422# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
1423# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
1424# on Windows. In the beginning of 2021 Microsoft took the original page, with
1425# a.o. the download links, offline the HTML help workshop was already many years
1426# in maintenance mode). You can download the HTML help workshop from the web
1427# archives at Installation executable (see:
1428# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
1429# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
1430#
1431# The HTML Help Workshop contains a compiler that can convert all HTML output
1432# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
1433# files are now used as the Windows 98 help format, and will replace the old
1434# Windows help format (.hlp) on all Windows platforms in the future. Compressed
1435# HTML files also contain an index, a table of contents, and you can search for
1436# words in the documentation. The HTML workshop also contains a viewer for
1437# compressed HTML files.
1438# The default value is: NO.
1439# This tag requires that the tag GENERATE_HTML is set to YES.
1440
1441GENERATE_HTMLHELP = NO
1442
1443# The CHM_FILE tag can be used to specify the file name of the resulting .chm
1444# file. You can add a path in front of the file if the result should not be
1445# written to the html output directory.
1446# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1447
1448CHM_FILE =
1449
1450# The HHC_LOCATION tag can be used to specify the location (absolute path
1451# including file name) of the HTML help compiler (hhc.exe). If non-empty,
1452# doxygen will try to run the HTML help compiler on the generated index.hhp.
1453# The file has to be specified with full path.
1454# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1455
1456HHC_LOCATION =
1457
1458# The GENERATE_CHI flag controls if a separate .chi index file is generated
1459# (YES) or that it should be included in the main .chm file (NO).
1460# The default value is: NO.
1461# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1462
1463GENERATE_CHI = NO
1464
1465# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
1466# and project file content.
1467# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1468
1469CHM_INDEX_ENCODING =
1470
1471# The BINARY_TOC flag controls whether a binary table of contents is generated
1472# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
1473# enables the Previous and Next buttons.
1474# The default value is: NO.
1475# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1476
1477BINARY_TOC = NO
1478
1479# The TOC_EXPAND flag can be set to YES to add extra items for group members to
1480# the table of contents of the HTML help documentation and to the tree view.
1481# The default value is: NO.
1482# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1483
1484TOC_EXPAND = NO
1485
1486# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
1487# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
1488# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
1489# (.qch) of the generated HTML documentation.
1490# The default value is: NO.
1491# This tag requires that the tag GENERATE_HTML is set to YES.
1492
1493GENERATE_QHP = NO
1494
1495# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
1496# the file name of the resulting .qch file. The path specified is relative to
1497# the HTML output folder.
1498# This tag requires that the tag GENERATE_QHP is set to YES.
1499
1500QCH_FILE =
1501
1502# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
1503# Project output. For more information please see Qt Help Project / Namespace
1504# (see:
1505# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
1506# The default value is: org.doxygen.Project.
1507# This tag requires that the tag GENERATE_QHP is set to YES.
1508
1509QHP_NAMESPACE = org.doxygen.Project
1510
1511# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
1512# Help Project output. For more information please see Qt Help Project / Virtual
1513# Folders (see:
1514# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
1515# The default value is: doc.
1516# This tag requires that the tag GENERATE_QHP is set to YES.
1517
1518QHP_VIRTUAL_FOLDER = doc
1519
1520# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
1521# filter to add. For more information please see Qt Help Project / Custom
1522# Filters (see:
1523# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
1524# This tag requires that the tag GENERATE_QHP is set to YES.
1525
1526QHP_CUST_FILTER_NAME =
1527
1528# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
1529# custom filter to add. For more information please see Qt Help Project / Custom
1530# Filters (see:
1531# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
1532# This tag requires that the tag GENERATE_QHP is set to YES.
1533
1534QHP_CUST_FILTER_ATTRS =
1535
1536# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
1537# project's filter section matches. Qt Help Project / Filter Attributes (see:
1538# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
1539# This tag requires that the tag GENERATE_QHP is set to YES.
1540
1541QHP_SECT_FILTER_ATTRS =
1542
1543# The QHG_LOCATION tag can be used to specify the location (absolute path
1544# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
1545# run qhelpgenerator on the generated .qhp file.
1546# This tag requires that the tag GENERATE_QHP is set to YES.
1547
1548QHG_LOCATION =
1549
1550# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
1551# generated, together with the HTML files, they form an Eclipse help plugin. To
1552# install this plugin and make it available under the help contents menu in
1553# Eclipse, the contents of the directory containing the HTML and XML files needs
1554# to be copied into the plugins directory of eclipse. The name of the directory
1555# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
1556# After copying Eclipse needs to be restarted before the help appears.
1557# The default value is: NO.
1558# This tag requires that the tag GENERATE_HTML is set to YES.
1559
1560GENERATE_ECLIPSEHELP = NO
1561
1562# A unique identifier for the Eclipse help plugin. When installing the plugin
1563# the directory name containing the HTML and XML files should also have this
1564# name. Each documentation set should have its own identifier.
1565# The default value is: org.doxygen.Project.
1566# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
1567
1568ECLIPSE_DOC_ID = org.doxygen.Project
1569
1570# If you want full control over the layout of the generated HTML pages it might
1571# be necessary to disable the index and replace it with your own. The
1572# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
1573# of each HTML page. A value of NO enables the index and the value YES disables
1574# it. Since the tabs in the index contain the same information as the navigation
1575# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
1576# The default value is: NO.
1577# This tag requires that the tag GENERATE_HTML is set to YES.
1578
1579DISABLE_INDEX = NO
1580
1581# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
1582# structure should be generated to display hierarchical information. If the tag
1583# value is set to YES, a side panel will be generated containing a tree-like
1584# index structure (just like the one that is generated for HTML Help). For this
1585# to work a browser that supports JavaScript, DHTML, CSS and frames is required
1586# (i.e. any modern browser). Windows users are probably better off using the
1587# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
1588# further fine tune the look of the index (see "Fine-tuning the output"). As an
1589# example, the default style sheet generated by doxygen has an example that
1590# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
1591# Since the tree basically has the same information as the tab index, you could
1592# consider setting DISABLE_INDEX to YES when enabling this option.
1593# The default value is: NO.
1594# This tag requires that the tag GENERATE_HTML is set to YES.
1595
1596GENERATE_TREEVIEW = NO
1597
1598# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
1599# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
1600# area (value NO) or if it should extend to the full height of the window (value
1601# YES). Setting this to YES gives a layout similar to
1602# https://docs.readthedocs.io with more room for contents, but less room for the
1603# project logo, title, and description. If either GENERATE_TREEVIEW or
1604# DISABLE_INDEX is set to NO, this option has no effect.
1605# The default value is: NO.
1606# This tag requires that the tag GENERATE_HTML is set to YES.
1607
1608FULL_SIDEBAR = NO
1609
1610# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
1611# doxygen will group on one line in the generated HTML documentation.
1612#
1613# Note that a value of 0 will completely suppress the enum values from appearing
1614# in the overview section.
1615# Minimum value: 0, maximum value: 20, default value: 4.
1616# This tag requires that the tag GENERATE_HTML is set to YES.
1617
1618ENUM_VALUES_PER_LINE = 4
1619
1620# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
1621# to set the initial width (in pixels) of the frame in which the tree is shown.
1622# Minimum value: 0, maximum value: 1500, default value: 250.
1623# This tag requires that the tag GENERATE_HTML is set to YES.
1624
1625TREEVIEW_WIDTH = 250
1626
1627# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
1628# external symbols imported via tag files in a separate window.
1629# The default value is: NO.
1630# This tag requires that the tag GENERATE_HTML is set to YES.
1631
1632EXT_LINKS_IN_WINDOW = NO
1633
1634# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
1635# addresses.
1636# The default value is: YES.
1637# This tag requires that the tag GENERATE_HTML is set to YES.
1638
1639OBFUSCATE_EMAILS = YES
1640
1641# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
1642# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
1643# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
1644# the HTML output. These images will generally look nicer at scaled resolutions.
1645# Possible values are: png (the default) and svg (looks nicer but requires the
1646# pdf2svg or inkscape tool).
1647# The default value is: png.
1648# This tag requires that the tag GENERATE_HTML is set to YES.
1649
1650HTML_FORMULA_FORMAT = png
1651
1652# Use this tag to change the font size of LaTeX formulas included as images in
1653# the HTML documentation. When you change the font size after a successful
1654# doxygen run you need to manually remove any form_*.png images from the HTML
1655# output directory to force them to be regenerated.
1656# Minimum value: 8, maximum value: 50, default value: 10.
1657# This tag requires that the tag GENERATE_HTML is set to YES.
1658
1659FORMULA_FONTSIZE = 10
1660
1661# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
1662# generated for formulas are transparent PNGs. Transparent PNGs are not
1663# supported properly for IE 6.0, but are supported on all modern browsers.
1664#
1665# Note that when changing this option you need to delete any form_*.png files in
1666# the HTML output directory before the changes have effect.
1667# The default value is: YES.
1668# This tag requires that the tag GENERATE_HTML is set to YES.
1669
1670FORMULA_TRANSPARENT = YES
1671
1672# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
1673# to create new LaTeX commands to be used in formulas as building blocks. See
1674# the section "Including formulas" for details.
1675
1676FORMULA_MACROFILE =
1677
1678# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
1679# https://www.mathjax.org) which uses client side JavaScript for the rendering
1680# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
1681# installed or if you want to formulas look prettier in the HTML output. When
1682# enabled you may also need to install MathJax separately and configure the path
1683# to it using the MATHJAX_RELPATH option.
1684# The default value is: NO.
1685# This tag requires that the tag GENERATE_HTML is set to YES.
1686
1687USE_MATHJAX = NO
1688
1689# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
1690# Note that the different versions of MathJax have different requirements with
1691# regards to the different settings, so it is possible that also other MathJax
1692# settings have to be changed when switching between the different MathJax
1693# versions.
1694# Possible values are: MathJax_2 and MathJax_3.
1695# The default value is: MathJax_2.
1696# This tag requires that the tag USE_MATHJAX is set to YES.
1697
1698MATHJAX_VERSION = MathJax_2
1699
1700# When MathJax is enabled you can set the default output format to be used for
1701# the MathJax output. For more details about the output format see MathJax
1702# version 2 (see:
1703# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
1704# (see:
1705# http://docs.mathjax.org/en/latest/web/components/output.html).
1706# Possible values are: HTML-CSS (which is slower, but has the best
1707# compatibility. This is the name for Mathjax version 2, for MathJax version 3
1708# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
1709# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
1710# is the name for Mathjax version 3, for MathJax version 2 this will be
1711# translated into HTML-CSS) and SVG.
1712# The default value is: HTML-CSS.
1713# This tag requires that the tag USE_MATHJAX is set to YES.
1714
1715MATHJAX_FORMAT = HTML-CSS
1716
1717# When MathJax is enabled you need to specify the location relative to the HTML
1718# output directory using the MATHJAX_RELPATH option. The destination directory
1719# should contain the MathJax.js script. For instance, if the mathjax directory
1720# is located at the same level as the HTML output directory, then
1721# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
1722# Content Delivery Network so you can quickly see the result without installing
1723# MathJax. However, it is strongly recommended to install a local copy of
1724# MathJax from https://www.mathjax.org before deployment. The default value is:
1725# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
1726# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
1727# This tag requires that the tag USE_MATHJAX is set to YES.
1728
1729MATHJAX_RELPATH =
1730
1731# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
1732# extension names that should be enabled during MathJax rendering. For example
1733# for MathJax version 2 (see
1734# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
1735# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
1736# For example for MathJax version 3 (see
1737# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
1738# MATHJAX_EXTENSIONS = ams
1739# This tag requires that the tag USE_MATHJAX is set to YES.
1740
1741MATHJAX_EXTENSIONS =
1742
1743# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
1744# of code that will be used on startup of the MathJax code. See the MathJax site
1745# (see:
1746# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
1747# example see the documentation.
1748# This tag requires that the tag USE_MATHJAX is set to YES.
1749
1750MATHJAX_CODEFILE =
1751
1752# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
1753# the HTML output. The underlying search engine uses javascript and DHTML and
1754# should work on any modern browser. Note that when using HTML help
1755# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
1756# there is already a search function so this one should typically be disabled.
1757# For large projects the javascript based search engine can be slow, then
1758# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
1759# search using the keyboard; to jump to the search box use <access key> + S
1760# (what the <access key> is depends on the OS and browser, but it is typically
1761# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
1762# key> to jump into the search results window, the results can be navigated
1763# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
1764# the search. The filter options can be selected when the cursor is inside the
1765# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
1766# to select a filter and <Enter> or <escape> to activate or cancel the filter
1767# option.
1768# The default value is: YES.
1769# This tag requires that the tag GENERATE_HTML is set to YES.
1770
1771SEARCHENGINE = YES
1772
1773# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
1774# implemented using a web server instead of a web client using JavaScript. There
1775# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
1776# setting. When disabled, doxygen will generate a PHP script for searching and
1777# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
1778# and searching needs to be provided by external tools. See the section
1779# "External Indexing and Searching" for details.
1780# The default value is: NO.
1781# This tag requires that the tag SEARCHENGINE is set to YES.
1782
1783SERVER_BASED_SEARCH = NO
1784
1785# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
1786# script for searching. Instead the search results are written to an XML file
1787# which needs to be processed by an external indexer. Doxygen will invoke an
1788# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
1789# search results.
1790#
1791# Doxygen ships with an example indexer (doxyindexer) and search engine
1792# (doxysearch.cgi) which are based on the open source search engine library
1793# Xapian (see:
1794# https://xapian.org/).
1795#
1796# See the section "External Indexing and Searching" for details.
1797# The default value is: NO.
1798# This tag requires that the tag SEARCHENGINE is set to YES.
1799
1800EXTERNAL_SEARCH = NO
1801
1802# The SEARCHENGINE_URL should point to a search engine hosted by a web server
1803# which will return the search results when EXTERNAL_SEARCH is enabled.
1804#
1805# Doxygen ships with an example indexer (doxyindexer) and search engine
1806# (doxysearch.cgi) which are based on the open source search engine library
1807# Xapian (see:
1808# https://xapian.org/). See the section "External Indexing and Searching" for
1809# details.
1810# This tag requires that the tag SEARCHENGINE is set to YES.
1811
1812SEARCHENGINE_URL =
1813
1814# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
1815# search data is written to a file for indexing by an external tool. With the
1816# SEARCHDATA_FILE tag the name of this file can be specified.
1817# The default file is: searchdata.xml.
1818# This tag requires that the tag SEARCHENGINE is set to YES.
1819
1820SEARCHDATA_FILE = searchdata.xml
1821
1822# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
1823# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
1824# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
1825# projects and redirect the results back to the right project.
1826# This tag requires that the tag SEARCHENGINE is set to YES.
1827
1828EXTERNAL_SEARCH_ID =
1829
1830# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
1831# projects other than the one defined by this configuration file, but that are
1832# all added to the same external search index. Each project needs to have a
1833# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
1834# to a relative location where the documentation can be found. The format is:
1835# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
1836# This tag requires that the tag SEARCHENGINE is set to YES.
1837
1838EXTRA_SEARCH_MAPPINGS =
1839
1840#---------------------------------------------------------------------------
1841# Configuration options related to the LaTeX output
1842#---------------------------------------------------------------------------
1843
1844# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
1845# The default value is: YES.
1846
1847GENERATE_LATEX = NO
1848
1849# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
1850# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1851# it.
1852# The default directory is: latex.
1853# This tag requires that the tag GENERATE_LATEX is set to YES.
1854
1855LATEX_OUTPUT = latex
1856
1857# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
1858# invoked.
1859#
1860# Note that when not enabling USE_PDFLATEX the default is latex when enabling
1861# USE_PDFLATEX the default is pdflatex and when in the later case latex is
1862# chosen this is overwritten by pdflatex. For specific output languages the
1863# default can have been set differently, this depends on the implementation of
1864# the output language.
1865# This tag requires that the tag GENERATE_LATEX is set to YES.
1866
1867LATEX_CMD_NAME =
1868
1869# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
1870# index for LaTeX.
1871# Note: This tag is used in the Makefile / make.bat.
1872# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
1873# (.tex).
1874# The default file is: makeindex.
1875# This tag requires that the tag GENERATE_LATEX is set to YES.
1876
1877MAKEINDEX_CMD_NAME = makeindex
1878
1879# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
1880# generate index for LaTeX. In case there is no backslash (\) as first character
1881# it will be automatically added in the LaTeX code.
1882# Note: This tag is used in the generated output file (.tex).
1883# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
1884# The default value is: makeindex.
1885# This tag requires that the tag GENERATE_LATEX is set to YES.
1886
1887LATEX_MAKEINDEX_CMD = makeindex
1888
1889# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
1890# documents. This may be useful for small projects and may help to save some
1891# trees in general.
1892# The default value is: NO.
1893# This tag requires that the tag GENERATE_LATEX is set to YES.
1894
1895COMPACT_LATEX = NO
1896
1897# The PAPER_TYPE tag can be used to set the paper type that is used by the
1898# printer.
1899# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
1900# 14 inches) and executive (7.25 x 10.5 inches).
1901# The default value is: a4.
1902# This tag requires that the tag GENERATE_LATEX is set to YES.
1903
1904PAPER_TYPE = a4
1905
1906# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
1907# that should be included in the LaTeX output. The package can be specified just
1908# by its name or with the correct syntax as to be used with the LaTeX
1909# \usepackage command. To get the times font for instance you can specify :
1910# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
1911# To use the option intlimits with the amsmath package you can specify:
1912# EXTRA_PACKAGES=[intlimits]{amsmath}
1913# If left blank no extra packages will be included.
1914# This tag requires that the tag GENERATE_LATEX is set to YES.
1915
1916EXTRA_PACKAGES =
1917
1918# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
1919# the generated LaTeX document. The header should contain everything until the
1920# first chapter. If it is left blank doxygen will generate a standard header. It
1921# is highly recommended to start with a default header using
1922# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
1923# and then modify the file new_header.tex. See also section "Doxygen usage" for
1924# information on how to generate the default header that doxygen normally uses.
1925#
1926# Note: Only use a user-defined header if you know what you are doing!
1927# Note: The header is subject to change so you typically have to regenerate the
1928# default header when upgrading to a newer version of doxygen. The following
1929# commands have a special meaning inside the header (and footer): For a
1930# description of the possible markers and block names see the documentation.
1931# This tag requires that the tag GENERATE_LATEX is set to YES.
1932
1933LATEX_HEADER =
1934
1935# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
1936# the generated LaTeX document. The footer should contain everything after the
1937# last chapter. If it is left blank doxygen will generate a standard footer. See
1938# LATEX_HEADER for more information on how to generate a default footer and what
1939# special commands can be used inside the footer. See also section "Doxygen
1940# usage" for information on how to generate the default footer that doxygen
1941# normally uses. Note: Only use a user-defined footer if you know what you are
1942# doing!
1943# This tag requires that the tag GENERATE_LATEX is set to YES.
1944
1945LATEX_FOOTER =
1946
1947# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
1948# LaTeX style sheets that are included after the standard style sheets created
1949# by doxygen. Using this option one can overrule certain style aspects. Doxygen
1950# will copy the style sheet files to the output directory.
1951# Note: The order of the extra style sheet files is of importance (e.g. the last
1952# style sheet in the list overrules the setting of the previous ones in the
1953# list).
1954# This tag requires that the tag GENERATE_LATEX is set to YES.
1955
1956LATEX_EXTRA_STYLESHEET =
1957
1958# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
1959# other source files which should be copied to the LATEX_OUTPUT output
1960# directory. Note that the files will be copied as-is; there are no commands or
1961# markers available.
1962# This tag requires that the tag GENERATE_LATEX is set to YES.
1963
1964LATEX_EXTRA_FILES =
1965
1966# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
1967# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
1968# contain links (just like the HTML output) instead of page references. This
1969# makes the output suitable for online browsing using a PDF viewer.
1970# The default value is: YES.
1971# This tag requires that the tag GENERATE_LATEX is set to YES.
1972
1973PDF_HYPERLINKS = YES
1974
1975# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
1976# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
1977# files. Set this option to YES, to get a higher quality PDF documentation.
1978#
1979# See also section LATEX_CMD_NAME for selecting the engine.
1980# The default value is: YES.
1981# This tag requires that the tag GENERATE_LATEX is set to YES.
1982
1983USE_PDFLATEX = YES
1984
1985# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
1986# command to the generated LaTeX files. This will instruct LaTeX to keep running
1987# if errors occur, instead of asking the user for help.
1988# The default value is: NO.
1989# This tag requires that the tag GENERATE_LATEX is set to YES.
1990
1991LATEX_BATCHMODE = NO
1992
1993# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
1994# index chapters (such as File Index, Compound Index, etc.) in the output.
1995# The default value is: NO.
1996# This tag requires that the tag GENERATE_LATEX is set to YES.
1997
1998LATEX_HIDE_INDICES = NO
1999
2000# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
2001# bibliography, e.g. plainnat, or ieeetr. See
2002# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
2003# The default value is: plain.
2004# This tag requires that the tag GENERATE_LATEX is set to YES.
2005
2006LATEX_BIB_STYLE = plain
2007
2008# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
2009# page will contain the date and time when the page was generated. Setting this
2010# to NO can help when comparing the output of multiple runs.
2011# The default value is: NO.
2012# This tag requires that the tag GENERATE_LATEX is set to YES.
2013
2014LATEX_TIMESTAMP = NO
2015
2016# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
2017# path from which the emoji images will be read. If a relative path is entered,
2018# it will be relative to the LATEX_OUTPUT directory. If left blank the
2019# LATEX_OUTPUT directory will be used.
2020# This tag requires that the tag GENERATE_LATEX is set to YES.
2021
2022LATEX_EMOJI_DIRECTORY =
2023
2024#---------------------------------------------------------------------------
2025# Configuration options related to the RTF output
2026#---------------------------------------------------------------------------
2027
2028# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
2029# RTF output is optimized for Word 97 and may not look too pretty with other RTF
2030# readers/editors.
2031# The default value is: NO.
2032
2033GENERATE_RTF = NO
2034
2035# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
2036# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2037# it.
2038# The default directory is: rtf.
2039# This tag requires that the tag GENERATE_RTF is set to YES.
2040
2041RTF_OUTPUT = rtf
2042
2043# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
2044# documents. This may be useful for small projects and may help to save some
2045# trees in general.
2046# The default value is: NO.
2047# This tag requires that the tag GENERATE_RTF is set to YES.
2048
2049COMPACT_RTF = NO
2050
2051# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
2052# contain hyperlink fields. The RTF file will contain links (just like the HTML
2053# output) instead of page references. This makes the output suitable for online
2054# browsing using Word or some other Word compatible readers that support those
2055# fields.
2056#
2057# Note: WordPad (write) and others do not support links.
2058# The default value is: NO.
2059# This tag requires that the tag GENERATE_RTF is set to YES.
2060
2061RTF_HYPERLINKS = NO
2062
2063# Load stylesheet definitions from file. Syntax is similar to doxygen's
2064# configuration file, i.e. a series of assignments. You only have to provide
2065# replacements, missing definitions are set to their default value.
2066#
2067# See also section "Doxygen usage" for information on how to generate the
2068# default style sheet that doxygen normally uses.
2069# This tag requires that the tag GENERATE_RTF is set to YES.
2070
2071RTF_STYLESHEET_FILE =
2072
2073# Set optional variables used in the generation of an RTF document. Syntax is
2074# similar to doxygen's configuration file. A template extensions file can be
2075# generated using doxygen -e rtf extensionFile.
2076# This tag requires that the tag GENERATE_RTF is set to YES.
2077
2078RTF_EXTENSIONS_FILE =
2079
2080#---------------------------------------------------------------------------
2081# Configuration options related to the man page output
2082#---------------------------------------------------------------------------
2083
2084# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
2085# classes and files.
2086# The default value is: NO.
2087
2088GENERATE_MAN = NO
2089
2090# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
2091# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2092# it. A directory man3 will be created inside the directory specified by
2093# MAN_OUTPUT.
2094# The default directory is: man.
2095# This tag requires that the tag GENERATE_MAN is set to YES.
2096
2097MAN_OUTPUT = man
2098
2099# The MAN_EXTENSION tag determines the extension that is added to the generated
2100# man pages. In case the manual section does not start with a number, the number
2101# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
2102# optional.
2103# The default value is: .3.
2104# This tag requires that the tag GENERATE_MAN is set to YES.
2105
2106MAN_EXTENSION = .3
2107
2108# The MAN_SUBDIR tag determines the name of the directory created within
2109# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
2110# MAN_EXTENSION with the initial . removed.
2111# This tag requires that the tag GENERATE_MAN is set to YES.
2112
2113MAN_SUBDIR =
2114
2115# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
2116# will generate one additional man file for each entity documented in the real
2117# man page(s). These additional files only source the real man page, but without
2118# them the man command would be unable to find the correct page.
2119# The default value is: NO.
2120# This tag requires that the tag GENERATE_MAN is set to YES.
2121
2122MAN_LINKS = NO
2123
2124#---------------------------------------------------------------------------
2125# Configuration options related to the XML output
2126#---------------------------------------------------------------------------
2127
2128# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
2129# captures the structure of the code including all documentation.
2130# The default value is: NO.
2131
2132GENERATE_XML = YES
2133
2134# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
2135# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2136# it.
2137# The default directory is: xml.
2138# This tag requires that the tag GENERATE_XML is set to YES.
2139
2140XML_OUTPUT = doxyxml
2141
2142# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
2143# listings (including syntax highlighting and cross-referencing information) to
2144# the XML output. Note that enabling this will significantly increase the size
2145# of the XML output.
2146# The default value is: YES.
2147# This tag requires that the tag GENERATE_XML is set to YES.
2148
2149XML_PROGRAMLISTING = YES
2150
2151# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
2152# namespace members in file scope as well, matching the HTML output.
2153# The default value is: NO.
2154# This tag requires that the tag GENERATE_XML is set to YES.
2155
2156XML_NS_MEMB_FILE_SCOPE = NO
2157
2158#---------------------------------------------------------------------------
2159# Configuration options related to the DOCBOOK output
2160#---------------------------------------------------------------------------
2161
2162# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
2163# that can be used to generate PDF.
2164# The default value is: NO.
2165
2166GENERATE_DOCBOOK = NO
2167
2168# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
2169# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
2170# front of it.
2171# The default directory is: docbook.
2172# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
2173
2174DOCBOOK_OUTPUT = docbook
2175
2176#---------------------------------------------------------------------------
2177# Configuration options for the AutoGen Definitions output
2178#---------------------------------------------------------------------------
2179
2180# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
2181# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
2182# the structure of the code including all documentation. Note that this feature
2183# is still experimental and incomplete at the moment.
2184# The default value is: NO.
2185
2186GENERATE_AUTOGEN_DEF = NO
2187
2188#---------------------------------------------------------------------------
2189# Configuration options related to the Perl module output
2190#---------------------------------------------------------------------------
2191
2192# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
2193# file that captures the structure of the code including all documentation.
2194#
2195# Note that this feature is still experimental and incomplete at the moment.
2196# The default value is: NO.
2197
2198GENERATE_PERLMOD = NO
2199
2200# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
2201# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
2202# output from the Perl module output.
2203# The default value is: NO.
2204# This tag requires that the tag GENERATE_PERLMOD is set to YES.
2205
2206PERLMOD_LATEX = NO
2207
2208# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
2209# formatted so it can be parsed by a human reader. This is useful if you want to
2210# understand what is going on. On the other hand, if this tag is set to NO, the
2211# size of the Perl module output will be much smaller and Perl will parse it
2212# just the same.
2213# The default value is: YES.
2214# This tag requires that the tag GENERATE_PERLMOD is set to YES.
2215
2216PERLMOD_PRETTY = YES
2217
2218# The names of the make variables in the generated doxyrules.make file are
2219# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
2220# so different doxyrules.make files included by the same Makefile don't
2221# overwrite each other's variables.
2222# This tag requires that the tag GENERATE_PERLMOD is set to YES.
2223
2224PERLMOD_MAKEVAR_PREFIX =
2225
2226#---------------------------------------------------------------------------
2227# Configuration options related to the preprocessor
2228#---------------------------------------------------------------------------
2229
2230# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
2231# C-preprocessor directives found in the sources and include files.
2232# The default value is: YES.
2233
2234ENABLE_PREPROCESSING = YES
2235
2236# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
2237# in the source code. If set to NO, only conditional compilation will be
2238# performed. Macro expansion can be done in a controlled way by setting
2239# EXPAND_ONLY_PREDEF to YES.
2240# The default value is: NO.
2241# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2242
2243MACRO_EXPANSION = NO
2244
2245# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
2246# the macro expansion is limited to the macros specified with the PREDEFINED and
2247# EXPAND_AS_DEFINED tags.
2248# The default value is: NO.
2249# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2250
2251EXPAND_ONLY_PREDEF = NO
2252
2253# If the SEARCH_INCLUDES tag is set to YES, the include files in the
2254# INCLUDE_PATH will be searched if a #include is found.
2255# The default value is: YES.
2256# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2257
2258SEARCH_INCLUDES = YES
2259
2260# The INCLUDE_PATH tag can be used to specify one or more directories that
2261# contain include files that are not input files but should be processed by the
2262# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
2263# RECURSIVE has no effect here.
2264# This tag requires that the tag SEARCH_INCLUDES is set to YES.
2265
2266INCLUDE_PATH =
2267
2268# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
2269# patterns (like *.h and *.hpp) to filter out the header-files in the
2270# directories. If left blank, the patterns specified with FILE_PATTERNS will be
2271# used.
2272# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2273
2274INCLUDE_FILE_PATTERNS =
2275
2276# The PREDEFINED tag can be used to specify one or more macro names that are
2277# defined before the preprocessor is started (similar to the -D option of e.g.
2278# gcc). The argument of the tag is a list of macros of the form: name or
2279# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
2280# is assumed. To prevent a macro definition from being undefined via #undef or
2281# recursively expanded use the := operator instead of the = operator.
2282# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2283
2284PREDEFINED =
2285
2286# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
2287# tag can be used to specify a list of macro names that should be expanded. The
2288# macro definition that is found in the sources will be used. Use the PREDEFINED
2289# tag if you want to use a different macro definition that overrules the
2290# definition found in the source code.
2291# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2292
2293EXPAND_AS_DEFINED =
2294
2295# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
2296# remove all references to function-like macros that are alone on a line, have
2297# an all uppercase name, and do not end with a semicolon. Such function macros
2298# are typically used for boiler-plate code, and will confuse the parser if not
2299# removed.
2300# The default value is: YES.
2301# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2302
2303SKIP_FUNCTION_MACROS = YES
2304
2305#---------------------------------------------------------------------------
2306# Configuration options related to external references
2307#---------------------------------------------------------------------------
2308
2309# The TAGFILES tag can be used to specify one or more tag files. For each tag
2310# file the location of the external documentation should be added. The format of
2311# a tag file without this location is as follows:
2312# TAGFILES = file1 file2 ...
2313# Adding location for the tag files is done as follows:
2314# TAGFILES = file1=loc1 "file2 = loc2" ...
2315# where loc1 and loc2 can be relative or absolute paths or URLs. See the
2316# section "Linking to external documentation" for more information about the use
2317# of tag files.
2318# Note: Each tag file must have a unique name (where the name does NOT include
2319# the path). If a tag file is not located in the directory in which doxygen is
2320# run, you must also specify the path to the tagfile here.
2321
2322TAGFILES =
2323
2324# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
2325# tag file that is based on the input files it reads. See section "Linking to
2326# external documentation" for more information about the usage of tag files.
2327
2328GENERATE_TAGFILE =
2329
2330# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
2331# the class index. If set to NO, only the inherited external classes will be
2332# listed.
2333# The default value is: NO.
2334
2335ALLEXTERNALS = NO
2336
2337# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
2338# in the modules index. If set to NO, only the current project's groups will be
2339# listed.
2340# The default value is: YES.
2341
2342EXTERNAL_GROUPS = YES
2343
2344# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
2345# the related pages index. If set to NO, only the current project's pages will
2346# be listed.
2347# The default value is: YES.
2348
2349EXTERNAL_PAGES = YES
2350
2351#---------------------------------------------------------------------------
2352# Configuration options related to the dot tool
2353#---------------------------------------------------------------------------
2354
2355# You can include diagrams made with dia in doxygen documentation. Doxygen will
2356# then run dia to produce the diagram and insert it in the documentation. The
2357# DIA_PATH tag allows you to specify the directory where the dia binary resides.
2358# If left empty dia is assumed to be found in the default search path.
2359
2360DIA_PATH =
2361
2362# If set to YES the inheritance and collaboration graphs will hide inheritance
2363# and usage relations if the target is undocumented or is not a class.
2364# The default value is: YES.
2365
2366HIDE_UNDOC_RELATIONS = YES
2367
2368# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
2369# available from the path. This tool is part of Graphviz (see:
2370# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
2371# Bell Labs. The other options in this section have no effect if this option is
2372# set to NO
2373# The default value is: YES.
2374
2375HAVE_DOT = YES
2376
2377# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
2378# to run in parallel. When set to 0 doxygen will base this on the number of
2379# processors available in the system. You can set it explicitly to a value
2380# larger than 0 to get control over the balance between CPU load and processing
2381# speed.
2382# Minimum value: 0, maximum value: 32, default value: 0.
2383# This tag requires that the tag HAVE_DOT is set to YES.
2384
2385DOT_NUM_THREADS = 0
2386
2387# When you want a differently looking font in the dot files that doxygen
2388# generates you can specify the font name using DOT_FONTNAME. You need to make
2389# sure dot is able to find the font, which can be done by putting it in a
2390# standard location or by setting the DOTFONTPATH environment variable or by
2391# setting DOT_FONTPATH to the directory containing the font.
2392# The default value is: Helvetica.
2393# This tag requires that the tag HAVE_DOT is set to YES.
2394
2395DOT_FONTNAME = Helvetica
2396
2397# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
2398# dot graphs.
2399# Minimum value: 4, maximum value: 24, default value: 10.
2400# This tag requires that the tag HAVE_DOT is set to YES.
2401
2402DOT_FONTSIZE = 10
2403
2404# By default doxygen will tell dot to use the default font as specified with
2405# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
2406# the path where dot can find it using this tag.
2407# This tag requires that the tag HAVE_DOT is set to YES.
2408
2409DOT_FONTPATH =
2410
2411# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
2412# graph for each documented class showing the direct and indirect inheritance
2413# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
2414# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
2415# to TEXT the direct and indirect inheritance relations will be shown as texts /
2416# links.
2417# Possible values are: NO, YES, TEXT and GRAPH.
2418# The default value is: YES.
2419
2420CLASS_GRAPH = YES
2421
2422# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
2423# graph for each documented class showing the direct and indirect implementation
2424# dependencies (inheritance, containment, and class references variables) of the
2425# class with other documented classes.
2426# The default value is: YES.
2427# This tag requires that the tag HAVE_DOT is set to YES.
2428
2429COLLABORATION_GRAPH = YES
2430
2431# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
2432# groups, showing the direct groups dependencies. See also the chapter Grouping
2433# in the manual.
2434# The default value is: YES.
2435# This tag requires that the tag HAVE_DOT is set to YES.
2436
2437GROUP_GRAPHS = YES
2438
2439# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
2440# collaboration diagrams in a style similar to the OMG's Unified Modeling
2441# Language.
2442# The default value is: NO.
2443# This tag requires that the tag HAVE_DOT is set to YES.
2444
2445UML_LOOK = NO
2446
2447# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
2448# class node. If there are many fields or methods and many nodes the graph may
2449# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
2450# number of items for each type to make the size more manageable. Set this to 0
2451# for no limit. Note that the threshold may be exceeded by 50% before the limit
2452# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
2453# but if the number exceeds 15, the total amount of fields shown is limited to
2454# 10.
2455# Minimum value: 0, maximum value: 100, default value: 10.
2456# This tag requires that the tag UML_LOOK is set to YES.
2457
2458UML_LIMIT_NUM_FIELDS = 10
2459
2460# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
2461# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
2462# tag is set to YES, doxygen will add type and arguments for attributes and
2463# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
2464# will not generate fields with class member information in the UML graphs. The
2465# class diagrams will look similar to the default class diagrams but using UML
2466# notation for the relationships.
2467# Possible values are: NO, YES and NONE.
2468# The default value is: NO.
2469# This tag requires that the tag UML_LOOK is set to YES.
2470
2471DOT_UML_DETAILS = NO
2472
2473# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
2474# to display on a single line. If the actual line length exceeds this threshold
2475# significantly it will wrapped across multiple lines. Some heuristics are apply
2476# to avoid ugly line breaks.
2477# Minimum value: 0, maximum value: 1000, default value: 17.
2478# This tag requires that the tag HAVE_DOT is set to YES.
2479
2480DOT_WRAP_THRESHOLD = 17
2481
2482# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
2483# collaboration graphs will show the relations between templates and their
2484# instances.
2485# The default value is: NO.
2486# This tag requires that the tag HAVE_DOT is set to YES.
2487
2488TEMPLATE_RELATIONS = NO
2489
2490# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
2491# YES then doxygen will generate a graph for each documented file showing the
2492# direct and indirect include dependencies of the file with other documented
2493# files.
2494# The default value is: YES.
2495# This tag requires that the tag HAVE_DOT is set to YES.
2496
2497INCLUDE_GRAPH = YES
2498
2499# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
2500# set to YES then doxygen will generate a graph for each documented file showing
2501# the direct and indirect include dependencies of the file with other documented
2502# files.
2503# The default value is: YES.
2504# This tag requires that the tag HAVE_DOT is set to YES.
2505
2506INCLUDED_BY_GRAPH = YES
2507
2508# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
2509# dependency graph for every global function or class method.
2510#
2511# Note that enabling this option will significantly increase the time of a run.
2512# So in most cases it will be better to enable call graphs for selected
2513# functions only using the \callgraph command. Disabling a call graph can be
2514# accomplished by means of the command \hidecallgraph.
2515# The default value is: NO.
2516# This tag requires that the tag HAVE_DOT is set to YES.
2517
2518CALL_GRAPH = NO
2519
2520# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
2521# dependency graph for every global function or class method.
2522#
2523# Note that enabling this option will significantly increase the time of a run.
2524# So in most cases it will be better to enable caller graphs for selected
2525# functions only using the \callergraph command. Disabling a caller graph can be
2526# accomplished by means of the command \hidecallergraph.
2527# The default value is: NO.
2528# This tag requires that the tag HAVE_DOT is set to YES.
2529
2530CALLER_GRAPH = NO
2531
2532# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
2533# hierarchy of all classes instead of a textual one.
2534# The default value is: YES.
2535# This tag requires that the tag HAVE_DOT is set to YES.
2536
2537GRAPHICAL_HIERARCHY = YES
2538
2539# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
2540# dependencies a directory has on other directories in a graphical way. The
2541# dependency relations are determined by the #include relations between the
2542# files in the directories.
2543# The default value is: YES.
2544# This tag requires that the tag HAVE_DOT is set to YES.
2545
2546DIRECTORY_GRAPH = YES
2547
2548# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
2549# of child directories generated in directory dependency graphs by dot.
2550# Minimum value: 1, maximum value: 25, default value: 1.
2551# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
2552
2553DIR_GRAPH_MAX_DEPTH = 1
2554
2555# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
2556# generated by dot. For an explanation of the image formats see the section
2557# output formats in the documentation of the dot tool (Graphviz (see:
2558# http://www.graphviz.org/)).
2559# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
2560# to make the SVG files visible in IE 9+ (other browsers do not have this
2561# requirement).
2562# Possible values are: png, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd,
2563# gif, gif:cairo, gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd,
2564# png:cairo, png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
2565# png:gdiplus:gdiplus.
2566# The default value is: png.
2567# This tag requires that the tag HAVE_DOT is set to YES.
2568
2569DOT_IMAGE_FORMAT = png
2570
2571# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
2572# enable generation of interactive SVG images that allow zooming and panning.
2573#
2574# Note that this requires a modern browser other than Internet Explorer. Tested
2575# and working are Firefox, Chrome, Safari, and Opera.
2576# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
2577# the SVG files visible. Older versions of IE do not have SVG support.
2578# The default value is: NO.
2579# This tag requires that the tag HAVE_DOT is set to YES.
2580
2581INTERACTIVE_SVG = NO
2582
2583# The DOT_PATH tag can be used to specify the path where the dot tool can be
2584# found. If left blank, it is assumed the dot tool can be found in the path.
2585# This tag requires that the tag HAVE_DOT is set to YES.
2586
2587DOT_PATH =
2588
2589# The DOTFILE_DIRS tag can be used to specify one or more directories that
2590# contain dot files that are included in the documentation (see the \dotfile
2591# command).
2592# This tag requires that the tag HAVE_DOT is set to YES.
2593
2594DOTFILE_DIRS =
2595
2596# The MSCFILE_DIRS tag can be used to specify one or more directories that
2597# contain msc files that are included in the documentation (see the \mscfile
2598# command).
2599
2600MSCFILE_DIRS =
2601
2602# The DIAFILE_DIRS tag can be used to specify one or more directories that
2603# contain dia files that are included in the documentation (see the \diafile
2604# command).
2605
2606DIAFILE_DIRS =
2607
2608# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
2609# path where java can find the plantuml.jar file or to the filename of jar file
2610# to be used. If left blank, it is assumed PlantUML is not used or called during
2611# a preprocessing step. Doxygen will generate a warning when it encounters a
2612# \startuml command in this case and will not generate output for the diagram.
2613
2614PLANTUML_JAR_PATH =
2615
2616# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
2617# configuration file for plantuml.
2618
2619PLANTUML_CFG_FILE =
2620
2621# When using plantuml, the specified paths are searched for files specified by
2622# the !include statement in a plantuml block.
2623
2624PLANTUML_INCLUDE_PATH =
2625
2626# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
2627# that will be shown in the graph. If the number of nodes in a graph becomes
2628# larger than this value, doxygen will truncate the graph, which is visualized
2629# by representing a node as a red box. Note that doxygen if the number of direct
2630# children of the root node in a graph is already larger than
2631# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
2632# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
2633# Minimum value: 0, maximum value: 10000, default value: 50.
2634# This tag requires that the tag HAVE_DOT is set to YES.
2635
2636DOT_GRAPH_MAX_NODES = 50
2637
2638# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
2639# generated by dot. A depth value of 3 means that only nodes reachable from the
2640# root by following a path via at most 3 edges will be shown. Nodes that lay
2641# further from the root node will be omitted. Note that setting this option to 1
2642# or 2 may greatly reduce the computation time needed for large code bases. Also
2643# note that the size of a graph can be further restricted by
2644# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
2645# Minimum value: 0, maximum value: 1000, default value: 0.
2646# This tag requires that the tag HAVE_DOT is set to YES.
2647
2648MAX_DOT_GRAPH_DEPTH = 0
2649
2650# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
2651# background. This is disabled by default, because dot on Windows does not seem
2652# to support this out of the box.
2653#
2654# Warning: Depending on the platform used, enabling this option may lead to
2655# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
2656# read).
2657# The default value is: NO.
2658# This tag requires that the tag HAVE_DOT is set to YES.
2659
2660DOT_TRANSPARENT = NO
2661
2662# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
2663# files in one run (i.e. multiple -o and -T options on the command line). This
2664# makes dot run faster, but since only newer versions of dot (>1.8.10) support
2665# this, this feature is disabled by default.
2666# The default value is: NO.
2667# This tag requires that the tag HAVE_DOT is set to YES.
2668
2669DOT_MULTI_TARGETS = NO
2670
2671# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
2672# explaining the meaning of the various boxes and arrows in the dot generated
2673# graphs.
2674# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
2675# graphical representation for inheritance and collaboration diagrams is used.
2676# The default value is: YES.
2677# This tag requires that the tag HAVE_DOT is set to YES.
2678
2679GENERATE_LEGEND = YES
2680
2681# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
2682# files that are used to generate the various graphs.
2683#
2684# Note: This setting is not only used for dot files but also for msc temporary
2685# files.
2686# The default value is: YES.
2687
2688DOT_CLEANUP = YES
diff --git a/debian/changelog b/debian/changelog
index 6774ec3..180b2d4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,72 @@
1netplan.io (0.107.1-3ubuntu0.23.10.1) mantic; urgency=medium
2
3 * Backport netplan.io 0.107.1-3 to 23.10 (LP: #2058051):
4 - wifi: add support for WPA3-Enterprise (LP: #2029876) (!402)
5 - wifi: support WPA2 and WPA3 Personal simultaneously (!404)
6 - added mii-monitor-interval example (!411)
7 - docs: Add "Contribute Documentation" how-to
8 - auth: add support for LEAP and EAP-PWD (!415)
9 - tests: Add autopkgtest for (LP: #1959570) (!419)
10 - wifi: make it possible to have a psk and an eap password simultaneously
11 (!416)
12 - doc: Set-up some basic Doxygen project (!423)
13 - doc: Make Sphinx to handle autodoxygen project, using breathe (!423)
14 - doc: create libnetplan apidoc structure (!423)
15 - inc: Start documenting public API (!423)
16 - doc: Update 'Netplan everywhere' for 23.10 (!418)
17 Bug fixes:
18 - test:ovs: Avoid NetworkManager taking contol, breaking a test
19 - parse: allow COMMON_LINK_HANDLERS for VRFs (!401)
20 - util: don't return a placeholder netdef in the iterator (!406)
21 - tunnels/validation: do not error out if "local" is not defined (!407)
22 - tests: add some integration tests without the local address (!407)
23 - wireguard: ignore empty endpoints (LP: #2038811) (!414)
24 - parse: improve the parsing of access-points (LP: #1809994) (!413)
25 - wifi: replace the previously defined AP with the new one (!413)
26 - doc: spelling check improvements (!417)
27 - Fix permissions on folder '/run/NetworkManager/' (!422)
28 - cli:try: avoid linting error for type hints (Closes: #1058524) (!422)
29 - nm-parse: always read the PSK into the new psk variable (!416)
30 - networkd: fix formatting (!424)
31 - networkd: replace deprecated CriticalConnection= by KeepConfiguration=
32 (!424)
33 - networkd: move KeepConfiguration= into [Network] section
34 - apply: bring "lo" back up if it's managed by NM (!408)
35 - apply: don't assume the NM loopback connection is called "lo" (!408)
36 * Drop patches merged upstream:
37 - lp1809994/0010-parse-improve-the-parsing-of-access-points-LP-180999.patch
38 - lp1809994/0011-wifi-replace-the-previously-defined-AP-with-the-new-.patch
39 - lp2039821/0008-wireguard-ignore-empty-endpoints.patch
40 - lp2039825/0009-auth-add-support-for-LEAP-and-EAP-PWD.patch
41 * Add patches for bug fixes from netplan.io 1.0-1:
42 - lp2041727/0004-cli-utils-introduce-systemctl_is_installed-helper.patch
43 cli:utils: introduce systemctl_is_installed helper (LP: #2041727) (!421)
44 - lp2041727/0005-Update-ovs.py-to-check-if-ovsdb-server.service-is-in.patch
45 Check if ovsdb-server.service is active before displaying warning
46 (LP: #2041727) (!421)
47 - d/p/0007-tests-assert-generated-.service-files-in-assert_srio.patch,
48 d/p/0008-tests-sriov-test-if-the-generated-netplan-rebind-ser.patch,
49 d/p/0009-sriov-don-t-generate-duplicate-entries-in-the-rebind.patch:
50 Don't generate duplicate entries in the netplan-sriov-rebind.service
51 (!437)
52 * Drop patches not required for 23.10:
53 - debian/patches/python-limited-stable-api.patch
54 * debian/netplan.io.preinst:
55 - This preinst script is intended to cleanup the .pyc files from
56 share/netplan/netplan. This directory is supposed to be removed after
57 the upgrade from netplan.io 0.106.1 to 0.107, as the Python code
58 was moved to it's own python3-netplan package, but it's left behind
59 due to Python cached files.
60 * Drop changes related to usr-merge and not required for 23.10:
61 - debian/netplan-generator.dirs
62 - debian/netplan-generator.install
63 - debian/netplan-generator.postinst
64 - debian/netplan-generator.preinst
65 * debian/netplan-generator.lintian-overrides:
66 - Drop overrides file. It wasn't really silencing any lintian warnings.
67
68 -- Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com> Wed, 13 Mar 2024 09:38:15 +0000
69
1netplan.io (0.107-5ubuntu0.2) mantic; urgency=medium70netplan.io (0.107-5ubuntu0.2) mantic; urgency=medium
271
3 * lp1809994/0010-parse-improve-the-parsing-of-access-points-LP-180999.patch:72 * lp1809994/0010-parse-improve-the-parsing-of-access-points-LP-180999.patch:
diff --git a/debian/control b/debian/control
index 74d2604..bc358c7 100644
--- a/debian/control
+++ b/debian/control
@@ -27,7 +27,8 @@ Build-Depends:
27 libcmocka-dev,27 libcmocka-dev,
28 libpython3-dev,28 libpython3-dev,
29 libsystemd-dev,29 libsystemd-dev,
30 systemd,30 systemd <!nocheck>,
31 systemd-dev,
31 dbus-x11 <!nocheck>,32 dbus-x11 <!nocheck>,
32 pyflakes3 <!nocheck>,33 pyflakes3 <!nocheck>,
33 pycodestyle <!nocheck> | pep8 <!nocheck>,34 pycodestyle <!nocheck> | pep8 <!nocheck>,
diff --git a/debian/extra/PLACEHOLDER b/debian/extra/PLACEHOLDER
34new file mode 10064435new file mode 100644
index 0000000..fb20d88
--- /dev/null
+++ b/debian/extra/PLACEHOLDER
@@ -0,0 +1,4 @@
1This is a placeholder file to avoid an empty [/usr]/lib/netplan/ directory
2to be removed during a package upgrade involving the usrmerge transition.
3
4See https://bugs.debian.org/1060661 for more context.
diff --git a/debian/netplan-generator.lintian-overrides b/debian/netplan-generator.lintian-overrides
0deleted file mode 1006445deleted file mode 100644
index 7225e61..0000000
--- a/debian/netplan-generator.lintian-overrides
+++ /dev/null
@@ -1,2 +0,0 @@
1# false positive
2netplan-generator: package-contains-empty-directory [usr/lib/netplan/]
diff --git a/debian/netplan.io.preinst b/debian/netplan.io.preinst
3new file mode 1006440new file mode 100644
index 0000000..9a508f1
--- /dev/null
+++ b/debian/netplan.io.preinst
@@ -0,0 +1,17 @@
1#!/bin/sh
2
3set -e
4
5# Cleanup .pyc cached files from netplan.io versions older than 0.107-3.
6# After 0.107-3, the noncli-related code was moved away from
7# share/netplan/netplan, thanks to the new python3-netplan package,
8# but dpkg would leave this directory behind due to the .pyc files.
9# Cleaning it up here will leave the directory empty so dpkg will remove
10# it properly during the update process.
11
12if [ -d /usr/share/netplan/netplan ]; then
13 find /usr/share/netplan/netplan/ -name '*.pyc' -delete
14 find /usr/share/netplan/netplan/ -name '__pycache__' -delete
15fi
16
17#DEBHELPER#
diff --git a/debian/patches/0001-parse-allow-COMMON_LINK_HANDLERS-for-VRFs-LP-2031421.patch b/debian/patches/0001-parse-allow-COMMON_LINK_HANDLERS-for-VRFs-LP-2031421.patch
0deleted file mode 10064418deleted file mode 100644
index ea670f6..0000000
--- a/debian/patches/0001-parse-allow-COMMON_LINK_HANDLERS-for-VRFs-LP-2031421.patch
+++ /dev/null
@@ -1,41 +0,0 @@
1From: =?utf-8?q?Lukas_M=C3=A4rdian?= <slyon@ubuntu.com>
2Date: Mon, 21 Aug 2023 15:59:42 +0200
3Subject: parse: allow COMMON_LINK_HANDLERS for VRFs (LP: #2031421,
4 Closes: #1049432)
5
6Bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1049432
7Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2031421
8Forwarded: https://github.com/canonical/netplan/pull/401
9
10This is to fix test failures with latest NetworkManager v1.44, after they
11slightly changed behavior:
12https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/commit/dabfa26a41edc7911a45a4689d555e8f055b0373
13---
14 src/parse.c | 1 +
15 tests/integration/routing.py | 1 +
16 2 files changed, 2 insertions(+)
17
18diff --git a/src/parse.c b/src/parse.c
19index b930b75..a1730e5 100644
20--- a/src/parse.c
21+++ b/src/parse.c
22@@ -2864,6 +2864,7 @@ static const mapping_entry_handler vlan_def_handlers[] = {
23 };
24
25 static const mapping_entry_handler vrf_def_handlers[] = {
26+ COMMON_LINK_HANDLERS,
27 COMMON_BACKEND_HANDLERS,
28 {"renderer", YAML_SCALAR_NODE, {.generic=handle_netdef_renderer}, NULL},
29 {"interfaces", YAML_SEQUENCE_NODE, {.generic=handle_vrf_interfaces}, NULL},
30diff --git a/tests/integration/routing.py b/tests/integration/routing.py
31index f29b012..f63be36 100644
32--- a/tests/integration/routing.py
33+++ b/tests/integration/routing.py
34@@ -295,6 +295,7 @@ class _CommonTests():
35 table: 1000
36 vrfs:
37 vrf0:
38+ addresses: [10.10.10.20/24]
39 table: 1000
40 interfaces: [%(ec)s]
41 routes:
diff --git a/debian/patches/0001-parse-nm-wg-append-the-correct-prefix-to-IPv6-addres.patch b/debian/patches/0001-parse-nm-wg-append-the-correct-prefix-to-IPv6-addres.patch
42new file mode 1006440new file mode 100644
index 0000000..58ee85f
--- /dev/null
+++ b/debian/patches/0001-parse-nm-wg-append-the-correct-prefix-to-IPv6-addres.patch
@@ -0,0 +1,77 @@
1From: Danilo Egea Gondolfo <danilogondolfo@gmail.com>
2Date: Thu, 4 Jan 2024 14:35:43 +0000
3Subject: parse-nm/wg: append the correct prefix to IPv6 addresses (#428)
4
5When the prefix is omitted for IPs in the allowed-ips list, we were
6appending a /32 to them without checking the address family.
7
8IPv6 addresses will have a /128 appended to them if it's not present.
9
10See LP: #2046158
11
12Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/2046158
13Origin: https://github.com/canonical/netplan/pull/428
14Forwarded: not-needed
15---
16 src/parse-nm.c | 15 +++++++++------
17 tests/parser/test_keyfile.py | 6 ++++--
18 2 files changed, 13 insertions(+), 8 deletions(-)
19
20diff --git a/src/parse-nm.c b/src/parse-nm.c
21index 2e9a264..10f1780 100644
22--- a/src/parse-nm.c
23+++ b/src/parse-nm.c
24@@ -543,13 +543,16 @@ parse_tunnels(GKeyFile* kf, NetplanNetDefinition* nd)
25 /*
26 * NM doesn't care if the prefix was omitted.
27 * Even though the WG manual says it requires the prefix,
28- * if it's omitted in its config file it will default to /32
29- * so we should do the same here and append a /32 if it's not present,
30- * otherwise we will generate a YAML that will fail validation.
31+ * if it's omitted in its config file it will default to /32 for IPv4
32+ * and /128 for IPv6 so we should do the same here and append a /32 or /128
33+ * if it's not present, otherwise we will generate a YAML that will fail validation.
34 */
35- if (!g_strrstr(ip, "/"))
36- address = g_strdup_printf("%s/32", ip);
37- else
38+ if (!g_strrstr(ip, "/")) {
39+ if (is_ip4_address(ip))
40+ address = g_strdup_printf("%s/32", ip);
41+ else
42+ address = g_strdup_printf("%s/128", ip);
43+ } else
44 address = g_strdup(ip);
45 g_array_append_val(wireguard_peer->allowed_ips, address);
46 }
47diff --git a/tests/parser/test_keyfile.py b/tests/parser/test_keyfile.py
48index ae4d8d1..1351840 100644
49--- a/tests/parser/test_keyfile.py
50+++ b/tests/parser/test_keyfile.py
51@@ -1963,7 +1963,8 @@ method=auto\n'''.format(UUID), regenerate=False)
52
53 def test_wireguard_allowed_ips_without_prefix(self):
54 '''
55- When the IP prefix is not present we should default to /32
56+ When the IP prefix is not present we should default to /32 for IPv4
57+ and /128 for IPv6.
58 '''
59 self.generate_from_keyfile('''[connection]
60 id=wg0
61@@ -1976,7 +1977,7 @@ private-key=aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
62
63 [wireguard-peer.cwkb7k0xDgLSnunZpFIjLJw4u+mJDDr+aBR5DqzpmgI=]
64 endpoint=1.2.3.4:12345
65-allowed-ips=192.168.0.10
66+allowed-ips=192.168.0.10;2001::1;
67
68 [ipv4]
69 method=auto\n'''.format(UUID), regenerate=False)
70@@ -1995,6 +1996,7 @@ method=auto\n'''.format(UUID), regenerate=False)
71 public: "cwkb7k0xDgLSnunZpFIjLJw4u+mJDDr+aBR5DqzpmgI="
72 allowed-ips:
73 - "192.168.0.10/32"
74+ - "2001::1/128"
75 networkmanager:
76 uuid: "{}"
77 name: "wg0"
diff --git a/debian/patches/0002-test-ovs-Avoid-NetworkManager-taking-contol-breaking.patch b/debian/patches/0002-test-ovs-Avoid-NetworkManager-taking-contol-breaking.patch
0deleted file mode 10064478deleted file mode 100644
index f12a5f3..0000000
--- a/debian/patches/0002-test-ovs-Avoid-NetworkManager-taking-contol-breaking.patch
+++ /dev/null
@@ -1,28 +0,0 @@
1From: =?utf-8?q?Lukas_M=C3=A4rdian?= <slyon@ubuntu.com>
2Date: Mon, 21 Aug 2023 14:56:46 +0200
3Subject: test:ovs: Avoid NetworkManager taking contol, breaking a test
4
5Forwarded: not-needed
6Origin: https://github.com/canonical/netplan/commit/c33175cbb16dd154f87b51f5ea1cb2c936564a19
7---
8 tests/integration/ovs.py | 5 ++++-
9 1 file changed, 4 insertions(+), 1 deletion(-)
10
11diff --git a/tests/integration/ovs.py b/tests/integration/ovs.py
12index 958800c..834a7bd 100644
13--- a/tests/integration/ovs.py
14+++ b/tests/integration/ovs.py
15@@ -76,9 +76,12 @@ class _CommonTests():
16 openvswitch:
17 ports:
18 - [patch0-1, patch1-0]
19+ ethernets:
20+ # define this eth to avoid NM taking control and breaking the following .generate_and_settle()
21+ %(ec)s: {}
22 bridges:
23 ovs0: {interfaces: [patch0-1]}
24- ovs1: {interfaces: [patch1-0]}''')
25+ ovs1: {interfaces: [patch1-0]}''' % {'ec': self.dev_e_client})
26 self.generate_and_settle(['ovs0', 'ovs1'])
27 # Basic verification that the bridges/ports/interfaces are there in OVS
28 out = subprocess.check_output(['ovs-vsctl', '-t', '5', 'show'])
diff --git a/debian/patches/0003-util-don-t-return-a-placeholder-netdef-in-the-iterat.patch b/debian/patches/0003-util-don-t-return-a-placeholder-netdef-in-the-iterat.patch
29deleted file mode 1006440deleted file mode 100644
index dab37df..0000000
--- a/debian/patches/0003-util-don-t-return-a-placeholder-netdef-in-the-iterat.patch
+++ /dev/null
@@ -1,54 +0,0 @@
1From: Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com>
2Date: Thu, 31 Aug 2023 15:22:00 +0100
3Subject: util: don't return a placeholder netdef in the iterator
4
5Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2034024
6Origin: https://github.com/canonical/netplan/pull/406
7---
8 src/util.c | 2 ++
9 tests/test_libnetplan.py | 19 +++++++++++++++++++
10 2 files changed, 21 insertions(+)
11
12diff --git a/src/util.c b/src/util.c
13index d4fcc26..b9b621c 100644
14--- a/src/util.c
15+++ b/src/util.c
16@@ -895,6 +895,8 @@ _netplan_netdef_pertype_iter_next(struct netdef_pertype_iter* it)
17
18 while (g_hash_table_iter_next(&it->iter, &key, &value)) {
19 NetplanNetDefinition* netdef = value;
20+ if (netdef->type == NETPLAN_DEF_TYPE_NM_PLACEHOLDER_)
21+ continue;
22 if (it->type == NETPLAN_DEF_TYPE_NONE || netdef->type == it->type)
23 return netdef;
24 }
25diff --git a/tests/test_libnetplan.py b/tests/test_libnetplan.py
26index 84944a8..134cfa0 100644
27--- a/tests/test_libnetplan.py
28+++ b/tests/test_libnetplan.py
29@@ -189,6 +189,25 @@ class TestNetdefIterator(TestBase):
30 dhcp4: false''')
31 self.assertSetEqual(set(["eth0", "br0"]), set(d.id for d in netplan.netdef.NetDefinitionIterator(state, None)))
32
33+ def test_iter_all_types_with_placeholder(self):
34+ state = state_from_yaml(self.confdir, '''network:
35+ renderer: NetworkManager
36+ ethernets:
37+ eth0:
38+ dhcp4: false
39+ virtual-ethernets:
40+ # Netplan will create a placeholder netdef for veth321
41+ veth123:
42+ peer: veth321
43+ bridges:
44+ br0:
45+ dhcp4: false''')
46+
47+ # We call the property "type" here so it will try to translate the netdef type to a string
48+ # and crash if it's a placeholder
49+ expected = {"ethernets", "virtual-ethernets", "bridges"}
50+ self.assertSetEqual(expected, set(d.type for d in netplan.netdef.NetDefinitionIterator(state, None)))
51+
52 def test_iter_ethernets(self):
53 state = state_from_yaml(self.confdir, '''network:
54 ethernets:
diff --git a/debian/patches/0007-tests-assert-generated-.service-files-in-assert_srio.patch b/debian/patches/0007-tests-assert-generated-.service-files-in-assert_srio.patch
55new file mode 1006440new file mode 100644
index 0000000..b9c0dc7
--- /dev/null
+++ b/debian/patches/0007-tests-assert-generated-.service-files-in-assert_srio.patch
@@ -0,0 +1,26 @@
1From: Danilo Egea Gondolfo <danilogondolfo@gmail.com>
2Date: Tue, 23 Jan 2024 13:39:45 +0000
3Subject: tests: assert generated .service files in assert_sriov
4
5We are not checking if the systemd units generated are correct.
6
7Origin: https://github.com/canonical/netplan/pull/437
8---
9 tests/generator/base.py | 7 +++++++
10 1 file changed, 7 insertions(+)
11
12diff --git a/tests/generator/base.py b/tests/generator/base.py
13index b7bf4f9..7795d40 100644
14--- a/tests/generator/base.py
15+++ b/tests/generator/base.py
16@@ -491,3 +491,10 @@ class TestBase(unittest.TestCase):
17 self.assertEqual(set(os.path.basename(file) for file in sriov_systemd_dir),
18 {'netplan-sriov-' + f for f in file_contents_map})
19 self.assertEqual(set(os.listdir(self.workdir.name)) - {'lib'}, {'etc', 'run'})
20+
21+ for file in sriov_systemd_dir:
22+ basename = os.path.basename(file)
23+ with open(file, 'r') as f:
24+ contents = f.read()
25+ map_contents = file_contents_map.get(basename.replace('netplan-sriov-', ''))
26+ self.assertEqual(map_contents, contents)
diff --git a/debian/patches/0008-tests-sriov-test-if-the-generated-netplan-rebind-ser.patch b/debian/patches/0008-tests-sriov-test-if-the-generated-netplan-rebind-ser.patch
0new file mode 10064427new file mode 100644
index 0000000..6aab075
--- /dev/null
+++ b/debian/patches/0008-tests-sriov-test-if-the-generated-netplan-rebind-ser.patch
@@ -0,0 +1,57 @@
1From: Danilo Egea Gondolfo <danilogondolfo@gmail.com>
2Date: Tue, 23 Jan 2024 13:41:27 +0000
3Subject: tests/sriov: test if the generated netplan-rebind service is correct
4
5This test is currently failing due to interface duplicates being added
6to the list.
7
8Origin: https://github.com/canonical/netplan/pull/437
9---
10 tests/test_sriov.py | 36 ++++++++++++++++++++++++++++++++++++
11 1 file changed, 36 insertions(+)
12
13--- a/tests/test_sriov.py
14+++ b/tests/test_sriov.py
15@@ -879,6 +879,42 @@
16 ExecStart=/usr/sbin/netplan rebind enblue engreen
17 '''})
18
19+ def test_rebind_service_generation(self):
20+ self.generate('''network:
21+ version: 2
22+ ethernets:
23+ engreen:
24+ embedded-switch-mode: switchdev
25+ delay-virtual-functions-rebind: true
26+ enblue:
27+ match: {driver: fake_driver}
28+ set-name: enblue
29+ embedded-switch-mode: legacy
30+ delay-virtual-functions-rebind: true
31+ virtual-function-count: 4
32+ sriov_blue_vf0:
33+ link: enblue
34+ sriov_blue_vf1:
35+ link: enblue
36+ sriov_blue_vf1:
37+ link: enblue
38+ sriov_green_vf0:
39+ link: engreen
40+ sriov_green_vf1:
41+ link: engreen
42+ sriov_green_vf2:
43+ link: engreen''')
44+ self.assert_sriov({'rebind.service': '''[Unit]
45+Description=(Re-)bind SR-IOV Virtual Functions to their driver
46+After=network.target
47+After=sys-subsystem-net-devices-enblue.device
48+After=sys-subsystem-net-devices-engreen.device
49+
50+[Service]
51+Type=oneshot
52+ExecStart=/usr/sbin/netplan rebind enblue engreen
53+'''})
54+
55 def test_rebind_not_delayed(self):
56 self.generate('''network:
57 version: 2
diff --git a/debian/patches/0009-sriov-don-t-generate-duplicate-entries-in-the-rebind.patch b/debian/patches/0009-sriov-don-t-generate-duplicate-entries-in-the-rebind.patch
0new file mode 10064458new file mode 100644
index 0000000..3f596b6
--- /dev/null
+++ b/debian/patches/0009-sriov-don-t-generate-duplicate-entries-in-the-rebind.patch
@@ -0,0 +1,96 @@
1From: Danilo Egea Gondolfo <danilogondolfo@gmail.com>
2Date: Tue, 23 Jan 2024 14:13:13 +0000
3Subject: sriov: don't generate duplicate entries in the rebind.service file
4
5When multiple VFs are present in the configuration, we end up generating
6many duplicates in the netplan-sriov-rebind.service file.
7
8Use a hash set to store the PFs and automatically deduplicate entries.
9
10Origin: https://github.com/canonical/netplan/pull/437
11---
12 src/sriov.c | 35 ++++++++++++++++++++---------------
13 1 file changed, 20 insertions(+), 15 deletions(-)
14
15diff --git a/src/sriov.c b/src/sriov.c
16index 7d4944b..f8117f7 100644
17--- a/src/sriov.c
18+++ b/src/sriov.c
19@@ -27,28 +27,34 @@
20 #include "sriov.h"
21
22 static gboolean
23-write_sriov_rebind_systemd_unit(const GString* pfs, const char* rootdir, GError** error)
24+write_sriov_rebind_systemd_unit(GHashTable* pfs, const char* rootdir, GError** error)
25 {
26 g_autofree gchar* id_escaped = NULL;
27 g_autofree char* link = g_strjoin(NULL, rootdir ?: "", "/run/systemd/system/multi-user.target.wants/netplan-sriov-rebind.service", NULL);
28 g_autofree char* path = g_strjoin(NULL, "/run/systemd/system/netplan-sriov-rebind.service", NULL);
29- gchar** split = NULL;
30+
31+ GHashTableIter iter;
32+ gpointer key;
33+ GString* interfaces = g_string_new("");
34
35 GString* s = g_string_new("[Unit]\n");
36 g_string_append(s, "Description=(Re-)bind SR-IOV Virtual Functions to their driver\n");
37 g_string_append_printf(s, "After=network.target\n");
38
39 /* Run after udev */
40- split = g_strsplit(pfs->str, " ", 0);
41- for (unsigned i = 0; split[i]; ++i)
42- g_string_append_printf(s, "After=sys-subsystem-net-devices-%s.device\n",
43- split[i]);
44- g_strfreev(split);
45+ g_hash_table_iter_init(&iter, pfs);
46+ while (g_hash_table_iter_next (&iter, &key, NULL)) {
47+ const gchar* id = key;
48+ g_string_append_printf(s, "After=sys-subsystem-net-devices-%s.device\n", id);
49+ g_string_append_printf(interfaces, "%s ", id);
50+ }
51
52 g_string_append(s, "\n[Service]\nType=oneshot\n");
53- g_string_append_printf(s, "ExecStart=" SBINDIR "/netplan rebind %s\n", pfs->str);
54+ g_string_truncate(interfaces, interfaces->len-1); /* cut trailing whitespace */
55+ g_string_append_printf(s, "ExecStart=" SBINDIR "/netplan rebind %s\n", interfaces->str);
56
57 g_string_free_to_file(s, rootdir, path, NULL);
58+ g_string_free(interfaces, TRUE);
59
60 safe_mkdir_p_dir(link);
61 if (symlink(path, link) < 0 && errno != EEXIST) {
62@@ -73,7 +79,7 @@ netplan_state_finish_sriov_write(const NetplanState* np_state, const char* rootd
63 gboolean ret = TRUE;
64
65 if (np_state) {
66- GString* pfs = g_string_new(NULL);
67+ GHashTable* rebind_pfs = g_hash_table_new(g_str_hash, g_str_equal);
68 /* Find netdev interface names for SR-IOV PFs*/
69 for (GList* iterator = np_state->netdefs_ordered; iterator; iterator = iterator->next) {
70 def = (NetplanNetDefinition*) iterator->data;
71@@ -88,20 +94,19 @@ netplan_state_finish_sriov_write(const NetplanState* np_state, const char* rootd
72
73 if (pf && pf->sriov_delay_virtual_functions_rebind) {
74 if (pf->set_name)
75- g_string_append_printf(pfs, "%s ", pf->set_name);
76+ g_hash_table_add(rebind_pfs, pf->set_name);
77 else if (!pf->has_match) /* netdef_id == interface name */
78- g_string_append_printf(pfs, "%s ", pf->id);
79+ g_hash_table_add(rebind_pfs, pf->id);
80 else
81 g_warning("%s: Cannot rebind SR-IOV virtual functions, unknown interface name. "
82 "Use 'netplan rebind <IFACE>' to rebind manually or use the 'set-name' stanza.",
83 pf->id);
84 }
85 }
86- if (pfs->len > 0) {
87- g_string_truncate(pfs, pfs->len-1); /* cut trailing whitespace */
88- ret = write_sriov_rebind_systemd_unit(pfs, rootdir, NULL);
89+ if (g_hash_table_size(rebind_pfs) > 0) {
90+ ret = write_sriov_rebind_systemd_unit(rebind_pfs, rootdir, NULL);
91 }
92- g_string_free(pfs, TRUE);
93+ g_hash_table_destroy(rebind_pfs);
94 }
95
96 if (any_sriov) {
diff --git a/debian/patches/lp1809994/0010-parse-improve-the-parsing-of-access-points-LP-180999.patch b/debian/patches/lp1809994/0010-parse-improve-the-parsing-of-access-points-LP-180999.patch
0deleted file mode 10064497deleted file mode 100644
index 85392c7..0000000
--- a/debian/patches/lp1809994/0010-parse-improve-the-parsing-of-access-points-LP-180999.patch
+++ /dev/null
@@ -1,197 +0,0 @@
1From: Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com>
2Date: Fri, 6 Oct 2023 11:42:36 +0100
3Subject: parse: improve the parsing of access-points (LP: #1809994)
4
5When the parser requires a second pass, it will report access-points it
6already parsed as duplicates and error out.
7
8With this change, access-points will be stored in a local hash table,
9which will be used to find duplicates in the same netdef, and moved to
10the netdef->access_points hash table in the end. Access-points already
11present in the netdef hash table will be considered already parsed and
12skipped.
13
14Add a test to check the problem is fixed and another one to test if
15merging the access-points when the same interface is present in multiple
16files is working properly.
17
18Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/1809994
19Origin: https://github.com/canonical/netplan/pull/413
20---
21 src/parse.c | 45 +++++++++++++++++++---------
22 src/types-internal.h | 3 ++
23 src/types.c | 2 +-
24 tests/generator/test_common.py | 54 ++++++++++++++++++++++++++++++++++
25 4 files changed, 89 insertions(+), 15 deletions(-)
26
27--- a/src/parse.c
28+++ b/src/parse.c
29@@ -59,6 +59,9 @@
30
31 NetplanParser global_parser = {0};
32
33+static gboolean
34+insert_kv_into_hash(void *key, void *value, void *hash);
35+
36 /**
37 * Load YAML file into a yaml_document_t.
38 *
39@@ -1404,11 +1407,13 @@
40 static gboolean
41 handle_wifi_access_points(NetplanParser* npp, yaml_node_t* node, const char* key_prefix, __unused const void* data, GError** error)
42 {
43+ GHashTable* access_points = g_hash_table_new(g_str_hash, g_str_equal);
44+
45 for (yaml_node_pair_t* entry = node->data.mapping.pairs.start; entry < node->data.mapping.pairs.top; entry++) {
46 NetplanWifiAccessPoint *access_point = NULL;
47 g_autofree char* full_key = NULL;
48 yaml_node_t* key, *value;
49- gboolean ret = TRUE;
50+ const gchar* ssid;
51
52 key = yaml_document_get_node(&npp->doc, entry->key);
53 assert_type(npp, key, YAML_SCALAR_NODE);
54@@ -1421,31 +1426,43 @@
55 continue;
56 }
57
58+ ssid = scalar(key);
59+
60+ /* Skip access-points that already exist in the netdef */
61+ if (npp->current.netdef->access_points && g_hash_table_contains(npp->current.netdef->access_points, ssid))
62+ continue;
63+
64+ /* Check if there's already an SSID with that name in the list of APs we are parsing */
65+ if (g_hash_table_contains(access_points, ssid)) {
66+ g_hash_table_foreach(access_points, free_access_point, NULL);
67+ g_hash_table_destroy(access_points);
68+ return yaml_error(npp, key, error, "%s: Duplicate access point SSID '%s'", npp->current.netdef->id, ssid);
69+ }
70+
71 g_assert(access_point == NULL);
72 access_point = g_new0(NetplanWifiAccessPoint, 1);
73- access_point->ssid = g_strdup(scalar(key));
74+ access_point->ssid = g_strdup(ssid);
75 g_debug("%s: adding wifi AP '%s'", npp->current.netdef->id, access_point->ssid);
76
77- /* Check if there's already an SSID with that name */
78- // FIXME: This check fails on multi-pass parsing, e.g. when defined in
79- // the same YAML file with a set of virtual-ethernets peers.
80- if (npp->current.netdef->access_points &&
81- g_hash_table_lookup(npp->current.netdef->access_points, access_point->ssid)) {
82- ret = yaml_error(npp, key, error, "%s: Duplicate access point SSID '%s'", npp->current.netdef->id, access_point->ssid);
83- }
84-
85 npp->current.access_point = access_point;
86- if (!ret || !process_mapping(npp, value, full_key, wifi_access_point_handlers, NULL, error)) {
87+ if (!process_mapping(npp, value, full_key, wifi_access_point_handlers, NULL, error)) {
88 access_point_clear(&npp->current.access_point, npp->current.backend);
89+ g_hash_table_foreach(access_points, free_access_point, NULL);
90+ g_hash_table_destroy(access_points);
91 return FALSE;
92 }
93
94+ g_hash_table_insert(access_points, access_point->ssid, access_point);
95+ npp->current.access_point = NULL;
96+ }
97+
98+ if (g_hash_table_size(access_points) > 0) {
99 if (!npp->current.netdef->access_points)
100 npp->current.netdef->access_points = g_hash_table_new(g_str_hash, g_str_equal);
101- g_hash_table_insert(npp->current.netdef->access_points, access_point->ssid, access_point);
102- npp->current.access_point = NULL;
103+ g_hash_table_foreach_steal(access_points, insert_kv_into_hash, npp->current.netdef->access_points);
104+ mark_data_as_dirty(npp, &npp->current.netdef->access_points);
105 }
106- mark_data_as_dirty(npp, &npp->current.netdef->access_points);
107+ g_hash_table_destroy(access_points);
108 return TRUE;
109 }
110
111--- a/src/types-internal.h
112+++ b/src/types-internal.h
113@@ -313,3 +313,6 @@
114
115 void
116 free_address_options(void* ptr);
117+
118+void
119+free_access_point(void* key, void* value, void* data);
120--- a/src/types.c
121+++ b/src/types.c
122@@ -200,7 +200,7 @@
123 * @data: pointer to a NetplanBackend value representing the renderer context in which
124 * to interpret the processed object, especially regarding the backend settings
125 */
126-static void
127+void
128 free_access_point(__unused void* key, void* value, __unused void* data)
129 {
130 NetplanWifiAccessPoint* ap = value;
131--- a/tests/generator/test_common.py
132+++ b/tests/generator/test_common.py
133@@ -1557,6 +1557,28 @@
134 ''',
135 'eth0.network': ND_EMPTY % ('eth0', 'no') + 'Bond=aggi\n'})
136
137+ def test_check_parser_second_pass_will_not_lead_to_duplicate_access_point(self):
138+ '''
139+ When the parser needs more than one pass we shouldn't
140+ try to load the same access-point again from wifi devices.
141+ Testcase for LP: #1809994'''
142+
143+ self.generate('''network:
144+ bridges:
145+ br0:
146+ interfaces:
147+ - eth0
148+ ethernets:
149+ eth0:
150+ dhcp4: false
151+ wifis:
152+ wlan0:
153+ dhcp4: true
154+ access-points:
155+ "mywifi":
156+ password: "aaaaaaaa"
157+''')
158+
159
160 class TestMerging(TestBase):
161 '''multiple *.yaml merging'''
162@@ -1740,3 +1762,35 @@
163 ''',
164 'enyellow.network': ND_DHCP4 % 'enyellow',
165 'enblue.network': ND_DHCP4 % 'enblue'})
166+
167+ def test_wifi_access_points_merging(self):
168+ self.generate('''network:
169+ version: 2
170+ wifis:
171+ wlan0:
172+ dhcp4: true
173+ access-points:
174+ "mywifi":
175+ password: "aaaaaaaa"''',
176+ confs={'newwifi': '''network:
177+ version: 2
178+ wifis:
179+ wlan0:
180+ dhcp4: true
181+ access-points:
182+ "mynewwifi":
183+ password: "aaaaaaaa"'''})
184+
185+ self.assert_wpa_supplicant("wlan0", """ctrl_interface=/run/wpa_supplicant
186+
187+network={
188+ ssid="mynewwifi"
189+ key_mgmt=WPA-PSK
190+ psk="aaaaaaaa"
191+}
192+network={
193+ ssid="mywifi"
194+ key_mgmt=WPA-PSK
195+ psk="aaaaaaaa"
196+}
197+""")
diff --git a/debian/patches/lp1809994/0011-wifi-replace-the-previously-defined-AP-with-the-new-.patch b/debian/patches/lp1809994/0011-wifi-replace-the-previously-defined-AP-with-the-new-.patch
198deleted file mode 1006440deleted file mode 100644
index c03521e..0000000
--- a/debian/patches/lp1809994/0011-wifi-replace-the-previously-defined-AP-with-the-new-.patch
+++ /dev/null
@@ -1,79 +0,0 @@
1From: Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com>
2Date: Thu, 12 Oct 2023 18:07:31 +0100
3Subject: wifi: replace the previously defined AP with the new one
4
5If we find an AP with the same name in the same interface, we drop the
6first one and use the new one. This is done to maintain the documented
7behavior of respecting the order in which the files are parsed. We still
8need to implement support for merging AP settings.
9
10Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/1809994
11Origin: https://github.com/canonical/netplan/pull/413
12---
13 src/parse.c | 17 +++++++++++++----
14 tests/generator/test_common.py | 30 ++++++++++++++++++++++++++++++
15 2 files changed, 43 insertions(+), 4 deletions(-)
16
17--- a/src/parse.c
18+++ b/src/parse.c
19@@ -1428,11 +1428,20 @@
20
21 ssid = scalar(key);
22
23- /* Skip access-points that already exist in the netdef */
24- if (npp->current.netdef->access_points && g_hash_table_contains(npp->current.netdef->access_points, ssid))
25- continue;
26+ /*
27+ * Delete the access-point if it already exists in the netdef and let the new
28+ * one be added. It has the side effect of reprocessing APs if the parser requires a
29+ * second pass.
30+ *
31+ * TODO: implement support for merging AP settings if they were previously defined
32+ */
33+ if (npp->current.netdef->access_points && g_hash_table_contains(npp->current.netdef->access_points, ssid)) {
34+ NetplanWifiAccessPoint *ap = g_hash_table_lookup(npp->current.netdef->access_points, ssid);
35+ g_hash_table_remove(npp->current.netdef->access_points, ssid);
36+ free_access_point(NULL, ap, NULL);
37+ }
38
39- /* Check if there's already an SSID with that name in the list of APs we are parsing */
40+ /* Check if the SSID was already defined in the same netdef in this YAML file we are parsing */
41 if (g_hash_table_contains(access_points, ssid)) {
42 g_hash_table_foreach(access_points, free_access_point, NULL);
43 g_hash_table_destroy(access_points);
44--- a/tests/generator/test_common.py
45+++ b/tests/generator/test_common.py
46@@ -1794,3 +1794,33 @@
47 psk="aaaaaaaa"
48 }
49 """)
50+
51+ def test_wifi_access_points_overwriting(self):
52+ ''' If we find an AP that is already defined we drop the first one.
53+ XXX: this test must be removed once we implement support for AP merging
54+ '''
55+ self.generate('''network:
56+ version: 2
57+ wifis:
58+ wlan0:
59+ dhcp4: true
60+ access-points:
61+ "mywifi":
62+ password: "aaaaaaaa"''',
63+ confs={'newwifi': '''network:
64+ version: 2
65+ wifis:
66+ wlan0:
67+ dhcp4: true
68+ access-points:
69+ "mywifi":
70+ password: "bbbbbbbb"'''})
71+
72+ self.assert_wpa_supplicant("wlan0", """ctrl_interface=/run/wpa_supplicant
73+
74+network={
75+ ssid="mywifi"
76+ key_mgmt=WPA-PSK
77+ psk="bbbbbbbb"
78+}
79+""")
diff --git a/debian/patches/lp2034067/0004-tunnels-validation-do-not-error-out-if-local-is-not-.patch b/debian/patches/lp2034067/0004-tunnels-validation-do-not-error-out-if-local-is-not-.patch
80deleted file mode 1006440deleted file mode 100644
index e65fc4e..0000000
--- a/debian/patches/lp2034067/0004-tunnels-validation-do-not-error-out-if-local-is-not-.patch
+++ /dev/null
@@ -1,98 +0,0 @@
1From: Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com>
2Date: Fri, 1 Sep 2023 15:30:46 +0100
3Subject: tunnels/validation: do not error out if "local" is not defined
4
5The "local" IP property is not required by backends so we shouldn't
6error out if it's not defined.
7
8Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2034067
9Origin: https://github.com/canonical/netplan/pull/407
10---
11 src/networkd.c | 3 ++-
12 src/nm.c | 3 ++-
13 src/validation.c | 6 ++----
14 tests/generator/test_tunnels.py | 12 ------------
15 4 files changed, 6 insertions(+), 18 deletions(-)
16
17diff --git a/src/networkd.c b/src/networkd.c
18index 602b472..325197d 100644
19--- a/src/networkd.c
20+++ b/src/networkd.c
21@@ -141,7 +141,8 @@ write_tunnel_params(GString* s, const NetplanNetDefinition* def)
22 g_string_printf(params, "Independent=true\n");
23 if (def->tunnel.mode == NETPLAN_TUNNEL_MODE_IPIP6 || def->tunnel.mode == NETPLAN_TUNNEL_MODE_IP6IP6)
24 g_string_append_printf(params, "Mode=%s\n", netplan_tunnel_mode_name(def->tunnel.mode));
25- g_string_append_printf(params, "Local=%s\n", def->tunnel.local_ip);
26+ if (def->tunnel.local_ip)
27+ g_string_append_printf(params, "Local=%s\n", def->tunnel.local_ip);
28 g_string_append_printf(params, "Remote=%s\n", def->tunnel.remote_ip);
29 if (def->tunnel_ttl)
30 g_string_append_printf(params, "TTL=%u\n", def->tunnel_ttl);
31diff --git a/src/nm.c b/src/nm.c
32index a8ae1a6..c9279d4 100644
33--- a/src/nm.c
34+++ b/src/nm.c
35@@ -393,7 +393,8 @@ static void
36 write_tunnel_params(const NetplanNetDefinition* def, GKeyFile *kf)
37 {
38 g_key_file_set_integer(kf, "ip-tunnel", "mode", def->tunnel.mode);
39- g_key_file_set_string(kf, "ip-tunnel", "local", def->tunnel.local_ip);
40+ if (def->tunnel.local_ip)
41+ g_key_file_set_string(kf, "ip-tunnel", "local", def->tunnel.local_ip);
42 g_key_file_set_string(kf, "ip-tunnel", "remote", def->tunnel.remote_ip);
43 if (def->tunnel_ttl)
44 g_key_file_set_uint64(kf, "ip-tunnel", "ttl", def->tunnel_ttl);
45diff --git a/src/validation.c b/src/validation.c
46index 76fe1bb..4e37213 100644
47--- a/src/validation.c
48+++ b/src/validation.c
49@@ -241,8 +241,6 @@ validate_tunnel_grammar(const NetplanParser* npp, NetplanNetDefinition* nd, yaml
50
51 /* Validate local/remote IPs */
52 if (nd->tunnel.mode != NETPLAN_TUNNEL_MODE_VXLAN) {
53- if (!nd->tunnel.local_ip)
54- return yaml_error(npp, node, error, "%s: missing 'local' property for tunnel", nd->id);
55 if (!nd->tunnel.remote_ip)
56 return yaml_error(npp, node, error, "%s: missing 'remote' property for tunnel", nd->id);
57 }
58@@ -255,7 +253,7 @@ validate_tunnel_grammar(const NetplanParser* npp, NetplanNetDefinition* nd, yaml
59 case NETPLAN_TUNNEL_MODE_IP6GRE:
60 case NETPLAN_TUNNEL_MODE_IP6GRETAP:
61 case NETPLAN_TUNNEL_MODE_VTI6:
62- if (!is_ip6_address(nd->tunnel.local_ip))
63+ if (nd->tunnel.local_ip && !is_ip6_address(nd->tunnel.local_ip))
64 return yaml_error(npp, node, error, "%s: 'local' must be a valid IPv6 address for this tunnel type", nd->id);
65 if (!is_ip6_address(nd->tunnel.remote_ip))
66 return yaml_error(npp, node, error, "%s: 'remote' must be a valid IPv6 address for this tunnel type", nd->id);
67@@ -268,7 +266,7 @@ validate_tunnel_grammar(const NetplanParser* npp, NetplanNetDefinition* nd, yaml
68 break;
69
70 default:
71- if (!is_ip4_address(nd->tunnel.local_ip))
72+ if (nd->tunnel.local_ip && !is_ip4_address(nd->tunnel.local_ip))
73 return yaml_error(npp, node, error, "%s: 'local' must be a valid IPv4 address for this tunnel type", nd->id);
74 if (!is_ip4_address(nd->tunnel.remote_ip))
75 return yaml_error(npp, node, error, "%s: 'remote' must be a valid IPv4 address for this tunnel type", nd->id);
76diff --git a/tests/generator/test_tunnels.py b/tests/generator/test_tunnels.py
77index eec7b00..7a76de7 100644
78--- a/tests/generator/test_tunnels.py
79+++ b/tests/generator/test_tunnels.py
80@@ -1643,18 +1643,6 @@ class TestConfigErrors(TestBase):
81 out = self.generate(config, expect_fail=True)
82 self.assertIn("Error in network definition: address '10.10.10.10/21' should not include /prefixlength", out)
83
84- def test_missing_local_ip(self):
85- """Fail if local IP is missing"""
86- config = '''network:
87- version: 2
88- tunnels:
89- tun0:
90- mode: gre
91- remote: 20.20.20.20
92-'''
93- out = self.generate(config, expect_fail=True)
94- self.assertIn("Error in network definition: tun0: missing 'local' property for tunnel", out)
95-
96 def test_missing_remote_ip(self):
97 """Fail if remote IP is missing"""
98 config = '''network:
diff --git a/debian/patches/lp2034067/0005-tests-add-some-integration-tests-without-the-local-a.patch b/debian/patches/lp2034067/0005-tests-add-some-integration-tests-without-the-local-a.patch
99deleted file mode 1006440deleted file mode 100644
index c99bc4d..0000000
--- a/debian/patches/lp2034067/0005-tests-add-some-integration-tests-without-the-local-a.patch
+++ /dev/null
@@ -1,81 +0,0 @@
1From: Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com>
2Date: Fri, 1 Sep 2023 17:48:30 +0100
3Subject: tests: add some integration tests without the local address
4
5Copy a few tunnels common tests and remove the local address to ensure
6both backends will work fine.
7
8Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2034067
9Origin: https://github.com/canonical/netplan/pull/407
10---
11 tests/integration/tunnels.py | 43 +++++++++++++++++++++++++++++++++++++++++++
12 1 file changed, 43 insertions(+)
13
14diff --git a/tests/integration/tunnels.py b/tests/integration/tunnels.py
15index a915554..bdacb55 100644
16--- a/tests/integration/tunnels.py
17+++ b/tests/integration/tunnels.py
18@@ -45,6 +45,20 @@ class _CommonTests():
19 self.generate_and_settle(['sit-tun0'])
20 self.assert_iface('sit-tun0', ['sit-tun0@NONE', 'link.* 192.168.5.1 peer 99.99.99.99'])
21
22+ def test_tunnel_sit_without_local_address(self):
23+ self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'sit-tun0'], stderr=subprocess.DEVNULL)
24+ with open(self.config, 'w') as f:
25+ f.write('''network:
26+ renderer: %(r)s
27+ version: 2
28+ tunnels:
29+ sit-tun0:
30+ mode: sit
31+ remote: 99.99.99.99
32+''' % {'r': self.backend})
33+ self.generate_and_settle(['sit-tun0'])
34+ self.assert_iface('sit-tun0', ['sit-tun0@NONE', 'link.* 0.0.0.0 peer 99.99.99.99'])
35+
36 def test_tunnel_ipip(self):
37 self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL)
38 with open(self.config, 'w') as f:
39@@ -61,6 +75,21 @@ class _CommonTests():
40 self.generate_and_settle(['tun0'])
41 self.assert_iface('tun0', ['tun0@NONE', 'link.* 192.168.5.1 peer 99.99.99.99'])
42
43+ def test_tunnel_ipip_without_local_address(self):
44+ self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL)
45+ with open(self.config, 'w') as f:
46+ f.write('''network:
47+ renderer: %(r)s
48+ version: 2
49+ tunnels:
50+ tun0:
51+ mode: ipip
52+ remote: 99.99.99.99
53+ ttl: 64
54+''' % {'r': self.backend})
55+ self.generate_and_settle(['tun0'])
56+ self.assert_iface('tun0', ['tun0@NONE', 'link.* 0.0.0.0 peer 99.99.99.99'])
57+
58 def test_tunnel_wireguard(self):
59 self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'wg0'], stderr=subprocess.DEVNULL)
60 self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'wg1'], stderr=subprocess.DEVNULL)
61@@ -142,6 +171,20 @@ class _CommonTests():
62 self.generate_and_settle(['tun0'])
63 self.assert_iface('tun0', ['tun0@NONE', 'link.* 192.168.5.1 peer 99.99.99.99'])
64
65+ def test_tunnel_gre_without_local_address(self):
66+ self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL)
67+ with open(self.config, 'w') as f:
68+ f.write('''network:
69+ renderer: %(r)s
70+ version: 2
71+ tunnels:
72+ tun0:
73+ mode: gre
74+ remote: 99.99.99.99
75+''' % {'r': self.backend})
76+ self.generate_and_settle(['tun0'])
77+ self.assert_iface('tun0', ['tun0@NONE', 'link.* 0.0.0.0 peer 99.99.99.99'])
78+
79 def test_tunnel_gre6(self):
80 self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL)
81 with open(self.config, 'w') as f:
diff --git a/debian/patches/lp2034595/0006-apply-bring-lo-back-up-if-it-s-managed-by-NM.patch b/debian/patches/lp2034595/0006-apply-bring-lo-back-up-if-it-s-managed-by-NM.patch
82deleted file mode 1006440deleted file mode 100644
index 030036b..0000000
--- a/debian/patches/lp2034595/0006-apply-bring-lo-back-up-if-it-s-managed-by-NM.patch
+++ /dev/null
@@ -1,52 +0,0 @@
1From: Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com>
2Date: Tue, 5 Sep 2023 18:03:10 +0100
3Subject: apply: bring "lo" back up if it's managed by NM
4
5Origin: https://github.com/canonical/netplan/pull/408
6Bug: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2034595
7
8NM is not bringing it back automatically after we flush its addresses.
9It's not clear if it's a bug or intended behavior.
10---
11 netplan_cli/cli/commands/apply.py | 16 +++++++++++++++-
12 1 file changed, 15 insertions(+), 1 deletion(-)
13
14diff --git a/netplan_cli/cli/commands/apply.py b/netplan_cli/cli/commands/apply.py
15index 8bf8a94..181e400 100644
16--- a/netplan_cli/cli/commands/apply.py
17+++ b/netplan_cli/cli/commands/apply.py
18@@ -286,12 +286,18 @@ class NetplanApply(utils.NetplanCommand):
19 if restart_nm:
20 # Flush all IP addresses of NM managed interfaces, to avoid NM creating
21 # new, non netplan-* connection profiles, using the existing IPs.
22- for iface in utils.nm_interfaces(restart_nm_glob, devices):
23+ nm_interfaces = utils.nm_interfaces(restart_nm_glob, devices)
24+ for iface in nm_interfaces:
25 utils.ip_addr_flush(iface)
26 # clear NM state, especially the [device].managed=true config, as that might have been
27 # re-set via an udev rule setting "NM_UNMANAGED=1"
28 shutil.rmtree('/run/NetworkManager/devices', ignore_errors=True)
29 utils.systemctl_network_manager('start', sync=sync)
30+ # If 'lo' is in the nm_interfaces set we flushed it's IPs (see above) and will need to bring it
31+ # back manually. For that, we need NM up and ready to accept commands
32+ if 'lo' in nm_interfaces:
33+ sync = True
34+
35 if sync:
36 # 'nmcli' could be /usr/bin/nmcli or
37 # /snap/bin/nmcli -> /snap/bin/network-manager.nmcli
38@@ -309,6 +315,14 @@ class NetplanApply(utils.NetplanCommand):
39 break
40 time.sleep(0.5)
41
42+ # If "lo" is managed by NM through Netplan, apply will flush its addresses and NM
43+ # will not bring it back automatically like other connections.
44+ # This is a possible scenario with netplan-everywhere. If a user tries to change the 'lo'
45+ # connection with nmcli for example, NM will create a persistent nmconnection file and emit a YAML for it.
46+ if 'lo' in nm_interfaces:
47+ cmd = ['nmcli', 'con', 'up', 'lo']
48+ subprocess.call(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
49+
50 @staticmethod
51 def is_composite_member(composites, phy):
52 """
diff --git a/debian/patches/lp2034595/0007-apply-don-t-assume-the-NM-loopback-connection-is-cal.patch b/debian/patches/lp2034595/0007-apply-don-t-assume-the-NM-loopback-connection-is-cal.patch
53deleted file mode 1006440deleted file mode 100644
index ca364c9..0000000
--- a/debian/patches/lp2034595/0007-apply-don-t-assume-the-NM-loopback-connection-is-cal.patch
+++ /dev/null
@@ -1,108 +0,0 @@
1From: Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com>
2Date: Thu, 7 Sep 2023 14:10:54 +0100
3Subject: apply: don't assume the NM loopback connection is called "lo"
4
5Origin: https://github.com/canonical/netplan/pull/408
6Bug: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2034595
7
8It might have any name, so we need to get the connection name
9dynamically.
10---
11 netplan_cli/cli/commands/apply.py | 18 +++++++++++-------
12 netplan_cli/cli/utils.py | 14 ++++++++++++++
13 tests/test_utils.py | 12 ++++++++++++
14 3 files changed, 37 insertions(+), 7 deletions(-)
15
16diff --git a/netplan_cli/cli/commands/apply.py b/netplan_cli/cli/commands/apply.py
17index 181e400..066f496 100644
18--- a/netplan_cli/cli/commands/apply.py
19+++ b/netplan_cli/cli/commands/apply.py
20@@ -176,9 +176,12 @@ class NetplanApply(utils.NetplanCommand):
21 else:
22 logging.debug('no netplan generated networkd configuration exists')
23
24+ loopback_connection = ''
25 if restart_nm:
26 logging.debug('netplan generated NM configuration changed, restarting NM')
27 if utils.nm_running():
28+ if 'lo' in nm_ifaces:
29+ loopback_connection = utils.nm_get_connection_for_interface('lo')
30 # restarting NM does not cause new config to be applied, need to shut down devices first
31 for device in devices:
32 if device not in nm_ifaces:
33@@ -293,8 +296,10 @@ class NetplanApply(utils.NetplanCommand):
34 # re-set via an udev rule setting "NM_UNMANAGED=1"
35 shutil.rmtree('/run/NetworkManager/devices', ignore_errors=True)
36 utils.systemctl_network_manager('start', sync=sync)
37- # If 'lo' is in the nm_interfaces set we flushed it's IPs (see above) and will need to bring it
38- # back manually. For that, we need NM up and ready to accept commands
39+
40+ # If 'lo' is in the nm_interfaces set we flushed it's IPs (see above) and disconnected it.
41+ # NM will not bring it back automatically after restarting and we need to do that manually.
42+ # For that, we need NM up and ready to accept commands
43 if 'lo' in nm_interfaces:
44 sync = True
45
46@@ -315,13 +320,12 @@ class NetplanApply(utils.NetplanCommand):
47 break
48 time.sleep(0.5)
49
50- # If "lo" is managed by NM through Netplan, apply will flush its addresses and NM
51- # will not bring it back automatically like other connections.
52+ # If "lo" is managed by NM through Netplan, apply will flush its addresses and disconnect it.
53+ # NM will not bring it back automatically.
54 # This is a possible scenario with netplan-everywhere. If a user tries to change the 'lo'
55 # connection with nmcli for example, NM will create a persistent nmconnection file and emit a YAML for it.
56- if 'lo' in nm_interfaces:
57- cmd = ['nmcli', 'con', 'up', 'lo']
58- subprocess.call(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
59+ if 'lo' in nm_interfaces and loopback_connection:
60+ utils.nm_bring_interface_up(loopback_connection)
61
62 @staticmethod
63 def is_composite_member(composites, phy):
64diff --git a/netplan_cli/cli/utils.py b/netplan_cli/cli/utils.py
65index d0a85df..a5f60c9 100644
66--- a/netplan_cli/cli/utils.py
67+++ b/netplan_cli/cli/utils.py
68@@ -78,6 +78,20 @@ def nm_interfaces(paths, devices):
69 return interfaces
70
71
72+def nm_get_connection_for_interface(interface: str) -> str:
73+ output = nmcli_out(['-m', 'tabular', '-f', 'GENERAL.CONNECTION', 'device', 'show', interface])
74+ lines = output.strip().split('\n')
75+ connection = lines[1]
76+ return connection if connection != '--' else ''
77+
78+
79+def nm_bring_interface_up(connection: str) -> None: # pragma: nocover (must be covered by NM autopkgtests)
80+ try:
81+ nmcli(['connection', 'up', connection])
82+ except subprocess.CalledProcessError:
83+ pass
84+
85+
86 def systemctl_network_manager(action, sync=False):
87 # If the network-manager snap is installed use its service
88 # name rather than the one of the deb packaged NetworkManager
89diff --git a/tests/test_utils.py b/tests/test_utils.py
90index ec57087..b2a1657 100644
91--- a/tests/test_utils.py
92+++ b/tests/test_utils.py
93@@ -371,3 +371,15 @@ class TestUtils(unittest.TestCase):
94 self.assertEqual(self.mock_cmd.calls(), [
95 ['ip', 'addr', 'flush', 'eth42']
96 ])
97+
98+ @patch('netplan_cli.cli.utils.nmcli_out')
99+ def test_nm_get_connection_for_interface(self, nmcli):
100+ nmcli.return_value = 'CONNECTION \nlo \n'
101+ out = utils.nm_get_connection_for_interface('lo')
102+ self.assertEqual(out, 'lo')
103+
104+ @patch('netplan_cli.cli.utils.nmcli_out')
105+ def test_nm_get_connection_for_interface_no_connection(self, nmcli):
106+ nmcli.return_value = 'CONNECTION \n-- \n'
107+ out = utils.nm_get_connection_for_interface('asd0')
108+ self.assertEqual(out, '')
diff --git a/debian/patches/lp2039821/0008-wireguard-ignore-empty-endpoints.patch b/debian/patches/lp2039821/0008-wireguard-ignore-empty-endpoints.patch
109deleted file mode 1006440deleted file mode 100644
index e2b3892..0000000
--- a/debian/patches/lp2039821/0008-wireguard-ignore-empty-endpoints.patch
+++ /dev/null
@@ -1,117 +0,0 @@
1From 1758948e6cb064b9b00ba3b42ce36ea9546d4773 Mon Sep 17 00:00:00 2001
2From: Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com>
3Date: Tue, 10 Oct 2023 11:06:51 +0100
4Subject: wireguard: ignore empty endpoints
5
6The Network Manager GUI will emit 'Endpoint=' if it's not specified when
7creating the tunnel. libnetplan is generating 'endpoint: ""' in this case
8and the parser is returning an error.
9
10In nm-parse, if Endpoint is either empty or NULL we'll just not read it. In
11the parser, if we find 'endpoint: ""', we'll just ignore it as if it
12were not defined.
13
14See LP: #2038811
15
16Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2039821
17Origin: https://github.com/canonical/netplan/pull/414
18---
19 src/parse-nm.c | 6 +++++-
20 src/parse.c | 5 +++++
21 tests/generator/test_tunnels.py | 9 ++++++++
22 tests/parser/test_keyfile.py | 37 +++++++++++++++++++++++++++++++++
23 4 files changed, 56 insertions(+), 1 deletion(-)
24
25--- a/src/parse-nm.c
26+++ b/src/parse-nm.c
27@@ -552,7 +552,11 @@
28 }
29
30 /* Handle endpoint */
31- wireguard_peer->endpoint = g_key_file_get_string(kf, group, "endpoint", NULL);
32+ gchar* endpoint = g_key_file_get_string(kf, group, "endpoint", NULL);
33+ if (endpoint && g_strcmp0(endpoint, "")) {
34+ /* Only set the endpoint if it's not NULL nor an empty string */
35+ wireguard_peer->endpoint = endpoint;
36+ }
37 _kf_clear_key(kf, group, "endpoint");
38
39 g_array_append_val(nd->wireguard_peers, wireguard_peer);
40--- a/src/parse.c
41+++ b/src/parse.c
42@@ -2445,6 +2445,11 @@
43 char* address;
44 guint64 port_num;
45
46+ /* If endpoint is an empty string just ignore it */
47+ if (!g_strcmp0(scalar(node), "")) {
48+ return TRUE;
49+ }
50+
51 endpoint = g_strdup(scalar(node));
52 /* absolute minimal length of endpoint is 3 chars: 'h:8' */
53 if (strlen(endpoint) < 3) {
54--- a/tests/generator/test_tunnels.py
55+++ b/tests/generator/test_tunnels.py
56@@ -309,6 +309,15 @@
57 out = self.generate(config, expect_fail=True)
58 self.assertIn("Error in network definition: wg0: a public key is required.", out)
59
60+ def test_empty_string_as_endpoint_should_be_ignored(self):
61+ """[wireguard] If the endpoint key is present but set to '' it should just be ignored"""
62+ config = prepare_wg_config(listen=12345, privkey='KPt9BzQjejRerEv8RMaFlpsD675gNexELOQRXt/AcH0=',
63+ peers=[{'public-key': 'rlbInAj0qV69CysWPQY7KEBnKxpYCpaWqOs/dLevdWc=',
64+ 'allowed-ips': '[0.0.0.0/0, "2001:fe:ad:de:ad:be:ef:1/24"]',
65+ 'keepalive': 14,
66+ 'endpoint': '\"\"'}], renderer=self.backend)
67+ self.generate(config, skip_generated_yaml_validation=True)
68+
69 def test_vxlan_port_range_fail(self):
70 out = self.generate('''network:
71 tunnels:
72--- a/tests/parser/test_keyfile.py
73+++ b/tests/parser/test_keyfile.py
74@@ -1591,6 +1591,43 @@
75 connection.interface-name: "wg0"
76 '''.format(UUID, UUID)})
77
78+ def test_wireguard_with_empty_endpoint(self):
79+ self.generate_from_keyfile('''[connection]
80+id=wg0
81+type=wireguard
82+uuid={}
83+interface-name=wg0
84+
85+[wireguard]
86+private-key=aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
87+
88+[wireguard-peer.cwkb7k0xDgLSnunZpFIjLJw4u+mJDDr+aBR5DqzpmgI=]
89+endpoint=
90+allowed-ips=192.168.0.0/24;
91+
92+[ipv4]
93+method=auto\n'''.format(UUID), regenerate=False)
94+ self.assert_netplan({UUID: '''network:
95+ version: 2
96+ tunnels:
97+ NM-{}:
98+ renderer: NetworkManager
99+ dhcp4: true
100+ mode: "wireguard"
101+ keys:
102+ private: "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
103+ peers:
104+ - keys:
105+ public: "cwkb7k0xDgLSnunZpFIjLJw4u+mJDDr+aBR5DqzpmgI="
106+ allowed-ips:
107+ - "192.168.0.0/24"
108+ networkmanager:
109+ uuid: "{}"
110+ name: "wg0"
111+ passthrough:
112+ connection.interface-name: "wg0"
113+'''.format(UUID, UUID)})
114+
115 def test_wireguard_allowed_ips_without_prefix(self):
116 '''
117 When the IP prefix is not present we should default to /32
diff --git a/debian/patches/lp2039825/0009-auth-add-support-for-LEAP-and-EAP-PWD.patch b/debian/patches/lp2039825/0009-auth-add-support-for-LEAP-and-EAP-PWD.patch
118deleted file mode 1006440deleted file mode 100644
index d13d07e..0000000
--- a/debian/patches/lp2039825/0009-auth-add-support-for-LEAP-and-EAP-PWD.patch
+++ /dev/null
@@ -1,371 +0,0 @@
1From 4a5a9ed735688c3c19cd86d6638ec4ff5bdf17e4 Mon Sep 17 00:00:00 2001
2From: Danilo Egea Gondolfo <danilo.egea.gondolfo@canonical.com>
3Date: Tue, 10 Oct 2023 16:21:53 +0100
4Subject: auth: add support for LEAP and EAP-PWD
5
6This changes add support for the LEAP and PWD EAP authentication methods
7for NetworkManager, wpa_supplicant (networkd) and the keyfile parser.
8
9Using these method through the NM GUI is causing problems because
10libnetplan will generate a broken keyfile. See LP: #2038811
11
12Note that the NM GUI supports more methods not recognized by netplan and
13we probably should also implement them later.
14
15Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2039825
16Origin: https://github.com/canonical/netplan/pull/415
17---
18 doc/netplan-yaml.md | 3 +-
19 src/abi.h | 2 +
20 src/names.c | 2 +
21 src/networkd.c | 8 +++
22 src/nm.c | 6 ++
23 src/parse-nm.c | 4 ++
24 src/parse.c | 4 ++
25 tests/generator/test_wifis.py | 124 ++++++++++++++++++++++++++++++++++
26 tests/parser/test_keyfile.py | 100 +++++++++++++++++++++++++++
27 9 files changed, 252 insertions(+), 1 deletion(-)
28
29--- a/src/abi.h
30+++ b/src/abi.h
31@@ -116,6 +116,8 @@
32 NETPLAN_AUTH_EAP_TLS,
33 NETPLAN_AUTH_EAP_PEAP,
34 NETPLAN_AUTH_EAP_TTLS,
35+ NETPLAN_AUTH_EAP_LEAP,
36+ NETPLAN_AUTH_EAP_PWD,
37 NETPLAN_AUTH_EAP_METHOD_MAX,
38 } NetplanAuthEAPMethod;
39
40--- a/src/names.c
41+++ b/src/names.c
42@@ -70,6 +70,8 @@
43 [NETPLAN_AUTH_EAP_TLS] = "tls",
44 [NETPLAN_AUTH_EAP_PEAP] = "peap",
45 [NETPLAN_AUTH_EAP_TTLS] = "ttls",
46+ [NETPLAN_AUTH_EAP_LEAP] = "leap",
47+ [NETPLAN_AUTH_EAP_PWD] = "pwd",
48 };
49
50 static const char* const
51--- a/src/networkd.c
52+++ b/src/networkd.c
53@@ -1082,6 +1082,14 @@
54 g_string_append(s, " eap=TTLS\n");
55 break;
56
57+ case NETPLAN_AUTH_EAP_LEAP:
58+ g_string_append(s, " eap=LEAP\n");
59+ break;
60+
61+ case NETPLAN_AUTH_EAP_PWD:
62+ g_string_append(s, " eap=PWD\n");
63+ break;
64+
65 default: break; // LCOV_EXCL_LINE
66 }
67
68--- a/src/nm.c
69+++ b/src/nm.c
70@@ -417,6 +417,12 @@
71 case NETPLAN_AUTH_EAP_TTLS:
72 g_key_file_set_string(kf, "802-1x", "eap", "ttls");
73 break;
74+ case NETPLAN_AUTH_EAP_LEAP:
75+ g_key_file_set_string(kf, "802-1x", "eap", "leap");
76+ break;
77+ case NETPLAN_AUTH_EAP_PWD:
78+ g_key_file_set_string(kf, "802-1x", "eap", "pwd");
79+ break;
80 default: break; // LCOV_EXCL_LINE
81 }
82
83--- a/src/parse-nm.c
84+++ b/src/parse-nm.c
85@@ -386,6 +386,10 @@
86 auth->eap_method = NETPLAN_AUTH_EAP_PEAP;
87 } else if (g_strcmp0(first_method, "ttls") == 0) {
88 auth->eap_method = NETPLAN_AUTH_EAP_TTLS;
89+ } else if (g_strcmp0(first_method, "leap") == 0) {
90+ auth->eap_method = NETPLAN_AUTH_EAP_LEAP;
91+ } else if (g_strcmp0(first_method, "pwd") == 0) {
92+ auth->eap_method = NETPLAN_AUTH_EAP_PWD;
93 }
94
95 /* If "method" (which is a list separated by ";") has more than one value,
96--- a/src/parse.c
97+++ b/src/parse.c
98@@ -935,6 +935,10 @@
99 auth->eap_method = NETPLAN_AUTH_EAP_PEAP;
100 else if (strcmp(scalar(node), "ttls") == 0)
101 auth->eap_method = NETPLAN_AUTH_EAP_TTLS;
102+ else if (strcmp(scalar(node), "leap") == 0)
103+ auth->eap_method = NETPLAN_AUTH_EAP_LEAP;
104+ else if (strcmp(scalar(node), "pwd") == 0)
105+ auth->eap_method = NETPLAN_AUTH_EAP_PWD;
106 else
107 return yaml_error(npp, node, error, "unknown EAP method '%s'", scalar(node));
108 return TRUE;
109--- a/tests/generator/test_wifis.py
110+++ b/tests/generator/test_wifis.py
111@@ -363,6 +363,54 @@
112 }
113 """)
114
115+ def test_wifi_ieee8021x_eap_leap(self):
116+ self.generate('''network:
117+ version: 2
118+ wifis:
119+ wl0:
120+ access-points:
121+ homenet:
122+ auth:
123+ key-management: 802.1x
124+ method: leap
125+ identity: some-id
126+ password: "********"''')
127+
128+ self.assert_wpa_supplicant("wl0", """ctrl_interface=/run/wpa_supplicant
129+
130+network={
131+ ssid="homenet"
132+ key_mgmt=IEEE8021X
133+ eap=LEAP
134+ identity="some-id"
135+ password="********"
136+}
137+""")
138+
139+ def test_wifi_ieee8021x_eap_pwd(self):
140+ self.generate('''network:
141+ version: 2
142+ wifis:
143+ wl0:
144+ access-points:
145+ homenet:
146+ auth:
147+ key-management: 802.1x
148+ method: pwd
149+ identity: some-id
150+ password: "********"''')
151+
152+ self.assert_wpa_supplicant("wl0", """ctrl_interface=/run/wpa_supplicant
153+
154+network={
155+ ssid="homenet"
156+ key_mgmt=IEEE8021X
157+ eap=PWD
158+ identity="some-id"
159+ password="********"
160+}
161+""")
162+
163
164 class TestNetworkManager(TestBase):
165
166@@ -703,6 +751,82 @@
167 psk=********
168 '''})
169
170+ def test_wifi_ieee8021x_leap(self):
171+ self.generate('''network:
172+ version: 2
173+ renderer: NetworkManager
174+ wifis:
175+ wl0:
176+ access-points:
177+ homenet:
178+ auth:
179+ key-management: 802.1x
180+ method: leap
181+ identity: "some-id"
182+ password: "**********"''')
183+
184+ self.assert_nm({'wl0-homenet': '''[connection]
185+id=netplan-wl0-homenet
186+type=wifi
187+interface-name=wl0
188+
189+[ipv4]
190+method=link-local
191+
192+[ipv6]
193+method=ignore
194+
195+[wifi]
196+ssid=homenet
197+mode=infrastructure
198+
199+[wifi-security]
200+key-mgmt=ieee8021x
201+
202+[802-1x]
203+eap=leap
204+identity=some-id
205+password=**********
206+'''})
207+
208+ def test_wifi_ieee8021x_pwd(self):
209+ self.generate('''network:
210+ version: 2
211+ renderer: NetworkManager
212+ wifis:
213+ wl0:
214+ access-points:
215+ homenet:
216+ auth:
217+ key-management: 802.1x
218+ method: pwd
219+ identity: "some-id"
220+ password: "**********"''')
221+
222+ self.assert_nm({'wl0-homenet': '''[connection]
223+id=netplan-wl0-homenet
224+type=wifi
225+interface-name=wl0
226+
227+[ipv4]
228+method=link-local
229+
230+[ipv6]
231+method=ignore
232+
233+[wifi]
234+ssid=homenet
235+mode=infrastructure
236+
237+[wifi-security]
238+key-mgmt=ieee8021x
239+
240+[802-1x]
241+eap=pwd
242+identity=some-id
243+password=**********
244+'''})
245+
246 def test_wifi_wowlan(self):
247 self.generate('''network:
248 version: 2
249--- a/tests/parser/test_keyfile.py
250+++ b/tests/parser/test_keyfile.py
251@@ -526,6 +526,106 @@
252 def test_keyfile_type_wifi_eap_ttls(self):
253 self._template_keyfile_type_wifi_eap('ttls')
254
255+ def test_keyfile_type_wifi_eap_leap(self):
256+ self._template_keyfile_type_wifi_eap('leap')
257+
258+ def test_keyfile_type_wifi_eap_pwd(self):
259+ self._template_keyfile_type_wifi_eap('pwd')
260+
261+ def test_keyfile_wifi_eap_leap(self):
262+ self.generate_from_keyfile('''[connection]
263+type=wifi
264+uuid={}
265+permissions=
266+id=myid with spaces
267+interface-name=eth0
268+
269+[wifi]
270+ssid=SOME-SSID
271+mode=infrastructure
272+
273+[wifi-security]
274+key-mgmt=ieee8021x
275+
276+[802-1x]
277+eap=leap
278+identity=some-id
279+password=v3rys3cr3t!
280+
281+[ipv4]
282+method=auto'''.format(UUID))
283+ self.assert_netplan({UUID: '''network:
284+ version: 2
285+ wifis:
286+ NM-{}:
287+ renderer: NetworkManager
288+ match:
289+ name: "eth0"
290+ dhcp4: true
291+ access-points:
292+ "SOME-SSID":
293+ auth:
294+ key-management: "802.1x"
295+ method: "leap"
296+ identity: "some-id"
297+ password: "v3rys3cr3t!"
298+ networkmanager:
299+ uuid: "{}"
300+ name: "myid with spaces"
301+ passthrough:
302+ connection.permissions: ""
303+ networkmanager:
304+ uuid: "{}"
305+ name: "myid with spaces"
306+'''.format(UUID, UUID, UUID)})
307+
308+ def test_keyfile_wifi_eap_pwd(self):
309+ self.generate_from_keyfile('''[connection]
310+type=wifi
311+uuid={}
312+permissions=
313+id=myid with spaces
314+interface-name=eth0
315+
316+[wifi]
317+ssid=SOME-SSID
318+mode=infrastructure
319+
320+[wifi-security]
321+key-mgmt=ieee8021x
322+
323+[802-1x]
324+eap=pwd
325+identity=some-id
326+password=v3rys3cr3t!
327+
328+[ipv4]
329+method=auto'''.format(UUID))
330+ self.assert_netplan({UUID: '''network:
331+ version: 2
332+ wifis:
333+ NM-{}:
334+ renderer: NetworkManager
335+ match:
336+ name: "eth0"
337+ dhcp4: true
338+ access-points:
339+ "SOME-SSID":
340+ auth:
341+ key-management: "802.1x"
342+ method: "pwd"
343+ identity: "some-id"
344+ password: "v3rys3cr3t!"
345+ networkmanager:
346+ uuid: "{}"
347+ name: "myid with spaces"
348+ passthrough:
349+ connection.permissions: ""
350+ networkmanager:
351+ uuid: "{}"
352+ name: "myid with spaces"
353+'''.format(UUID, UUID, UUID)})
354+
355 def _template_keyfile_type_wifi(self, nd_mode, nm_mode):
356 self.generate_from_keyfile('''[connection]
357 type=wifi
358--- a/doc/netplan-yaml.md
359+++ b/doc/netplan-yaml.md
360@@ -862,8 +862,9 @@
361
362 - **method** (scalar)
363
364- > The EAP method to use. The supported EAP methods are `tls` (TLS),
365- > `peap` (Protected EAP), and `ttls` (Tunneled TLS).
366+ > The EAP method to use. The supported EAP methods are `tls` (TLS),
367+ > `peap` (Protected EAP), `leap` (Lightweight EAP), `pwd` (EAP Password)
368+ > and `ttls` (Tunneled TLS).
369
370 - **identity** (scalar)
371
diff --git a/debian/patches/lp2041727/0004-cli-utils-introduce-systemctl_is_installed-helper.patch b/debian/patches/lp2041727/0004-cli-utils-introduce-systemctl_is_installed-helper.patch
372new file mode 1006440new file mode 100644
index 0000000..2ac4c6b
--- /dev/null
+++ b/debian/patches/lp2041727/0004-cli-utils-introduce-systemctl_is_installed-helper.patch
@@ -0,0 +1,63 @@
1From: =?utf-8?q?Lukas_M=C3=A4rdian?= <slyon@ubuntu.com>
2Date: Thu, 25 Jan 2024 12:40:06 +0100
3Subject: cli:utils: introduce systemctl_is_installed helper
4
5Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2041727
6Origin: https://github.com/canonical/netplan/pull/421
7---
8 netplan_cli/cli/utils.py | 10 ++++++++++
9 tests/test_utils.py | 20 ++++++++++++++++++++
10 2 files changed, 30 insertions(+)
11
12diff --git a/netplan_cli/cli/utils.py b/netplan_cli/cli/utils.py
13index a5f60c9..f913630 100644
14--- a/netplan_cli/cli/utils.py
15+++ b/netplan_cli/cli/utils.py
16@@ -148,6 +148,16 @@ def systemctl_is_masked(unit_pattern):
17 return False
18
19
20+def systemctl_is_installed(unit_pattern):
21+ '''Return True if returncode is other than "not-found" (4)'''
22+ res = subprocess.run(['systemctl', 'is-enabled', unit_pattern],
23+ stdout=subprocess.PIPE, stderr=subprocess.PIPE,
24+ text=True)
25+ if res.returncode != 4:
26+ return True
27+ return False
28+
29+
30 def systemctl_daemon_reload():
31 '''Reload systemd unit files from disk and re-calculate its dependencies'''
32 subprocess.check_call(['systemctl', 'daemon-reload'])
33diff --git a/tests/test_utils.py b/tests/test_utils.py
34index b2a1657..eefd334 100644
35--- a/tests/test_utils.py
36+++ b/tests/test_utils.py
37@@ -354,6 +354,26 @@ class TestUtils(unittest.TestCase):
38 ['systemctl', 'is-enabled', 'some.service']
39 ])
40
41+ def test_systemctl_is_installed(self):
42+ self.mock_cmd = MockCmd('systemctl')
43+ self.mock_cmd.set_returncode(0)
44+ path_env = os.environ['PATH']
45+ os.environ['PATH'] = os.path.dirname(self.mock_cmd.path) + os.pathsep + path_env
46+ self.assertTrue(utils.systemctl_is_installed('some.service'))
47+ self.assertEqual(self.mock_cmd.calls(), [
48+ ['systemctl', 'is-enabled', 'some.service']
49+ ])
50+
51+ def test_systemctl_is_installed_false(self):
52+ self.mock_cmd = MockCmd('systemctl')
53+ self.mock_cmd.set_returncode(4)
54+ path_env = os.environ['PATH']
55+ os.environ['PATH'] = os.path.dirname(self.mock_cmd.path) + os.pathsep + path_env
56+ self.assertFalse(utils.systemctl_is_installed('some.service'))
57+ self.assertEqual(self.mock_cmd.calls(), [
58+ ['systemctl', 'is-enabled', 'some.service']
59+ ])
60+
61 def test_systemctl_daemon_reload(self):
62 self.mock_cmd = MockCmd('systemctl')
63 path_env = os.environ['PATH']
diff --git a/debian/patches/lp2041727/0005-Update-ovs.py-to-check-if-ovsdb-server.service-is-in.patch b/debian/patches/lp2041727/0005-Update-ovs.py-to-check-if-ovsdb-server.service-is-in.patch
0new file mode 10064464new file mode 100644
index 0000000..472c6bc
--- /dev/null
+++ b/debian/patches/lp2041727/0005-Update-ovs.py-to-check-if-ovsdb-server.service-is-in.patch
@@ -0,0 +1,75 @@
1From: Tom <96974474+viciousdrop@users.noreply.github.com>
2Date: Mon, 6 Nov 2023 20:38:14 +0800
3Subject: Update ovs.py to check if ovsdb-server.service is installed before
4 throwing an error
5
6Adopted changes outlined in this bug
7Credit: https://github.com/brianfinley
8https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2041727
9"WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running."
10
11Co-Authored-by: Lukas Märdian <slyon@ubuntu.com>
12
13This patch also includes a trivial change from
14https://github.com/canonical/netplan/commit/95e4d51435c2e9c9a6b7382e39c0306200ee1b9b
15
16Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/2041727
17Origin: https://github.com/canonical/netplan/pull/421
18---
19 netplan_cli/cli/commands/apply.py | 4 +++-
20 netplan_cli/cli/ovs.py | 9 ++++++++-
21 2 files changed, 11 insertions(+), 2 deletions(-)
22
23diff --git a/netplan_cli/cli/commands/apply.py b/netplan_cli/cli/commands/apply.py
24index 066f496..9c88a3c 100644
25--- a/netplan_cli/cli/commands/apply.py
26+++ b/netplan_cli/cli/commands/apply.py
27@@ -31,7 +31,7 @@ import time
28 from .. import utils
29 from ...configmanager import ConfigManager, ConfigurationError
30 from ..sriov import apply_sriov_config
31-from ..ovs import OvsDbServerNotRunning, apply_ovs_cleanup
32+from ..ovs import OvsDbServerNotRunning, OvsDbServerNotInstalled, apply_ovs_cleanup
33
34
35 OVS_CLEANUP_SERVICE = 'netplan-ovs-cleanup.service'
36@@ -433,3 +433,5 @@ class NetplanApply(utils.NetplanCommand):
37 sys.exit(1)
38 except OvsDbServerNotRunning as e:
39 logging.warning('Cannot call Open vSwitch: {}.'.format(e))
40+ except OvsDbServerNotInstalled as e:
41+ logging.debug('Cannot call Open vSwitch: %s.', e)
42diff --git a/netplan_cli/cli/ovs.py b/netplan_cli/cli/ovs.py
43index 0ba0482..0caab72 100644
44--- a/netplan_cli/cli/ovs.py
45+++ b/netplan_cli/cli/ovs.py
46@@ -20,7 +20,7 @@ import os
47 import subprocess
48 import re
49
50-from .utils import systemctl_is_active
51+from .utils import systemctl_is_active, systemctl_is_installed
52
53 OPENVSWITCH_OVS_VSCTL = '/usr/bin/ovs-vsctl'
54 OPENVSWITCH_OVSDB_SERVER_UNIT = 'ovsdb-server.service'
55@@ -43,6 +43,10 @@ class OvsDbServerNotRunning(Exception):
56 pass
57
58
59+class OvsDbServerNotInstalled(Exception):
60+ pass
61+
62+
63 def _del_col(type, iface, column, value):
64 """Cleanup values from a column (i.e. "column=value")"""
65 default = DEFAULTS.get(column)
66@@ -125,6 +129,9 @@ def apply_ovs_cleanup(config_manager, ovs_old, ovs_current): # pragma: nocover
67 Also filter for individual settings tagged netplan/<column>[/<key]=value
68 in external-ids and clear them if they have been set by netplan.
69 """
70+ if not systemctl_is_installed(OPENVSWITCH_OVSDB_SERVER_UNIT):
71+ raise OvsDbServerNotInstalled("Cannot apply OVS cleanup: %s is 'not-found'" %
72+ OPENVSWITCH_OVSDB_SERVER_UNIT)
73 if not systemctl_is_active(OPENVSWITCH_OVSDB_SERVER_UNIT):
74 raise OvsDbServerNotRunning('{} is not running'.format(OPENVSWITCH_OVSDB_SERVER_UNIT))
75
diff --git a/debian/patches/series b/debian/patches/series
index 4d9d078..8021670 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,11 +1,6 @@
10001-parse-allow-COMMON_LINK_HANDLERS-for-VRFs-LP-2031421.patch10001-parse-nm-wg-append-the-correct-prefix-to-IPv6-addres.patch
20002-test-ovs-Avoid-NetworkManager-taking-contol-breaking.patch2lp2041727/0004-cli-utils-introduce-systemctl_is_installed-helper.patch
30003-util-don-t-return-a-placeholder-netdef-in-the-iterat.patch3lp2041727/0005-Update-ovs.py-to-check-if-ovsdb-server.service-is-in.patch
4lp2034067/0004-tunnels-validation-do-not-error-out-if-local-is-not-.patch40007-tests-assert-generated-.service-files-in-assert_srio.patch
5lp2034067/0005-tests-add-some-integration-tests-without-the-local-a.patch50008-tests-sriov-test-if-the-generated-netplan-rebind-ser.patch
6lp2034595/0006-apply-bring-lo-back-up-if-it-s-managed-by-NM.patch60009-sriov-don-t-generate-duplicate-entries-in-the-rebind.patch
7lp2034595/0007-apply-don-t-assume-the-NM-loopback-connection-is-cal.patch
8lp2039821/0008-wireguard-ignore-empty-endpoints.patch
9lp2039825/0009-auth-add-support-for-LEAP-and-EAP-PWD.patch
10lp1809994/0010-parse-improve-the-parsing-of-access-points-LP-180999.patch
11lp1809994/0011-wifi-replace-the-previously-defined-AP-with-the-new-.patch
diff --git a/debian/rules b/debian/rules
index 6f54c41..2780683 100755
--- a/debian/rules
+++ b/debian/rules
@@ -19,7 +19,3 @@ execute_after_dh_auto_install:
19 rm -rf debian/tmp/usr/lib/python3/dist-packages/netplan/__pycache__/19 rm -rf debian/tmp/usr/lib/python3/dist-packages/netplan/__pycache__/
20 # Drop legacy symlink20 # Drop legacy symlink
21 rm debian/tmp/lib/netplan/generate21 rm debian/tmp/lib/netplan/generate
22 # Fix non-usrmerged paths & drop legacy symlink
23 # rm -rf debian/tmp/lib
24 # mkdir -p debian/tmp/usr/lib/systemd/system-generators
25 # ln -s /usr/libexec/netplan/generate debian/tmp/usr/lib/systemd/system-generators/netplan
diff --git a/debian/tests/prep-testbed.sh b/debian/tests/prep-testbed.sh
index 6729083..0866460 100755
--- a/debian/tests/prep-testbed.sh
+++ b/debian/tests/prep-testbed.sh
@@ -5,6 +5,9 @@ if [ "$(systemctl is-active NetworkManager.service)" = active ]; then
5 systemctl stop NetworkManager.service5 systemctl stop NetworkManager.service
6fi6fi
77
8# Make sure the system is ready before starting our tests
9systemctl daemon-reload
10
8# only relevant on Debian11# only relevant on Debian
9dpkg-vendor --is Debian || exit 012dpkg-vendor --is Debian || exit 0
1013
diff --git a/doc/apidoc/inc-netplan.md b/doc/apidoc/inc-netplan.md
11new file mode 10064414new file mode 100644
index 0000000..cdee9bf
--- /dev/null
+++ b/doc/apidoc/inc-netplan.md
@@ -0,0 +1,4 @@
1# netplan.h
2
3```{autodoxygenfile} include/netplan.h
4```
diff --git a/doc/apidoc/inc-parse-nm.md b/doc/apidoc/inc-parse-nm.md
0new file mode 1006445new file mode 100644
index 0000000..3129f1d
--- /dev/null
+++ b/doc/apidoc/inc-parse-nm.md
@@ -0,0 +1,4 @@
1# parse-nm.h
2
3```{autodoxygenfile} include/parse-nm.h
4```
diff --git a/doc/apidoc/inc-parse.md b/doc/apidoc/inc-parse.md
0new file mode 1006445new file mode 100644
index 0000000..733585a
--- /dev/null
+++ b/doc/apidoc/inc-parse.md
@@ -0,0 +1,4 @@
1# parse.h
2
3```{autodoxygenfile} include/parse.h
4```
diff --git a/doc/apidoc/inc-types.md b/doc/apidoc/inc-types.md
0new file mode 1006445new file mode 100644
index 0000000..767296e
--- /dev/null
+++ b/doc/apidoc/inc-types.md
@@ -0,0 +1,4 @@
1# types.h
2
3```{autodoxygenfile} include/types.h
4```
diff --git a/doc/apidoc/inc-util.md b/doc/apidoc/inc-util.md
0new file mode 1006445new file mode 100644
index 0000000..7fc3c0c
--- /dev/null
+++ b/doc/apidoc/inc-util.md
@@ -0,0 +1,4 @@
1# util.h
2
3```{autodoxygenfile} include/util.h
4```
diff --git a/doc/apidoc/index.md b/doc/apidoc/index.md
0new file mode 1006445new file mode 100644
index 0000000..927ef3d
--- /dev/null
+++ b/doc/apidoc/index.md
@@ -0,0 +1,52 @@
1# Reference: libnetplan API
2
3## Public headers
4```{toctree}
5---
6maxdepth: 1
7---
8inc-netplan
9```
10> ```{autodoxygenfile} include/netplan.h
11> :sections: briefdescription
12> ```
13
14```{toctree}
15---
16maxdepth: 1
17---
18inc-parse-nm
19```
20> ```{autodoxygenfile} include/parse-nm.h
21> :sections: briefdescription
22> ```
23
24```{toctree}
25---
26maxdepth: 1
27---
28inc-parse
29```
30> ```{autodoxygenfile} include/parse.h
31> :sections: briefdescription
32> ```
33
34```{toctree}
35---
36maxdepth: 1
37---
38inc-types
39```
40> ```{autodoxygenfile} include/types.h
41> :sections: briefdescription
42> ```
43
44```{toctree}
45---
46maxdepth: 1
47---
48inc-util
49```
50> ```{autodoxygenfile} include/util.h
51> :sections: briefdescription
52> ```
0\ No newline at end of file53\ No newline at end of file
diff --git a/doc/conf.py b/doc/conf.py
index 8e5aef7..061173e 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -27,10 +27,32 @@ author = 'Netplan team'
27# Add any Sphinx extension module names here, as strings. They can be27# Add any Sphinx extension module names here, as strings. They can be
28# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom28# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
29# ones.29# ones.
30extensions = ['sphinx_design', 'myst_parser', 'sphinx_copybutton']30extensions = ['sphinx_design', 'myst_parser', 'sphinx_copybutton', 'sphinxcontrib.spelling', 'breathe']
31myst_enable_extensions = ["colon_fence"]31myst_enable_extensions = ["colon_fence"]
32smartquotes_action = 'qe'32smartquotes_action = 'qe'
3333
34# Doxygen
35# https://breathe.readthedocs.io/en/latest/directives.html
36# breathe_projects = {"Netplan": "../doxyxml/"}
37breathe_projects_source = {"auto-apidoc": ("../", [
38 "include/netplan.h",
39 "include/parse-nm.h",
40 "include/parse.h",
41 "include/types.h",
42 "include/util.h",
43 "src/error.c",
44 "src/names.c",
45 "src/netplan.c",
46 "src/parse-nm.c",
47 "src/parse.c",
48 "src/types.c",
49 "src/util.c",
50 "src/validation.c",
51 ])}
52# breathe_doxygen_config_options =
53# breathe_doxygen_aliases =
54breathe_default_project = "auto-apidoc"
55
34# Add any paths that contain templates here, relative to this directory.56# Add any paths that contain templates here, relative to this directory.
35templates_path = ['_templates']57templates_path = ['_templates']
3658
@@ -57,3 +79,9 @@ html_logo = 'netplan.svg'
5779
58# -- Options for MyST --------------------------------------------------------80# -- Options for MyST --------------------------------------------------------
59myst_title_to_header = True81myst_title_to_header = True
82suppress_warnings = ['myst.xref_missing']
83
84# Spelling
85spelling_lang = 'en_US'
86tokenizer_lang = 'en_US'
87spelling_show_suggestions = True
diff --git a/doc/contribute-docs.md b/doc/contribute-docs.md
60new file mode 10064488new file mode 100644
index 0000000..fc7e459
--- /dev/null
+++ b/doc/contribute-docs.md
@@ -0,0 +1,26 @@
1# Contribute Documentation
2
3## Reporting an issue
4
5If you find any issue in Netplan's documentation please [file a bugreport](https://bugs.launchpad.net/netplan/+filebug?field.tags=documentation)
6about it in our bugtracker at Launchpad. Remember adding a `documentation` tag
7to it.
8
9## Modifying documentation online
10
11Each documentation page, rendered on the web contains an "Edit this page" at
12the top-right of every page, besides the documentation title. Clicking this
13button will lead you to the GitHub web-editor where you can easily propose
14changes to the corresponding page.
15
16Please remember to first check the [latest version](https://netplan.readthedocs.io/en/latest/)
17of our documentation and make your proposal based on that revision.
18
19## Creating a pull-request
20
21If you want to follow a git development workflow, you can also checkout the
22[Netplan repository](https://github.com/canonical/netplan) and contribute your
23changes as [pull-requests](https://github.com/canonical/netplan/pulls), putting
24the `documentation` label for better visibility.
25
26Please see the `doc/` and `examples/` directories for relevant files.
diff --git a/doc/howto.md b/doc/howto.md
index 5c46a86..dd8d00d 100644
--- a/doc/howto.md
+++ b/doc/howto.md
@@ -4,4 +4,5 @@
4examples4examples
5dbus-config5dbus-config
6netplan-everywhere6netplan-everywhere
7contribute-docs
7```8```
diff --git a/doc/netplan-everywhere.md b/doc/netplan-everywhere.md
index 1ae30ca..ae346fe 100644
--- a/doc/netplan-everywhere.md
+++ b/doc/netplan-everywhere.md
@@ -1,6 +1,6 @@
1# Desktop integration1# Desktop integration
22
3## NetworkManager YAML settings backend (Netplan everywhere)3## NetworkManager YAML settings backend
44
5NetworkManager is the tool used by Ubuntu Desktop systems to manage5NetworkManager is the tool used by Ubuntu Desktop systems to manage
6network devices such as Ethernet and Wifi adapters. While it is a great6network devices such as Ethernet and Wifi adapters. While it is a great
@@ -8,85 +8,79 @@ tool for the job and users can directly use it through the command line
8and the graphical interfaces to configure their devices, Ubuntu has its8and the graphical interfaces to configure their devices, Ubuntu has its
9own way of describing and storing network configuration via Netplan.9own way of describing and storing network configuration via Netplan.
1010
11On Ubuntu, NetworkManager uses (or will use, depending on when you are11On Ubuntu 23.10 "Mantic Minotaur" and later, NetworkManager uses Netplan APIs
12reading this) Netplan's APIs to save the configuration created by the12to save the configuration created using any of its graphical or programmatic
13user using any of its interfaces. Our goal is to have a centralized place13interfaces. This leads to having a centralized location to store network
14to store network configuration. In the Desktop it's convenient to use14configuration. On the Desktop, it's convenient to use graphical tools for
15graphical tools for configuration when they are available, so nothing will15configuration when they are available, so nothing changes from the user
16change from the user perspective, only the way the configuration is16perspective; only the way the system handles the configuration in the background.
17handled under the hood.
1817
19For more information on Netplan, check https://netplan.io/18For more information on Netplan, see [https://netplan.io](https://netplan.io).
2019
21For more information on NetworkManager, check https://networkmanager.dev/20For more information on NetworkManager, see [https://networkmanager.dev](https://networkmanager.dev).
2221
23## How it works22## How it works
2423
25Every time a non-temporary connection is created in NetworkManager, instead24Every time a non-temporary connection is created in NetworkManager, instead
26of persisting the original .nmconnection file, it will create a Netplan YAML25of persisting the original `.nmconnection` file, it creates a Netplan YAML
27at `/etc/netplan` called `90-NM-<connection UUID>.yaml`. After creating the26file in `/etc/netplan/` called `90-NM-<connection UUID>.yaml`. After creating
28file, NetworkManager will call the Netplan generator to emit the configuration27the file, NetworkManager calls the Netplan generator to provide the
29for that connection. Connections that are temporary, like the ones created28configuration for that connection. Connections that are temporary, like the ones
30for virtual network interfaces when you connect to a VPN for example, are not29created for virtual network interfaces when you connect to a VPN for example,
31persisted as Netplan files. The reason for that is that these interfaces are30are not persisted as Netplan files. The reason for that is that these interfaces
32usually managed by external services and we don't want to cause any unexpected31are usually managed by external services and we don't want to cause any
33change that would affect them.32unexpected change that would affect them.
3433
35## How to install it34## How to use
3635
37### Creating a backup of your current configuration36### Installing NetworkManager
38
39The new NetworkManager will remove connection profiles that you eventually
40modify from `/etc/NetworkManager`. So you might want to create a copy of all
41your connection profiles before installing the new network-manager package:
4237
38The NetworkManager 1.44.2 package containing the Netplan integration patch
39is available by default in Ubuntu 23.10 "Mantic Minotaur" and later as part of
40the official Ubuntu archive.
43```41```
44$ mkdir ~/NetworkManager.bak && cd ~/NetworkManager.bak/42$ sudo apt update
45$ sudo cp -r /etc/NetworkManager/system-connections .43$ sudo apt install network-manager
46```44```
4745
48In any case, a backup will be created automatically for you at46### User interface
49`/root/NetworkManager.bak` during package installation.
50
51And also keep a copy of all the original network-manager related packages in
52case you want to revert to the previous installation:
5347
54```48From this point on, Netplan is aware of all your network configuration and
55$ apt download gir1.2-nm-1.0 libnm0 network-manager network-manager-config-connectivity-ubuntu49you can query it using its CLI tools, such as `sudo netplan get` or `sudo
56```50netplan status`. All while keeping untouched the traditional way of modifying
51it using NetworkManager (graphical UI, GNOME Quick Settings, `nmcli`,
52`nmtui`, D-Bus APIs, ...).
5753
58### Installing NetworkManager54### Management of connection profiles
5955
60The NetworkManager 1.42.0 package containing the Netplan integration patch56The NetworkManager-Netplan integration imports connection profiles from
61is currently available as a PPA. In order to install it, you will need to57`/etc/NetworkManager/system-connections/` to Netplan during the installation
62have `netplan.io >= 0.106` installed in your system (it is available in Lunar).58process. It automatically creates a copy of all your connection profiles during
59the installation of the new network-manager package in
60`/root/NetworkManager.bak/system-connections/`. The same migration happens
61in the background whenever you add or modify any connection profile.
6362
63You can observe this migration on the `apt-get`` command line. Watch for
64logs like the following:
64```65```
65$ sudo add-apt-repository ppa:canonical-foundations/networkmanager-netplan66Setting up network-manager (1.44.2-1ubuntu1.2) ...
66$ sudo apt update67Migrating HomeNet (9d087126-ae71-4992-9e0a-18c5ea92a4ed) to /etc/netplan
67$ sudo apt install network-manager68Migrating eduroam (37d643bb-d81d-4186-9402-7b47632c59b1) to /etc/netplan
69Migrating DebConf (f862be9c-fb06-4c0f-862f-c8e210ca4941) to /etc/netplan
68```70```
6971
70## How connections are managed from now on72For example, if you have a Wifi connection, you will not find the connection
7173profile file at `/etc/NetworkManager/system-connections/` anymore. Instead,
72After installing the new NetworkManager, your existing connection profiles74the system removes the profile file, and Netplan creates a new YAML file called
73will not be imported to Netplan YAML files, only new connections and the75`90-NM-<connection UUID>.yaml` in `/etc/netplan/` and generates a new ephemeral
74existing ones you eventually modify.76profile in `/run/NetworkManager/system-connections/`.
75
76For example, if you have a Wifi connection, you will find the connection
77profile file at `/etc/NetworkManager/system-connections`. If you modify it
78using one of the NetworkManager's interfaces (or delete and create a new one),
79the respective file will be removed from `/etc/NetworkManager/system-connections`,
80a Netplan YAML called `90-NM-<connection UUID>.yaml` will be created at
81`/etc/netplan` and a new profile will be generated and stored at
82`/run/NetworkManager/system-connections`.
8377
84## Limitation78## Limitation
8579
86Netplan doesn't yet support all the configuration available in80Netplan doesn't yet support all the configuration options available in
87NetworkManager (or doesn't know how to interpret some of the keywords81NetworkManager (or doesn't know how to interpret some of the keywords
88found in the keyfile). After creating a new connection you might find82found in the keyfile). After creating a new connection you might find
89a section called "passthrough" in your YAML file, like in the example below:83a section called `passthrough` in your YAML file, like in the example below:
9084
91```yaml85```yaml
92network:86network:
@@ -113,12 +107,12 @@ network:
113 proxy._: ""107 proxy._: ""
114```108```
115109
116All the configuration under the "passthrough" mapping will be added to110All the configuration under the `passthrough` mapping is added to
117the `.nmconnection` file as they are.111the `.nmconnection` file as they are.
118112
119In cases where the connection type is not supported by Netplan the113In cases where the connection type is not supported by Netplan, the system uses
120`nm-devices` network type will be used. The example below is an OpenVPN114the `nm-devices` network type. The example below is an OpenVPN client
121client connection, which is not supported by Netplan at the moment.115connection, which is not supported by Netplan at the moment.
122116
123```yaml117```yaml
124network:118network:
diff --git a/doc/netplan-yaml.md b/doc/netplan-yaml.md
index 11e7c41..23513c8 100644
--- a/doc/netplan-yaml.md
+++ b/doc/netplan-yaml.md
@@ -850,8 +850,9 @@ interfaces, as well as individual wifi networks, by means of the `auth` block.
850850
851 > The supported key management modes are `none` (no key management);851 > The supported key management modes are `none` (no key management);
852 > `psk` (WPA with pre-shared key, common for home wifi); `eap` (WPA852 > `psk` (WPA with pre-shared key, common for home wifi); `eap` (WPA
853 > with EAP, common for enterprise wifi); `sae` (used by WPA3); and `802.1x`853 > with EAP, common for enterprise wifi); `eap-sha256` (used with WPA3-Enterprise);
854 > (used primarily for wired Ethernet connections).854 > `eap-suite-b-192` (used with WPA3-Enterprise); `sae` (used by WPA3);
855 > and `802.1x` (used primarily for wired Ethernet connections).
855856
856 - **password** (scalar)857 - **password** (scalar)
857858
@@ -863,7 +864,8 @@ interfaces, as well as individual wifi networks, by means of the `auth` block.
863 - **method** (scalar)864 - **method** (scalar)
864865
865 > The EAP method to use. The supported EAP methods are `tls` (TLS),866 > The EAP method to use. The supported EAP methods are `tls` (TLS),
866 > `peap` (Protected EAP), and `ttls` (Tunneled TLS).867 > `peap` (Protected EAP), `leap` (Lightweight EAP), `pwd` (EAP Password)
868 > and `ttls` (Tunneled TLS).
867869
868 - **identity** (scalar)870 - **identity** (scalar)
869871
diff --git a/doc/reference.md b/doc/reference.md
index fe049d5..bf11582 100644
--- a/doc/reference.md
+++ b/doc/reference.md
@@ -20,8 +20,8 @@ maxdepth: 1
20netplan-yaml20netplan-yaml
21```21```
2222
23## API specification23## libnetplan API
24`libnetplan` is a component of the Netplan. project that contains the logic for24`libnetplan` is a component of the Netplan project that contains the logic for
25data parsing, validation and generation. It is build as a dynamic `.so` library25data parsing, validation and generation. It is build as a dynamic `.so` library
26that can be used from different binaries (like Netplan’s `generate`,26that can be used from different binaries (like Netplan’s `generate`,
27`netplan-dbus`, the `netplan apply/try/get/set/...` CLI or via the corresponding27`netplan-dbus`, the `netplan apply/try/get/set/...` CLI or via the corresponding
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches