]> git.proxmox.com Git - mirror_frr.git/blame - doc/developer/workflow.rst
doc: fix messed up topotests docs
[mirror_frr.git] / doc / developer / workflow.rst
CommitLineData
9de103f0
QY
1.. _process-and-workflow:
2
3*******************
b22ba015 4Process & Workflow
9de103f0 5*******************
d1890d04 6
b6820993
QY
7.. highlight:: none
8
b22ba015
QY
9FRR is a large project developed by many different groups. This section
10documents standards for code style & quality, commit messages, pull requests
11and best practices that all contributors are asked to follow.
d1890d04 12
9de103f0
QY
13This chapter is "descriptive/post-factual" in that it documents pratices that
14are in use; it is not "definitive/pre-factual" in prescribing practices. This
b22ba015
QY
15means that when a procedure changes, it is agreed upon, then put into practice,
16and then documented here. If this document doesn't match reality, it's the
17document that needs to be updated, not reality.
d1890d04 18
9de103f0
QY
19Mailing Lists
20=============
d1890d04 21
b22ba015
QY
22The FRR development group maintains multiple mailing lists for use by the
23community. Italicized lists are private.
d1890d04
QY
24
25+----------------------------------+--------------------------------+
26| Topic | List |
27+==================================+================================+
28| Development | dev@lists.frrouting.org |
29+----------------------------------+--------------------------------+
30| Users & Operators | frog@lists.frrouting.org |
31+----------------------------------+--------------------------------+
32| Announcements | announce@lists.frrouting.org |
33+----------------------------------+--------------------------------+
34| *Security* | security@lists.frrouting.org |
35+----------------------------------+--------------------------------+
36| *Technical Steering Committee* | tsc@lists.frrouting.org |
37+----------------------------------+--------------------------------+
38
9de103f0 39The Development list is used to discuss and document general issues related to
b6820993
QY
40project development and governance. The public
41`Slack instance <https://frrouting.slack.com>`_ and weekly technical meetings
42provide a higher bandwidth channel for discussions. The results of such
43discussions must be reflected in updates, as appropriate, to code (i.e.,
44merges), `GitHub issues`_, and for governance or process changes, updates to
45the Development list and either this file or information posted at
46https://frrouting.org/.
47
48Development & Release Cycle
49===========================
50
51Development
52-----------
53
54.. figure:: ../figures/git_branches.png
55 :align: center
56 :scale: 55%
57 :alt: Merging Git branches into a central trunk
58
59 Rough outline of FRR development workflow
60
61The master Git for FRR resides on `GitHub`_.
62
63There is one main branch for development, ``master``. For each major release
64(2.0, 3.0 etc) a new release branch is created based on the master. Significant
65bugfixes should be backported to upcoming and existing release branches no more
66than 1 year old. As a general rule new features are not backported to release
67branches.
8ce7861f 68
b6820993 69Subsequent point releases based on a major branch are handled with git tags.
c804874a 70
b6820993
QY
71Releases
72--------
73FRR employs a ``<MAJOR>.<MINOR>.<BUGFIX>`` versioning scheme.
c804874a 74
b6820993 75``MAJOR``
ac97970d
DL
76 Significant new features or multiple minor features. This should mostly
77 cover any kind of disruptive change that is visible or "risky" to operators.
78 New features or protocols do not necessarily trigger this. (This was changed
79 for FRR 7.x after feedback from users that the pace of major version number
80 increments was too high.)
c804874a 81
b6820993 82``MINOR``
ac97970d
DL
83 General incremental development releases, excluding "major" changes
84 mentioned above. Not necessarily fully backwards compatible, as smaller
85 (but still visible) changes or deprecated feature removals may still happen.
86 However, there shouldn't be any huge "surprises" between minor releases.
c804874a 87
b6820993 88``BUGFIX``
ac97970d 89 Fixes for actual bugs and/or security issues. Fully compatible.
c804874a
QY
90
91We will pull a new development branch for the next release every 4 months. The
b6820993
QY
92current schedule is Feb/June/October 1. The decision for a ``MAJOR/MINOR``
93release is made at the time of branch pull based on what has been received the
94previous 4 months. The branch name will be ``dev/MAJOR.MINOR``. At this point
95in time the master branch and this new branch, :file:`configure.ac`,
96documentation and packaging systems will be updated to reflect the next
97possible release name to allow for easy distinguishing.
98
99After one month the development branch will be renamed to
bd2b4fc3
PG
100``stable/MAJOR.MINOR``. The branch is a stable branch. This process is not
101held up unless a crash or security issue has been found and needs to
102be addressed. Issues being fixed will not cause a delay.
c804874a
QY
103
104Bugfix releases are made as needed at 1 month intervals until the next
bd2b4fc3 105``MAJOR.MINOR`` release branch is pulled. Depending on the severity of the bugs,
c804874a
QY
106bugfix releases may occur sooner.
107
07ff01d2
PG
108Bugfixes are applied to the two most recent releases. However, backporting of bug
109fixes to older than the two most recent releases will not be prevented, if acked
110under the classical development workflow applying for a pull request.
111
112Security fixes are backported to all releases less than or equal to at least one
113year old. Security fixes may also be backported to older releases depending on
114severity.
115
bd2b4fc3
PG
116
117Long term support branches ( LTS )
118-----------------------------------------
119
120This kind of branch is not yet officially supported, and need experimentation
121before being effective.
122
123Previous definition of releases prevents long term support of previous releases.
124For instance, bug and security fixes are not applied if the stable branch is too
125old.
126
127Because the FRR users have a need to backport bug and security fixes after the
128stable branch becomes too old, there is a need to provide support on a long term
129basis on that stable branch. If that support is applied on that stable branch,
130then that branch is a long term support branch.
131
132Having a LTS branch requires extra-work and requires one person to be in charge
133of that maintenance branch for a certain amount of time. The amount of time will
134be by default set to 4 months, and can be increased. 4 months stands for the time
135between two releases, this time can be applied to the decision to continue with a
136LTS release or not. In all cases, that time period will be well-defined and
137published. Also, a self nomination from a person that proposes to handle the LTS
138branch is required. The work can be shared by multiple people. In all cases, there
139must be at least one person that is in charge of the maintenance branch. The person
140on people responsible for a maintenance branch must be a FRR maintainer. Note that
141they may choose to abandon support for the maintenance branch at any time. If
56f0bea7 142no one takes over the responsibility of the LTS branch, then the support will be
bd2b4fc3
PG
143discontinued.
144
145The LTS branch duties are the following ones:
146
147- organise meetings on a (bi-)weekly or monthly basis, the handling of issues
148 and pull requested relative to that branch. When time permits, this may be done
149 during the regularly scheduled FRR meeting.
150
151- ensure the stability of the branch, by using and eventually adapting the
152 checking the CI tools of FRR ( indeed, maintaining may lead to create
153 maintenance branches for topotests or for CI).
154
155It will not be possible to backport feature requests to LTS branches. Actually, it
156is a false good idea to use LTS for that need. Introducing feature requests may
157break the paradigm where all more recent releases should also include the feature
158request. This would require the LTS maintainer to ensure that all more recent
159releases have support for this feature request. Moreover, introducing features
160requests may result in breaking the stability of the branch. LTS branches are first
161done to bring long term support for stability.
8ce7861f 162
d1890d04 163Changelog
b6820993 164---------
b22ba015
QY
165The changelog will be the base for the release notes. A changelog entry for
166your changes is usually not required and will be added based on your commit
167messages by the maintainers. However, you are free to include an update to the
168changelog with some better description.
d1890d04
QY
169
170Submitting Patches and Enhancements
9de103f0 171===================================
d1890d04 172
b22ba015
QY
173FRR accepts patches from two sources:
174
175- Email (git format-patch)
b6820993 176- GitHub pull request
b22ba015 177
b6820993
QY
178Contributors are highly encouraged to use GitHub's fork-and-PR workflow. It is
179easier for us to review it, test it, try it and discuss it on GitHub than it is
180via email, thus your patch will get more attention more quickly on GitHub.
b22ba015
QY
181
182The base branch for new contributions and non-critical bug fixes should be
183``master``. Please ensure your pull request is based on this branch when you
184submit it.
185
b6820993
QY
186GitHub Pull Requests
187--------------------
d1890d04 188
b6820993
QY
189The preferred method of submitting changes is a GitHub pull request. Code
190submitted by pull request will be automatically tested by one or more CI
191systems. Once the automated tests succeed, other developers will review your
192code for quality and correctness. After any concerns are resolved, your code
193will be merged into the branch it was submitted against.
d1890d04 194
01bf2ccb
LB
195The title of the pull request should provide a high level technical
196summary of the included patches. The description should provide
197additional details that will help the reviewer to understand the context
198of the included patches.
199
b6820993
QY
200Patch Submission via Mailing List
201---------------------------------
d1890d04 202
b6820993
QY
203As an alternative submission method, a patch can be mailed to the
204development mailing list. Patches received on the mailing list will be
205picked up by Patchwork and tested against the latest development branch.
d1890d04 206
b6820993
QY
207The recommended way to send the patch (or series of NN patches) to the
208list is by using ``git send-email`` as follows (assuming they are the N
209most recent commit(s) in your git history)::
d1890d04 210
b6820993 211 git send-email -NN --annotate --to=dev@lists.frrouting.org
d1890d04 212
b6820993
QY
213If your commits do not already contain a ``Signed-off-by`` line, then
214use the following command to add it (after making sure you agree to the
215Developer Certificate of Origin as outlined above)::
d1890d04 216
b6820993 217 git send-email -NN --annotate --signoff --to=dev@lists.frrouting.org
d1890d04 218
b6820993
QY
219Submitting multi-commit patches as a GitHub pull request is **strongly
220encouraged** and increases the probability of your patch getting reviewed and
221merged in a timely manner.
d1890d04 222
b6820993 223.. _license-for-contributions:
d1890d04 224
b6820993
QY
225License for Contributions
226-------------------------
227FRR is under a “GPLv2 or later” license. Any code submitted must be released
228under the same license (preferred) or any license which allows redistribution
229under this GPLv2 license (eg MIT License).
e2abcff8
PG
230It is forbidden to push any code that prevents from using GPLv3 license. This
231becomes a community rule, as FRR produces binaries that links with Apache 2.0
232libraries. Apache 2.0 and GPLv2 license are incompatible, if put together.
233Please see `<http://www.apache.org/licenses/GPL-compatibility.html>`_ for
234more information. This rule guarantees the user to distribute FRR binary code
235without any licensing issues.
b22ba015 236
b6820993
QY
237Pre-submission Checklist
238------------------------
239- Format code (see `Code Formatting <#code-formatting>`__)
240- Verify and acknowledge license (see :ref:`license-for-contributions`)
241- Ensure you have properly signed off (see :ref:`signing-off`)
242- Test building with various configurations:
d1890d04 243
b6820993 244 - ``buildtest.sh``
d1890d04 245
b6820993 246- Verify building source distribution:
d1890d04 247
b6820993 248 - ``make dist`` (and try rebuilding from the resulting tar file)
d1890d04 249
b6820993 250- Run unit tests:
d1890d04 251
b6820993 252 - ``make test``
d1890d04 253
b6820993
QY
254- In the case of a major new feature or other significant change, document
255 plans for continued maintenance of the feature
d1890d04 256
b6820993 257.. _signing-off:
d1890d04 258
b6820993
QY
259Signing Off
260-----------
261Code submitted to FRR must be signed off. We have the same requirements for
262using the signed-off-by process as the Linux kernel. In short, you must include
263a ``Signed-off-by`` tag in every patch.
d1890d04 264
b6820993
QY
265``Signed-off-by`` is a developer's certification that they have the right to
266submit the patch for inclusion into the project. It is an agreement to the
267:ref:`Developer's Certificate of Origin <developers-certificate-of-origin>`.
268Code without a proper ``Signed-off-by`` line cannot and will not be merged.
d1890d04 269
b6820993
QY
270If you are unfamiliar with this process, you should read the
271`official policy at kernel.org <https://www.kernel.org/doc/html/latest/process/submitting-patches.html>`_.
272You might also find
273`this article <http://www.linuxfoundation.org/content/how-participate-linux-community-0>`_
274about participating in the Linux community on the Linux Foundation website to
275be a helpful resource.
d1890d04 276
b6820993 277.. _developers-certificate-of-origin:
d1890d04 278
b6820993
QY
279In short, when you sign off on a commit, you assert your agreement to all of
280the following::
d1890d04 281
b6820993 282 Developer's Certificate of Origin 1.1
d1890d04 283
b6820993 284 By making a contribution to this project, I certify that:
d1890d04 285
b6820993
QY
286 (a) The contribution was created in whole or in part by me and I
287 have the right to submit it under the open source license
288 indicated in the file; or
d1890d04 289
b6820993
QY
290 (b) The contribution is based upon previous work that, to the best
291 of my knowledge, is covered under an appropriate open source
292 license and I have the right under that license to submit that
293 work with modifications, whether created in whole or in part by
294 me, under the same open source license (unless I am permitted to
295 submit under a different license), as indicated in the file; or
d1890d04 296
b6820993
QY
297 (c) The contribution was provided directly to me by some other
298 person who certified (a), (b) or (c) and I have not modified it.
d1890d04 299
b6820993
QY
300 (d) I understand and agree that this project and the contribution
301 are public and that a record of the contribution (including all
302 personal information I submit with it, including my sign-off) is
303 maintained indefinitely and may be redistributed consistent with
304 this project or the open source license(s) involved.
d1890d04 305
b6820993 306After Submitting Your Changes
d1890d04
QY
307-----------------------------
308
b6820993 309- Watch for Continuous Integration (CI) test results
d1890d04
QY
310
311 - You should automatically receive an email with the test results
312 within less than 2 hrs of the submission. If you don’t get the
b6820993 313 email, then check status on the GitHub pull request.
d1890d04 314 - Please notify the development mailing list if you think something
b22ba015 315 doesn't work.
d1890d04
QY
316
317- If the tests failed:
318
319 - In general, expect the community to ignore the submission until
320 the tests pass.
321 - It is up to you to fix and resubmit.
322
323 - This includes fixing existing unit (“make test”) tests if your
324 changes broke or changed them.
325 - It also includes fixing distribution packages for the failing
326 platforms (ie if new libraries are required).
327 - Feel free to ask for help on the development list.
328
329 - Go back to the submission process and repeat until the tests pass.
330
331- If the tests pass:
332
333 - Wait for reviewers. Someone will review your code or be assigned
334 to review your code.
493e3eed
LB
335 - Respond to any comments or concerns the reviewer has. Use e-mail or
336 add a comment via github to respond or to let the reviewer know how
337 their comment or concern is addressed.
338 - An author must never delete or manually dismiss someone else's comments
339 or review. (A review may be overridden by agreement in the weekly
340 technical meeting.)
341 - Automatically generated comments, e.g., those generated by CI systems,
342 may be deleted by authors and others when such comments are not the most
22265b35 343 recent results from that automated comment source.
d1890d04
QY
344 - After all comments and concerns are addressed, expect your patch
345 to be merged.
346
347- Watch out for questions on the mailing list. At this time there will
348 be a manual code review and further (longer) tests by various
349 community members.
350- Your submission is done once it is merged to the master branch.
351
9de103f0
QY
352Programming Languages, Tools and Libraries
353==========================================
354
355The core of FRR is written in C (gcc or clang supported) and makes
356use of GNU compiler extensions. A few non-essential scripts are
357implemented in Perl and Python. FRR requires the following tools
358to build distribution packages: automake, autoconf, texinfo, libtool and
359gawk and various libraries (i.e. libpam and libjson-c).
360
361If your contribution requires a new library or other tool, then please
362highlight this in your description of the change. Also make sure it’s
363supported by all FRR platform OSes or provide a way to build
364without the library (potentially without the new feature) on the other
365platforms.
366
367Documentation should be written in reStructuredText. Sphinx extensions may be
368utilized but pure ReST is preferred where possible. See
369:ref:`documentation`.
370
ca9dfee0
DL
371Use of C++
372----------
373
374While C++ is not accepted for core components of FRR, extensions, modules or
375other distinct components may want to use C++ and include FRR header files.
376There is no requirement on contributors to work to retain C++ compatibility,
377but fixes for C++ compatibility are welcome.
378
379This implies that the burden of work to keep C++ compatibility is placed with
380the people who need it, and they may provide it at their leisure to the extent
381it is useful to them. So, if only a subset of header files, or even parts of
382a header file are made available to C++, this is perfectly fine.
383
590a7368
QY
384Code Reviews
385============
386
387Code quality is paramount for any large program. Consequently we require
388reviews of all submitted patches by at least one person other than the
389submitter before the patch is merged.
390
391Because of the nature of the software, FRR's maintainer list (i.e. those with
392commit permissions) tends to contain employees / members of various
393organizations. In order to prevent conflicts of interest, we use an honor
394system in which submissions from an individual representing one company should
395be merged by someone unaffiliated with that company.
396
397Guidelines for code review
924947e4 398--------------------------
590a7368
QY
399
400- As a rule of thumb, the depth of the review should be proportional to the
401 scope and / or impact of the patch.
402
403- Anyone may review a patch.
404
405- When using GitHub reviews, marking "Approve" on a code review indicates
406 willingness to merge the PR.
407
408- For individuals with merge rights, marking "Changes requested" is equivalent
409 to a NAK.
410
411- For a PR you marked with "Changes requested", please respond to updates in a
412 timely manner to avoid impeding the flow of development.
413
7e678379
LB
414- Rejected or obsolete PRs are generally closed by the submitter based
415 on requests and/or agreement captured in a PR comment. The comment
416 may originate with a reviewer or document agreement reached on Slack,
417 the Development mailing list, or the weekly technical meeting.
418
590a7368 419
b22ba015 420Coding Practices & Style
9de103f0 421========================
d1890d04
QY
422
423Commit messages
9de103f0 424---------------
d1890d04
QY
425
426Commit messages should be formatted in the same way as Linux kernel
b6820993 427commit messages. The format is roughly::
d1890d04
QY
428
429 dir: short summary
430
431 extended summary
432
b6820993
QY
433``dir`` should be the top level source directory under which the change was
434made. For example, a change in :file:`bgpd/rfapi` would be formatted as::
d1890d04 435
9de103f0 436 bgpd: short summary
d1890d04 437
b6820993
QY
438 ...
439
440The first line should be no longer than 50 characters. Subsequent lines should
441be wrapped to 72 characters.
d1890d04 442
b6820993
QY
443You must also sign off on your commit.
444
445.. seealso:: :ref:`signing-off`
446
447Source File Header
9de103f0 448------------------
d1890d04 449
b6820993
QY
450New files must have a copyright header (see :ref:`license-for-contributions`
451above) added to the file. The header should be:
d1890d04 452
b6820993 453.. code-block:: c
d1890d04
QY
454
455 /*
456 * Title/Function of file
457 * Copyright (C) YEAR Author’s Name
458 *
459 * This program is free software; you can redistribute it and/or modify it
460 * under the terms of the GNU General Public License as published by the Free
461 * Software Foundation; either version 2 of the License, or (at your option)
462 * any later version.
463 *
464 * This program is distributed in the hope that it will be useful, but WITHOUT
465 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
466 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
467 * more details.
468 *
469 * You should have received a copy of the GNU General Public License along
470 * with this program; see the file COPYING; if not, write to the Free Software
471 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
472 */
473
474 #include <zebra.h>
475
b6820993
QY
476Please copy-paste this header verbatim. In particular:
477
478- Do not replace "This program" with "FRR"
479- Do not change the address of the FSF
480
481Adding Copyright Claims to Existing Files
9de103f0 482-----------------------------------------
d1890d04 483
b6820993
QY
484When adding copyright claims for modifications to an existing file, please
485add a ``Portions:`` section as shown below. If this section already exists, add
486your new claim at the end of the list.
d1890d04 487
b6820993 488.. code-block:: c
d1890d04 489
b6820993
QY
490 /*
491 * Title/Function of file
492 * Copyright (C) YEAR Author’s Name
493 * Portions:
494 * Copyright (C) 2010 Entity A ....
495 * Copyright (C) 2016 Your name [optional brief change description]
496 * ...
497 */
d1890d04 498
c964e511 499Code Formatting
9de103f0 500---------------
d1890d04 501
6f7a9254
QY
502C Code
503^^^^^^
504
505For C code, FRR uses Linux kernel style except where noted below. Code which
506does not comply with these style guidelines will not be accepted.
d1890d04 507
281ba953
QY
508The project provides multiple tools to allow you to correctly style your code
509as painlessly as possible, primarily built around ``clang-format``.
510
511clang-format
512 In the project root there is a :file:`.clang-format` configuration file
513 which can be used with the ``clang-format`` source formatter tool from the
514 LLVM project. Most of the time, this is the easiest and smartest tool to
515 use. It can be run in a variety of ways. If you point it at a C source file
516 or directory of source files, it will format all of them. In the LLVM source
517 tree there are scripts that allow you to integrate it with ``git``, ``vim``
518 and ``emacs``, and there are third-party plugins for other editors. The
519 ``git`` integration is particularly useful; suppose you have some changes in
520 your git index. Then, with the integration installed, you can do the
521 following:
522
523 ::
524
525 git clang-format
526
527 This will format *only* the changes present in your index. If you have just
528 made a few commits and would like to correctly style only the changes made
529 in those commits, you can use the following syntax:
530
531 ::
532
533 git clang-format HEAD~X
534
535 Where X is one more than the number of commits back from the tip of your
536 branch you would like ``clang-format`` to look at (similar to specifying the
537 target for a rebase).
538
539 The ``vim`` plugin is particularly useful. It allows you to select lines in
540 visual line mode and press a key binding to invoke ``clang-format`` on only
541 those lines.
542
543 When using ``clang-format``, it is recommended to use the latest version.
544 Each consecutive version generally has better handling of various edge
545 cases. You may notice on occasion that two consecutive runs of
546 ``clang-format`` over the same code may result in changes being made on the
547 second run. This is an unfortunate artifact of the tool. Please check with
548 the kernel style guide if in doubt.
549
550 One stylistic problem with the FRR codebase is the use of ``DEFUN`` macros
551 for defining CLI commands. ``clang-format`` will happily format these macro
552 invocations, but the result is often unsightly and difficult to read.
553 Consequently, FRR takes a more relaxed position with how these are
554 formatted. In general you should lean towards using the style exemplified in
555 the section on :ref:`command-line-interface`. Because ``clang-format``
556 mangles this style, there is a Python script named ``tools/indent.py`` that
557 wraps ``clang-format`` and handles ``DEFUN`` macros as well as some other
558 edge cases specific to FRR. If you are submitting a new file, it is
559 recommended to run that script over the new file, preferably after ensuring
560 that the latest stable release of ``clang-format`` is in your ``PATH``.
561
562 Documentation on ``clang-format`` and its various integrations is maintained
563 on the LLVM website.
564
565 https://clang.llvm.org/docs/ClangFormat.html
566
567checkpatch.sh
568 In the Linux kernel source tree there is a Perl script used to check
569 incoming patches for style errors. FRR uses an adapted version of this
570 script for the same purpose. It can be found at
2780ae0c 571 :file:`tools/checkpatch.sh`. This script takes a git-formatted diff or
281ba953
QY
572 patch file, applies it to a clean FRR tree, and inspects the result to catch
573 potential style errors. Running this script on your patches before
574 submission is highly recommended. The CI system runs this script as well and
575 will comment on the PR with the results if style errors are found.
576
b6820993 577 It is run like this::
281ba953 578
b6820993 579 ./checkpatch.sh <patch> <tree>
281ba953
QY
580
581 Reports are generated on ``stderr`` and the exit code indicates whether
582 issues were found (2, 1) or not (0).
583
584 Where ``<patch>`` is the path to the diff or patch file and ``<tree>`` is
585 the path to your FRR source tree. The tree should be on the branch that you
586 intend to submit the patch against. The script will make a best-effort
587 attempt to save the state of your working tree and index before applying the
588 patch, and to restore it when it is done, but it is still recommended that
589 you have a clean working tree as the script does perform a hard reset on
590 your tree during its run.
591
592 The script reports two classes of issues, namely WARNINGs and ERRORs. Please
593 pay attention to both of them. The script will generally report WARNINGs
594 where it cannot be 100% sure that a particular issue is real. In most cases
595 WARNINGs indicate an issue that needs to be fixed. Sometimes the script will
596 report false positives; these will be handled in code review on a
597 case-by-case basis. Since the script only looks at changed lines,
598 occasionally changing one part of a line can cause the script to report a
599 style issue already present on that line that is unrelated to the change.
600 When convenient it is preferred that these be cleaned up inline, but this is
601 not required.
602
115e70a1
PZ
603 In general, a developer should heed the information reported by checkpatch.
604 However, some flexibility is needed for cases where human judgement yields
605 better clarity than the script. Accordingly, it may be appropriate to
606 ignore some checkpatch.sh warnings per discussion among the submitter(s)
607 and reviewer(s) of a change. Misreporting of errors by the script is
d3c2e316
QY
608 possible. When this occurs, the exception should be handled either by
609 patching checkpatch to correct the false error report, or by documenting the
610 exception in this document under :ref:`style-exceptions`. If the incorrect
611 report is likely to appear again, a checkpatch update is preferred.
115e70a1 612
281ba953
QY
613 If the script finds one or more WARNINGs it will exit with 1. If it finds
614 one or more ERRORs it will exit with 2.
615
616
617Please remember that while FRR provides these tools for your convenience,
618responsibility for properly formatting your code ultimately lies on the
619shoulders of the submitter. As such, it is recommended to double-check the
620results of these tools to avoid delays in merging your submission.
d1890d04 621
115e70a1
PZ
622In some cases, these tools modify or flag the format in ways that go beyond or
623even conflict [#tool_style_conflicts]_ with the canonical documented Linux
624kernel style. In these cases, the Linux kernel style takes priority;
625non-canonical issues flagged by the tools are not compulsory but rather are
626opportunities for discussion among the submitter(s) and reviewer(s) of a change.
627
d1890d04
QY
628**Whitespace changes in untouched parts of the code are not acceptable
629in patches that change actual code.** To change/fix formatting issues,
630please create a separate patch that only does formatting changes and
631nothing else.
632
d1890d04
QY
633Kernel and BSD styles are documented externally:
634
635- https://www.kernel.org/doc/html/latest/process/coding-style.html
636- http://man.openbsd.org/style
637
638For GNU coding style, use ``indent`` with the following invocation:
639
640::
641
642 indent -nut -nfc1 file_for_submission.c
643
28ac5a03
QY
644
645Historically, FRR used fixed-width integral types that do not exist in any
646standard but were defined by most platforms at some point. Officially these
647types are not guaranteed to exist. Therefore, please use the fixed-width
648integral types introduced in the C99 standard when contributing new code to
649FRR. If you need to convert a large amount of code to use the correct types,
650there is a shell script in :file:`tools/convert-fixedwidth.sh` that will do the
651necessary replacements.
652
653+-----------+--------------------------+
654| Incorrect | Correct |
655+===========+==========================+
656| u_int8_t | uint8_t |
657+-----------+--------------------------+
658| u_int16_t | uint16_t |
659+-----------+--------------------------+
660| u_int32_t | uint32_t |
661+-----------+--------------------------+
662| u_int64_t | uint64_t |
663+-----------+--------------------------+
664| u_char | uint8_t or unsigned char |
665+-----------+--------------------------+
666| u_short | unsigned short |
667+-----------+--------------------------+
668| u_int | unsigned int |
669+-----------+--------------------------+
670| u_long | unsigned long |
671+-----------+--------------------------+
672
d3c2e316
QY
673.. _style-exceptions:
674
d1890d04
QY
675Exceptions
676^^^^^^^^^^
677
678FRR project code comes from a variety of sources, so there are some
679stylistic exceptions in place. They are organized here by branch.
680
9de103f0
QY
681For ``master``
682""""""""""""""
d1890d04
QY
683
684BSD coding style applies to:
685
686- ``ldpd/``
687
688``babeld`` uses, approximately, the following style:
689
690- K&R style braces
691- Indents are 4 spaces
692- Function return types are on their own line
693
9de103f0
QY
694For ``stable/3.0`` and ``stable/2.0``
695"""""""""""""""""""""""""""""""""""""
d1890d04
QY
696
697GNU coding style apply to the following parts:
698
699- ``lib/``
700- ``zebra/``
701- ``bgpd/``
702- ``ospfd/``
703- ``ospf6d/``
704- ``isisd/``
705- ``ripd/``
706- ``ripngd/``
707- ``vtysh/``
708
709BSD coding style applies to:
710
711- ``ldpd/``
712
6f7a9254
QY
713YANG
714^^^^
715
716FRR uses YANG to define data models for its northbound interface. YANG models
717should follow conventions used by the IETF standard models. From a practical
718standpoint, this corresponds to the output produced by the ``yanglint`` tool
719included in the ``libyang`` project, which is used by FRR to parse and validate
720YANG models. You should run the following command on all YANG documents you
721write:
722
723.. code-block:: console
724
725 yanglint -f yang <model>
726
727The output of this command should be identical to the input file. The sole
728exception to this is comments. ``yanglint`` does not support comments and will
729strip them from its output. You may include comments in your YANG documents,
730but they should be indented appropriately (use spaces). Where possible,
731comments should be eschewed in favor of a suitable ``description`` statement.
732
733In short, a diff between your input file and the output of ``yanglint`` should
734either be empty or contain only comments.
d3c2e316
QY
735
736Specific Exceptions
737^^^^^^^^^^^^^^^^^^^
738
739Most of the time checkpatch errors should be corrected. Occasionally as a group
740maintainers will decide to ignore certain stylistic issues. Usually this is
741because correcting the issue is not possible without large unrelated code
742changes. When an exception is made, if it is unlikely to show up again and
743doesn't warrant an update to checkpatch, it is documented here.
744
745+------------------------------------------+---------------------------------------------------------------+
746| Issue | Ignore Reason |
747+==========================================+===============================================================+
748| DEFPY_HIDDEN, DEFPY_ATTR: complex macros | DEF* macros cannot be wrapped in parentheses without updating |
749| should be wrapped in parentheses | all usages of the macro, which would be highly disruptive. |
750+------------------------------------------+---------------------------------------------------------------+
751
d1890d04 752Compile-time conditional code
9de103f0 753-----------------------------
d1890d04
QY
754
755Many users access FRR via binary packages from 3rd party sources;
756compile-time code puts inclusion/exclusion in the hands of the package
757maintainer. Please think very carefully before making code conditional
758at compile time, as it increases regression testing, maintenance
759burdens, and user confusion. In particular, please avoid gratuitous
760``--enable-…`` switches to the configure script - in general, code
761should be of high quality and in working condition, or it shouldn’t be
762in FRR at all.
763
764When code must be compile-time conditional, try have the compiler make
765it conditional rather than the C pre-processor so that it will still be
766checked by the compiler, even if disabled. For example,
767
768::
769
770 if (SOME_SYMBOL)
771 frobnicate();
772
773is preferred to
774
775::
776
777 #ifdef SOME_SYMBOL
778 frobnicate ();
779 #endif /* SOME_SYMBOL */
780
b6820993
QY
781Note that the former approach requires ensuring that ``SOME_SYMBOL`` will be
782defined (watch your ``AC_DEFINE``\ s).
d1890d04
QY
783
784Debug-guards in code
9de103f0 785--------------------
d1890d04 786
b6820993
QY
787Debugging statements are an important methodology to allow developers to fix
788issues found in the code after it has been released. The caveat here is that
789the developer must remember that people will be using the code at scale and in
790ways that can be unexpected for the original implementor. As such debugs
791**MUST** be guarded in such a way that they can be turned off. FRR has the
792ability to turn on/off debugs from the CLI and it is expected that the
793developer will use this convention to allow control of their debugs.
d1890d04 794
81047bc5
DL
795Custom syntax-like block macros
796-------------------------------
797
798FRR uses some macros that behave like the ``for`` or ``if`` C keywords. These
799macros follow these patterns:
800
801- loop-style macros are named ``frr_each_*`` (and ``frr_each``)
802- single run macros are named ``frr_with_*``
803- to avoid confusion, ``frr_with_*`` macros must always use a ``{ ... }``
804 block even if the block only contains one statement. The ``frr_each``
805 constructs are assumed to be well-known enough to use normal ``for`` rules.
806- ``break``, ``return`` and ``goto`` all work correctly. For loop-style
807 macros, ``continue`` works correctly too.
808
809Both the ``each`` and ``with`` keywords are inspired by other (more
810higher-level) programming languages that provide these constructs.
811
812There are also some older iteration macros, e.g. ``ALL_LIST_ELEMENTS`` and
813``FOREACH_AFI_SAFI``. These macros in some cases do **not** fulfill the above
814pattern (e.g. ``break`` does not work in ``FOREACH_AFI_SAFI`` because it
815expands to 2 nested loops.)
816
9e001286
QY
817Static Analysis and Sanitizers
818------------------------------
81af0317
DL
819Clang/LLVM and GCC come with a variety of tools that can be used to help find
820bugs in FRR.
9e001286
QY
821
822clang-analyze
823 This is a static analyzer that scans the source code looking for patterns
824 that are likely to be bugs. The tool is run automatically on pull requests
825 as part of CI and new static analysis warnings will be placed in the CI
826 results. FRR aims for absolutely zero static analysis errors. While the
827 project is not quite there, code that introduces new static analysis errors
828 is very unlikely to be merged.
829
830AddressSanitizer
831 This is an excellent tool that provides runtime instrumentation for
832 detecting memory errors. As part of CI FRR is built with this
833 instrumentation and run through a series of tests to look for any results.
834 Testing your own code with this tool before submission is encouraged. You
835 can enable it by passing::
d5403d4f 836
9e001286
QY
837 --enable-address-sanitizer
838
839 to ``configure``.
840
841ThreadSanitizer
842 Similar to AddressSanitizer, this tool provides runtime instrumentation for
843 detecting data races. If you are working on or around multithreaded code,
844 extensive testing with this instrumtation enabled is *highly* recommended.
845 You can enable it by passing::
d5403d4f 846
9e001286
QY
847 --enable-thread-sanitizer
848
849 to ``configure``.
850
851MemorySanitizer
852 Similar to AddressSanitizer, this tool provides runtime instrumentation for
853 detecting use of uninitialized heap memory. Testing your own code with this
854 tool before submission is encouraged. You can enable it by passing::
d5403d4f 855
9e001286
QY
856 --enable-memory-sanitizer
857
858 to ``configure``.
859
860All of the above tools are available in the Clang/LLVM toolchain since 3.4.
861AddressSanitizer and ThreadSanitizer are available in recent versions of GCC,
862but are no longer actively maintained. MemorySanitizer is not available in GCC.
863
81af0317
DL
864.. note::
865
866 The different Sanitizers are mostly incompatible with each other. Please
867 refer to GCC/LLVM documentation for details.
868
9e001286
QY
869Additionally, the FRR codebase is regularly scanned with Coverity.
870Unfortunately Coverity does not have the ability to handle scanning pull
871requests, but after code is merged it will send an email notifying project
872members with Coverity access of newly introduced defects.
873
81af0317
DL
874Executing non-installed dynamic binaries
875----------------------------------------
876
877Since FRR uses the GNU autotools build system, it inherits its shortcomings.
878To execute a binary directly from the build tree under a wrapper like
879`valgrind`, `gdb` or `strace`, use::
880
881 ./libtool --mode=execute valgrind [--valgrind-opts] zebra/zebra [--zebra-opts]
882
883While replacing valgrind/zebra as needed. The `libtool` script is found in
884the root of the build directory after `./configure` has completed. Its purpose
885is to correctly set up `LD_LIBRARY_PATH` so that libraries from the build tree
886are used. (On some systems, `libtool` is also available from PATH, but this is
887not always the case.)
888
d1890d04 889CLI changes
9de103f0 890-----------
d1890d04 891
b6820993
QY
892CLI's are a complicated ugly beast. Additions or changes to the CLI should use
893a DEFUN to encapsulate one setting as much as is possible. Additionally as new
894DEFUN's are added to the system, documentation should be provided for the new
895commands.
d1890d04
QY
896
897Backwards Compatibility
9de103f0 898-----------------------
d1890d04 899
b6820993
QY
900As a general principle, changes to CLI and code in the lib/ directory should be
901made in a backwards compatible fashion. This means that changes that are purely
902stylistic in nature should be avoided, e.g., renaming an existing macro or
903library function name without any functional change. When adding new parameters
904to common functions, it is also good to consider if this too should be done in
905a backward compatible fashion, e.g., by preserving the old form in addition to
d1890d04
QY
906adding the new form.
907
b6820993
QY
908This is not to say that minor or even major functional changes to CLI and
909common code should be avoided, but rather that the benefit gained from a change
910should be weighed against the added cost/complexity to existing code. Also,
911that when making such changes, it is good to preserve compatibility when
912possible to do so without introducing maintenance overhead/cost. It is also
913important to keep in mind, existing code includes code that may reside in
914private repositories (and is yet to be submitted) or code that has yet to be
915migrated from Quagga to FRR.
110bb121 916
b6820993
QY
917That said, compatibility measures can (and should) be removed when either:
918
919- they become a significant burden, e.g. when data structures change and the
920 compatibility measure would need a complex adaptation layer or becomes
921 flat-out impossible
922- some measure of time (dependent on the specific case) has passed, so that
923 the compatibility grace period is considered expired.
924
e12ea4bb
QY
925For CLI commands, the deprecation period is 1 year.
926
b6820993
QY
927In all cases, compatibility pieces should be marked with compiler/preprocessor
928annotations to print warnings at compile time, pointing to the appropriate
929update path. A ``-Werror`` build should fail if compatibility bits are used. To
930avoid compilation issues in released code, such compiler/preprocessor
931annotations must be ignored non-development branches. For example:
932
933.. code-block:: c
934
e60dd6ca 935 #if CONFDATE > 20180403
b6820993
QY
936 CPP_NOTICE("Use of <XYZ> is deprecated, please use <ABC>")
937 #endif
d1890d04 938
cab3f811
LB
939Preferably, the shell script :file:`tools/fixup-deprecated.py` will be
940updated along with making non-backwards compatible code changes, or an
941alternate script should be introduced, to update the code to match the
942change. When the script is updated, there is no need to preserve the
943deprecated code. Note that this does not apply to user interface
944changes, just internal code, macros and libraries.
945
d1890d04 946Miscellaneous
9de103f0 947-------------
d1890d04 948
b6820993
QY
949When in doubt, follow the guidelines in the Linux kernel style guide, or ask on
950the development mailing list / public Slack instance.
9de103f0
QY
951
952
953.. _documentation:
954
955Documentation
956=============
957
958FRR uses Sphinx+RST as its documentation system. The document you are currently
959reading was generated by Sphinx from RST source in
960:file:`doc/developer/workflow.rst`. The documentation is structured as follows:
961
d5403d4f
QY
962+-----------------------+-------------------------------------------+
963| Directory | Contents |
964+=======================+===========================================+
965| :file:`doc/user` | User documentation; configuration guides; |
966| | protocol overviews |
967+-----------------------+-------------------------------------------+
968| :file:`doc/developer` | Developer's documentation; API specs; |
969| | datastructures; architecture overviews; |
970| | project management procedure |
971+-----------------------+-------------------------------------------+
972| :file:`doc/manpages` | Source for manpages |
973+-----------------------+-------------------------------------------+
974| :file:`doc/figures` | Images and diagrams |
975+-----------------------+-------------------------------------------+
976| :file:`doc/extra` | Miscellaneous Sphinx extensions, scripts, |
977| | customizations, etc. |
978+-----------------------+-------------------------------------------+
979
980Each of these directories, with the exception of :file:`doc/figures` and
981:file:`doc/extra`, contains a Sphinx-generated Makefile and configuration
982script :file:`conf.py` used to set various document parameters. The makefile
983can be used for a variety of targets; invoke `make help` in any of these
984directories for a listing of available output formats. For convenience, there
985is a top-level :file:`Makefile.am` that has targets for PDF and HTML
986documentation for both developer and user documentation, respectively. That
987makefile is also responsible for building manual pages packed with distribution
988builds.
9de103f0
QY
989
990Indent and styling should follow existing conventions:
991
992- 3 spaces for indents under directives
993- Cross references may contain only lowercase alphanumeric characters and
994 hyphens ('-')
995- Lines wrapped to 80 characters where possible
996
997Characters for header levels should follow Python documentation guide:
998
999- ``#`` with overline, for parts
1000- ``*`` with overline, for chapters
1001- ``=``, for sections
1002- ``-``, for subsections
1003- ``^``, for subsubsections
1004- ``"``, for paragraphs
1005
1006After you have made your changes, please make sure that you can invoke
1007``make latexpdf`` and ``make html`` with no warnings.
1008
1009The documentation is currently incomplete and needs love. If you find a broken
1010cross-reference, figure, dead hyperlink, style issue or any other nastiness we
1011gladly accept documentation patches.
1012
c91e9b8f
QY
1013To build the docs, please ensure you have installed a recent version of
1014`Sphinx <http://www.sphinx-doc.org/en/stable/install.html>`_. If you want to
1015build LaTeX or PDF docs, you will also need a full LaTeX distribution
1016installed.
1017
9de103f0
QY
1018Code
1019----
1020
1021FRR is a large and complex software project developed by many different people
1022over a long period of time. Without adequate documentation, it can be
1023exceedingly difficult to understand code segments, APIs and other interfaces.
1024In the interest of keeping the project healthy and maintainable, you should
1025make every effort to document your code so that other people can understand
1026what it does without needing to closely read the code itself.
1027
1028Some specific guidelines that contributors should follow are:
1029
1030- Functions exposed in header files should have descriptive comments above
1031 their signatures in the header file. At a minimum, a function comment should
1032 contain information about the return value, parameters, and a general summary
1033 of the function's purpose. Documentation on parameter values can be omitted
1034 if it is (very) obvious what they are used for.
1035
1036 Function comments must follow the style for multiline comments laid out in
1037 the kernel style guide.
1038
1039 Example:
1040
1041 .. code-block:: c
1042
1043 /*
1044 * Determines whether or not a string is cool.
1045 *
b6820993
QY
1046 * text
1047 * the string to check for coolness
1048 *
1049 * is_clccfc
1050 * whether capslock is cruise control for cool
1051 *
1052 * Returns:
1053 * 7 if the text is cool, 0 otherwise
9de103f0
QY
1054 */
1055 int check_coolness(const char *text, bool is_clccfc);
1056
b6820993
QY
1057 Function comments should make it clear what parameters and return values are
1058 used for.
9de103f0
QY
1059
1060- Static functions should have descriptive comments in the same form as above
1061 if what they do is not immediately obvious. Use good engineering judgement
1062 when deciding whether a comment is necessary. If you are unsure, document
1063 your code.
1064- Global variables, static or not, should have a comment describing their use.
1065- **For new code in lib/, these guidelines are hard requirements.**
1066
1067If you make significant changes to portions of the codebase covered in the
1068Developer's Manual, add a major subsystem or feature, or gain arcane mastery of
1069some undocumented or poorly documented part of the codebase, please document
1070your work so others can benefit. If you add a major feature or introduce a new
1071API, please document the architecture and API to the best of your abilities in
1072the Developer's Manual, using good judgement when choosing where to place it.
1073
1074Finally, if you come across some code that is undocumented and feel like
1075going above and beyond, document it! We absolutely appreciate and accept
1076patches that document previously undocumented code.
1077
1078User
1079----
1080
1081If you are contributing code that adds significant user-visible functionality
1082please document how to use it in :file:`doc/user`. Use good judgement when
1083choosing where to place documentation. For example, instructions on how to use
1084your implementation of a new BGP draft should go in the BGP chapter instead of
1085being its own chapter. If you are adding a new protocol daemon, please create a
1086new chapter.
1087
d5403d4f
QY
1088FRR Specific Markup
1089-------------------
1090
1091FRR has some customizations applied to the Sphinx markup that go a long way
1092towards making documentation easier to use, write and maintain.
1093
1094CLI Commands
1095^^^^^^^^^^^^
1096
9de103f0
QY
1097When documenting CLI please use a combination of the ``.. index::`` and
1098``.. clicmd::`` directives. For example, the command :clicmd:`show pony` would
1099be documented as follows:
1100
1101.. code-block:: rest
1102
1103 .. index:: show pony
1104 .. clicmd:: show pony
1105
1106 Prints an ASCII pony. Example output:::
1107
1108 >>\.
1109 /_ )`.
1110 / _)`^)`. _.---. _
1111 (_,' \ `^-)"" `.\
1112 | | \
1113 \ / |
1114 / \ /.___.'\ (\ (_
1115 < ,"|| \ |`. \`-'
1116 \\ () )| )/
1117 hjw |_>|> /_] //
1118 /_] /_]
1119
1120When documented this way, CLI commands can be cross referenced with the
1121``:clicmd:`` inline markup like so:
1122
1123.. code-block:: rest
1124
1125 :clicmd:`show pony`
1126
1127This is very helpful for users who want to quickly remind themselves what a
1128particular command does.
1129
d5403d4f
QY
1130Configuration Snippets
1131^^^^^^^^^^^^^^^^^^^^^^
1132
1133When putting blocks of example configuration please use the
1134``.. code-block::`` directive and specify ``frr`` as the highlighting language,
1135as in the following example. This will tell Sphinx to use a custom Pygments
1136lexer to highlight FRR configuration syntax.
1137
1138.. code-block:: rest
1139
1140 .. code-block:: frr
1141
1142 !
1143 ! Example configuration file.
1144 !
1145 log file /tmp/log.log
1146 service integrated-vtysh-config
1147 !
1148 ip route 1.2.3.0/24 reject
1149 ipv6 route de:ea:db:ee:ff::/64 reject
1150 !
1151
1152
9de103f0
QY
1153.. _GitHub: https://github.com/frrouting/frr
1154.. _GitHub issues: https://github.com/frrouting/frr/issues
115e70a1
PZ
1155
1156.. rubric:: Footnotes
1157
1158.. [#tool_style_conflicts] For example, lines over 80 characters are allowed
1159 for text strings to make it possible to search the code for them: please
1160 see `Linux kernel style (breaking long lines and strings) <https://www.kernel.org/doc/html/v4.10/process/coding-style.html#breaking-long-lines-and-strings>`_
1161 and `Issue #1794 <https://github.com/FRRouting/frr/issues/1794>`_.