]> git.proxmox.com Git - mirror_frr.git/blame - doc/developer/workflow.rst
doc: Update documentation to state new code must use latest approved methods
[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 90
dc1c0bc2
DL
91Releases are scheduled in a 4-month cycle on the first Tuesday each
92March/July/November. Walking backwards from this date:
93
94 - 6 weeks earlier, ``master`` is frozen for new features, and feature PRs
95 are considered lowest priority (regardless of when they were opened.)
96
97 - 4 weeks earlier, the stable branch separates from master (named
5568f9d1
DA
98 ``dev/MAJOR.MINOR`` at this point) and tagged as ```base_X.Y``.
99 Master is unfrozen and new features may again proceed.
dc1c0bc2 100
16044e7f
DL
101 Part of unfreezing master is editing the ``AC_INIT`` statement in
102 :file:`configure.ac` to reflect the new development version that master
103 now refers to. This is accompanied by a ``frr-X.Y-dev`` tag on master,
104 which should always be on the first commit on master *after* the stable
105 branch was forked (even if that is not the edit to ``AC_INIT``; it's more
106 important to have it on the very first commit on master after the fork.)
107
108 (The :file:`configure.ac` edit and tag push are considered git housekeeping
109 and are pushed directly to ``master``, not through a PR.)
110
5568f9d1
DA
111 Below is the snippet of the commands to use in this step.
112
113 .. code-block:: console
114
115 % git remote --verbose
116 upstream git@github.com:frrouting/frr (fetch)
117 upstream git@github.com:frrouting/frr (push)
118
119 % git checkout master
120 % git pull upstream master
121 % git checkout -b dev/8.2
122 % git tag base_8.2
123 % git push upstream base_8.2
124 % git push upstream dev/8.2
125 % git checkout master
126 % sed -i 's/8.2-dev/8.3-dev/' configure.ac
5568f9d1
DA
127 % git add configure.ac
128 % git commit -s -m "build: FRR 8.3 development version"
c1242b7b 129 % git tag -a frr-8.3-dev -m "frr-8.3-dev"
5568f9d1 130 % git push upstream master
c1242b7b 131 % git push upstream frr-8.3-dev
5568f9d1
DA
132
133 In this step, we also have to update package versions to reflect
134 the development version. Versions need to be updated using
135 a standard way of development (Pull Requests) based on master branch.
136
137 Only change the version number with no other changes. This will produce
138 packages with the a version number that is higher than any previous
139 version. Once the release is done, whatever updates we make to changelog
140 files on the release branch need to be cherry-picked to the master branch.
141
142 - 2 weeks earlier, a ``frr-X.Y-rc`` release candidate is tagged.
dc1c0bc2 143
0a3fa828
DA
144 .. code-block:: console
145
146 % git remote --verbose
147 upstream git@github.com:frrouting/frr (fetch)
148 upstream git@github.com:frrouting/frr (push)
149
150 % git checkout dev/8.2
151 % git tag frr-8.2-rc
152 % git push upstream frr-8.2-rc
153
dc1c0bc2
DL
154 - on release date, the branch is renamed to ``stable/MAJOR.MINOR``.
155
156The 2 week window between each of these events should be used to run any and
157all testing possible for the release in progress. However, the current
158intention is to stick to the schedule even if known issues remain. This would
159hopefully occur only after all avenues of fixing issues are exhausted, but to
160achieve this, an as exhaustive as possible list of issues needs to be available
161as early as possible, i.e. the first 2-week window.
162
163For reference, the expected release schedule according to the above is:
164
5568f9d1
DA
165+---------+------------+------------+------------+------------+------------+
166| Release | 2021-11-02 | 2022-03-01 | 2022-07-05 | 2022-11-01 | 2023-03-07 |
167+---------+------------+------------+------------+------------+------------+
168| RC | 2021-10-19 | 2022-02-15 | 2022-06-21 | 2022-10-18 | 2023-02-21 |
169+---------+------------+------------+------------+------------+------------+
170| dev/X.Y | 2021-10-05 | 2022-02-01 | 2022-06-07 | 2022-10-04 | 2023-02-07 |
171+---------+------------+------------+------------+------------+------------+
172| freeze | 2021-09-21 | 2022-01-18 | 2022-05-24 | 2022-09-20 | 2023-01-24 |
173+---------+------------+------------+------------+------------+------------+
dc1c0bc2
DL
174
175Each release is managed by one or more volunteer release managers from the FRR
add70bc3
DS
176community. These release managers are expected to handle the branch for a period
177of one year. To spread and distribute this workload, this should be rotated for
dc1c0bc2
DL
178subsequent releases. The release managers are currently assumed/expected to
179run a release management meeting during the weeks listed above. Barring other
180constraints, this would be scheduled before the regular weekly FRR community
181call such that important items can be carried over into that call.
c804874a 182
add70bc3
DS
183Bugfixes are applied to the two most recent releases. It is expected that
184each bugfix backported should include some reasoning for its inclusion
185as well as receiving approval by the release managers for that release before
186accepted into the release branch. This does not necessarily preclude backporting of
187bug fixes to older than the two most recent releases.
07ff01d2
PG
188
189Security fixes are backported to all releases less than or equal to at least one
190year old. Security fixes may also be backported to older releases depending on
191severity.
192
f4bcc72f
QY
193For detailed instructions on how to produce an FRR release, refer to
194:ref:`frr-release-procedure`.
195
bd2b4fc3
PG
196
197Long term support branches ( LTS )
198-----------------------------------------
199
200This kind of branch is not yet officially supported, and need experimentation
201before being effective.
202
203Previous definition of releases prevents long term support of previous releases.
204For instance, bug and security fixes are not applied if the stable branch is too
205old.
206
207Because the FRR users have a need to backport bug and security fixes after the
208stable branch becomes too old, there is a need to provide support on a long term
209basis on that stable branch. If that support is applied on that stable branch,
210then that branch is a long term support branch.
211
212Having a LTS branch requires extra-work and requires one person to be in charge
213of that maintenance branch for a certain amount of time. The amount of time will
214be by default set to 4 months, and can be increased. 4 months stands for the time
215between two releases, this time can be applied to the decision to continue with a
216LTS release or not. In all cases, that time period will be well-defined and
217published. Also, a self nomination from a person that proposes to handle the LTS
218branch is required. The work can be shared by multiple people. In all cases, there
219must be at least one person that is in charge of the maintenance branch. The person
220on people responsible for a maintenance branch must be a FRR maintainer. Note that
221they may choose to abandon support for the maintenance branch at any time. If
56f0bea7 222no one takes over the responsibility of the LTS branch, then the support will be
bd2b4fc3
PG
223discontinued.
224
225The LTS branch duties are the following ones:
226
227- organise meetings on a (bi-)weekly or monthly basis, the handling of issues
228 and pull requested relative to that branch. When time permits, this may be done
229 during the regularly scheduled FRR meeting.
230
231- ensure the stability of the branch, by using and eventually adapting the
232 checking the CI tools of FRR ( indeed, maintaining may lead to create
233 maintenance branches for topotests or for CI).
234
235It will not be possible to backport feature requests to LTS branches. Actually, it
236is a false good idea to use LTS for that need. Introducing feature requests may
237break the paradigm where all more recent releases should also include the feature
238request. This would require the LTS maintainer to ensure that all more recent
239releases have support for this feature request. Moreover, introducing features
240requests may result in breaking the stability of the branch. LTS branches are first
241done to bring long term support for stability.
8ce7861f 242
16318c5c
DS
243Development Branches
244--------------------
245
246Occassionally the community will desire the ability to work together
247on a feature that is considered useful to FRR. In this case the
248parties may ask the Maintainers for the creation of a development
249branch in the main FRR repository. Requirements for this to happen
250are:
251
252- A one paragraph description of the feature being implemented to
253 allow for the facilitation of discussion about the feature. This
254 might include pointers to relevant RFC's or presentations that
255 explain what is planned. This is intended to set a somewhat
256 low bar for organization.
257- A branch maintainer must be named. This person is responsible for
258 keeping the branch up to date, and general communication about the
259 project with the other FRR Maintainers. Additionally this person
260 must already be a FRR Maintainer.
261- Commits to this branch must follow the normal PR and commit process
262 as outlined in other areas of this document. The goal of this is
263 to prevent the current state where large features are submitted
264 and are so large they are difficult to review.
265
266After a development branch has completed the work together, a final
267review can be made and the branch merged into master. If a development
268branch is becomes un-maintained or not being actively worked on after
269three months then the Maintainers can decide to remove the branch.
270
32db86a9
DL
271Debian Branches
272---------------
273
274The Debian project contains "official" packages for FRR. While FRR
275Maintainers may participate in creating these, it is entirely the Debian
276project's decision what to ship and how to work on this.
277
278As a courtesy and for FRR's benefit, this packaging work is currently visible
279in git branches named ``debian/*`` on the main FRR git repository. These
280branches are for the exclusive use by people involved in Debian packaging work
281for FRR. Direct commit access may be handed out and FRR git rules (review,
282testing, etc.) do not apply. Do not push to these branches without talking
283to the people noted under ``Maintainer:`` and ``Uploaders:`` in
284``debian/control`` on the target branch -- even if you are a FRR Maintainer.
285
d1890d04 286Changelog
b6820993 287---------
b22ba015
QY
288The changelog will be the base for the release notes. A changelog entry for
289your changes is usually not required and will be added based on your commit
290messages by the maintainers. However, you are free to include an update to the
291changelog with some better description.
d1890d04
QY
292
293Submitting Patches and Enhancements
9de103f0 294===================================
d1890d04 295
85c6ecca 296FRR accepts patches using GitHub pull requests.
b22ba015
QY
297
298The base branch for new contributions and non-critical bug fixes should be
299``master``. Please ensure your pull request is based on this branch when you
300submit it.
301
85c6ecca 302Code submitted by pull request will be automatically tested by one or more CI
b6820993
QY
303systems. Once the automated tests succeed, other developers will review your
304code for quality and correctness. After any concerns are resolved, your code
305will be merged into the branch it was submitted against.
d1890d04 306
01bf2ccb
LB
307The title of the pull request should provide a high level technical
308summary of the included patches. The description should provide
309additional details that will help the reviewer to understand the context
310of the included patches.
311
b6820993 312.. _license-for-contributions:
d1890d04 313
b6820993
QY
314License for Contributions
315-------------------------
316FRR is under a “GPLv2 or later” license. Any code submitted must be released
317under the same license (preferred) or any license which allows redistribution
318under this GPLv2 license (eg MIT License).
e2abcff8
PG
319It is forbidden to push any code that prevents from using GPLv3 license. This
320becomes a community rule, as FRR produces binaries that links with Apache 2.0
321libraries. Apache 2.0 and GPLv2 license are incompatible, if put together.
322Please see `<http://www.apache.org/licenses/GPL-compatibility.html>`_ for
323more information. This rule guarantees the user to distribute FRR binary code
324without any licensing issues.
b22ba015 325
b6820993
QY
326Pre-submission Checklist
327------------------------
328- Format code (see `Code Formatting <#code-formatting>`__)
329- Verify and acknowledge license (see :ref:`license-for-contributions`)
330- Ensure you have properly signed off (see :ref:`signing-off`)
331- Test building with various configurations:
d1890d04 332
b6820993 333 - ``buildtest.sh``
d1890d04 334
b6820993 335- Verify building source distribution:
d1890d04 336
b6820993 337 - ``make dist`` (and try rebuilding from the resulting tar file)
d1890d04 338
b6820993 339- Run unit tests:
d1890d04 340
b6820993 341 - ``make test``
d1890d04 342
b6820993 343- In the case of a major new feature or other significant change, document
8bc6e629
DS
344 plans for continued maintenance of the feature. In addition it is a
345 requirement that automated testing must be written that exercises
431dd37e 346 the new feature within our existing CI infrastructure. Also the
8bc6e629 347 addition of automated testing to cover any pull request is encouraged.
d1890d04 348
e605a239
DS
349- All new code must use the current latest version of acceptable code.
350
351 - If a daemon is converted to YANG, then new code must use YANG.
352 - DEFPY's must be used for new cli
353 - Typesafe lists must be used
354 - printf formatting changes must be used
355
b6820993 356.. _signing-off:
d1890d04 357
b6820993
QY
358Signing Off
359-----------
360Code submitted to FRR must be signed off. We have the same requirements for
361using the signed-off-by process as the Linux kernel. In short, you must include
362a ``Signed-off-by`` tag in every patch.
d1890d04 363
118cf7ed
SW
364An easy way to do this is to use ``git commit -s`` where ``-s`` will automatically
365append a signed-off line to the end of your commit message. Also, if you commit
366and forgot to add the line you can use ``git commit --amend -s`` to add the
367signed-off line to the last commit.
368
b6820993
QY
369``Signed-off-by`` is a developer's certification that they have the right to
370submit the patch for inclusion into the project. It is an agreement to the
371:ref:`Developer's Certificate of Origin <developers-certificate-of-origin>`.
372Code without a proper ``Signed-off-by`` line cannot and will not be merged.
d1890d04 373
b6820993
QY
374If you are unfamiliar with this process, you should read the
375`official policy at kernel.org <https://www.kernel.org/doc/html/latest/process/submitting-patches.html>`_.
376You might also find
377`this article <http://www.linuxfoundation.org/content/how-participate-linux-community-0>`_
378about participating in the Linux community on the Linux Foundation website to
379be a helpful resource.
d1890d04 380
b6820993 381.. _developers-certificate-of-origin:
d1890d04 382
b6820993
QY
383In short, when you sign off on a commit, you assert your agreement to all of
384the following::
d1890d04 385
b6820993 386 Developer's Certificate of Origin 1.1
d1890d04 387
b6820993 388 By making a contribution to this project, I certify that:
d1890d04 389
b6820993
QY
390 (a) The contribution was created in whole or in part by me and I
391 have the right to submit it under the open source license
392 indicated in the file; or
d1890d04 393
b6820993
QY
394 (b) The contribution is based upon previous work that, to the best
395 of my knowledge, is covered under an appropriate open source
396 license and I have the right under that license to submit that
397 work with modifications, whether created in whole or in part by
398 me, under the same open source license (unless I am permitted to
399 submit under a different license), as indicated in the file; or
d1890d04 400
b6820993
QY
401 (c) The contribution was provided directly to me by some other
402 person who certified (a), (b) or (c) and I have not modified it.
d1890d04 403
b6820993
QY
404 (d) I understand and agree that this project and the contribution
405 are public and that a record of the contribution (including all
406 personal information I submit with it, including my sign-off) is
407 maintained indefinitely and may be redistributed consistent with
408 this project or the open source license(s) involved.
d1890d04 409
b6820993 410After Submitting Your Changes
d1890d04
QY
411-----------------------------
412
b6820993 413- Watch for Continuous Integration (CI) test results
d1890d04
QY
414
415 - You should automatically receive an email with the test results
416 within less than 2 hrs of the submission. If you don’t get the
b6820993 417 email, then check status on the GitHub pull request.
d1890d04 418 - Please notify the development mailing list if you think something
b22ba015 419 doesn't work.
d1890d04
QY
420
421- If the tests failed:
422
423 - In general, expect the community to ignore the submission until
424 the tests pass.
425 - It is up to you to fix and resubmit.
426
427 - This includes fixing existing unit (“make test”) tests if your
428 changes broke or changed them.
429 - It also includes fixing distribution packages for the failing
430 platforms (ie if new libraries are required).
431 - Feel free to ask for help on the development list.
432
433 - Go back to the submission process and repeat until the tests pass.
434
435- If the tests pass:
436
437 - Wait for reviewers. Someone will review your code or be assigned
438 to review your code.
493e3eed
LB
439 - Respond to any comments or concerns the reviewer has. Use e-mail or
440 add a comment via github to respond or to let the reviewer know how
441 their comment or concern is addressed.
442 - An author must never delete or manually dismiss someone else's comments
443 or review. (A review may be overridden by agreement in the weekly
444 technical meeting.)
70aa675d
DL
445 - When you have addressed someone's review comments, please click the
446 "re-request review" button (in the top-right corner of the PR page, next
447 to the reviewer's name, an icon that looks like "reload")
448 - The responsibility for keeping a PR moving rests with the author at
449 least as long as there are either negative CI results or negative review
450 comments. If you forget to mark a review comment as addressed (by
451 clicking re-request review), the reviewer may very well not notice and
452 won't come back to your PR.
493e3eed
LB
453 - Automatically generated comments, e.g., those generated by CI systems,
454 may be deleted by authors and others when such comments are not the most
22265b35 455 recent results from that automated comment source.
d1890d04
QY
456 - After all comments and concerns are addressed, expect your patch
457 to be merged.
458
459- Watch out for questions on the mailing list. At this time there will
460 be a manual code review and further (longer) tests by various
461 community members.
462- Your submission is done once it is merged to the master branch.
463
9de103f0
QY
464Programming Languages, Tools and Libraries
465==========================================
466
467The core of FRR is written in C (gcc or clang supported) and makes
468use of GNU compiler extensions. A few non-essential scripts are
469implemented in Perl and Python. FRR requires the following tools
470to build distribution packages: automake, autoconf, texinfo, libtool and
471gawk and various libraries (i.e. libpam and libjson-c).
472
473If your contribution requires a new library or other tool, then please
474highlight this in your description of the change. Also make sure it’s
475supported by all FRR platform OSes or provide a way to build
476without the library (potentially without the new feature) on the other
477platforms.
478
479Documentation should be written in reStructuredText. Sphinx extensions may be
480utilized but pure ReST is preferred where possible. See
481:ref:`documentation`.
482
ca9dfee0
DL
483Use of C++
484----------
485
486While C++ is not accepted for core components of FRR, extensions, modules or
487other distinct components may want to use C++ and include FRR header files.
488There is no requirement on contributors to work to retain C++ compatibility,
489but fixes for C++ compatibility are welcome.
490
491This implies that the burden of work to keep C++ compatibility is placed with
492the people who need it, and they may provide it at their leisure to the extent
493it is useful to them. So, if only a subset of header files, or even parts of
494a header file are made available to C++, this is perfectly fine.
495
590a7368
QY
496Code Reviews
497============
498
499Code quality is paramount for any large program. Consequently we require
500reviews of all submitted patches by at least one person other than the
501submitter before the patch is merged.
502
503Because of the nature of the software, FRR's maintainer list (i.e. those with
504commit permissions) tends to contain employees / members of various
505organizations. In order to prevent conflicts of interest, we use an honor
506system in which submissions from an individual representing one company should
507be merged by someone unaffiliated with that company.
508
509Guidelines for code review
924947e4 510--------------------------
590a7368
QY
511
512- As a rule of thumb, the depth of the review should be proportional to the
513 scope and / or impact of the patch.
514
515- Anyone may review a patch.
516
517- When using GitHub reviews, marking "Approve" on a code review indicates
518 willingness to merge the PR.
519
520- For individuals with merge rights, marking "Changes requested" is equivalent
521 to a NAK.
522
523- For a PR you marked with "Changes requested", please respond to updates in a
524 timely manner to avoid impeding the flow of development.
525
7e678379
LB
526- Rejected or obsolete PRs are generally closed by the submitter based
527 on requests and/or agreement captured in a PR comment. The comment
528 may originate with a reviewer or document agreement reached on Slack,
529 the Development mailing list, or the weekly technical meeting.
530
8bc6e629
DS
531- Reviewers may ask for new automated testing if they feel that the
532 code change is large enough/significant enough to warrant such
533 a requirement.
534
70aa675d
DL
535For project members with merge permissions, the following patterns have
536emerged:
537
538- a PR with any reviews requesting changes may not be merged.
539
540- a PR with any negative CI result may not be merged.
541
542- an open "yellow" review mark ("review requested, but not done") should be
543 given some time (a few days up to weeks, depending on the size of the PR),
544 but is not a merge blocker.
545
546- a "textbubble" review mark ("review comments, but not positive/negative")
547 should be read through but is not a merge blocker.
548
549- non-trivial PRs are generally given some time (again depending on the size)
550 for people to mark an interest in reviewing. Trivial PRs may be merged
551 immediately when CI is green.
552
590a7368 553
b22ba015 554Coding Practices & Style
9de103f0 555========================
d1890d04
QY
556
557Commit messages
9de103f0 558---------------
d1890d04
QY
559
560Commit messages should be formatted in the same way as Linux kernel
b6820993 561commit messages. The format is roughly::
d1890d04
QY
562
563 dir: short summary
564
565 extended summary
566
b6820993
QY
567``dir`` should be the top level source directory under which the change was
568made. For example, a change in :file:`bgpd/rfapi` would be formatted as::
d1890d04 569
9de103f0 570 bgpd: short summary
d1890d04 571
b6820993
QY
572 ...
573
574The first line should be no longer than 50 characters. Subsequent lines should
575be wrapped to 72 characters.
d1890d04 576
7bd4560b
QY
577The purpose of commit messages is to briefly summarize what the commit is
578changing. Therefore, the extended summary portion should be in the form of an
579English paragraph. Brief examples of program output are acceptable but if
580present should be short (on the order of 10 lines) and clearly demonstrate what
581has changed. The goal should be that someone with only passing familiarity with
582the code in question can understand what is being changed.
583
584Commit messages consisting entirely of program output are *unacceptable*. These
585do not describe the behavior changed. For example, putting VTYSH output or the
586result of test runs as the sole content of commit messages is unacceptable.
587
b6820993
QY
588You must also sign off on your commit.
589
590.. seealso:: :ref:`signing-off`
591
7bd4560b 592
b6820993 593Source File Header
9de103f0 594------------------
d1890d04 595
b6820993
QY
596New files must have a copyright header (see :ref:`license-for-contributions`
597above) added to the file. The header should be:
d1890d04 598
b6820993 599.. code-block:: c
d1890d04
QY
600
601 /*
602 * Title/Function of file
603 * Copyright (C) YEAR Author’s Name
604 *
605 * This program is free software; you can redistribute it and/or modify it
606 * under the terms of the GNU General Public License as published by the Free
607 * Software Foundation; either version 2 of the License, or (at your option)
608 * any later version.
609 *
610 * This program is distributed in the hope that it will be useful, but WITHOUT
611 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
612 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
613 * more details.
614 *
615 * You should have received a copy of the GNU General Public License along
616 * with this program; see the file COPYING; if not, write to the Free Software
617 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
618 */
619
620 #include <zebra.h>
621
b6820993
QY
622Please copy-paste this header verbatim. In particular:
623
624- Do not replace "This program" with "FRR"
625- Do not change the address of the FSF
626
627Adding Copyright Claims to Existing Files
9de103f0 628-----------------------------------------
d1890d04 629
b6820993
QY
630When adding copyright claims for modifications to an existing file, please
631add a ``Portions:`` section as shown below. If this section already exists, add
632your new claim at the end of the list.
d1890d04 633
b6820993 634.. code-block:: c
d1890d04 635
b6820993
QY
636 /*
637 * Title/Function of file
638 * Copyright (C) YEAR Author’s Name
639 * Portions:
640 * Copyright (C) 2010 Entity A ....
641 * Copyright (C) 2016 Your name [optional brief change description]
642 * ...
643 */
d1890d04 644
08cffeb5
DL
645Defensive coding requirements
646-----------------------------
647
648In general, code submitted into FRR will be rejected if it uses unsafe
649programming practices. While there is no enforced overall ruleset, the
650following requirements have achieved consensus:
651
7533cad7 652- ``strcpy``, ``strcat`` and ``sprintf`` are unacceptable without exception.
08cffeb5
DL
653 Use ``strlcpy``, ``strlcat`` and ``snprintf`` instead. (Rationale: even if
654 you know the operation cannot overflow the buffer, a future code change may
655 inadvertedly introduce an overflow.)
656
657- buffer size arguments, particularly to ``strlcpy`` and ``snprintf``, must
658 use ``sizeof()`` whereever possible. Particularly, do not use a size
659 constant in these cases. (Rationale: changing a buffer to another size
660 constant may leave the write operations on a now-incorrect size limit.)
661
2787347d
QY
662- For stack allocated structs and arrays that should be zero initialized,
663 prefer initializer expressions over ``memset()`` wherever possible. This
664 helps prevent ``memset()`` calls being missed in branches, and eliminates the
665 error class of an incorrect ``size`` argument to ``memset()``.
666
667 For example, instead of:
668
669 .. code-block:: c
670
671 struct foo mystruct;
672 ...
673 memset(&mystruct, 0x00, sizeof(struct foo));
674
675 Prefer:
676
677 .. code-block:: c
678
679 struct foo mystruct = {};
680
681- Do not zero initialize stack allocated values that must be initialized with a
682 nonzero value in order to be used. This way the compiler and memory checking
683 tools can catch uninitialized value use that would otherwise be suppressed by
684 the (incorrect) zero initialization.
685
08cffeb5
DL
686Other than these specific rules, coding practices from the Linux kernel as
687well as CERT or MISRA C guidelines may provide useful input on safe C code.
688However, these rules are not applied as-is; some of them expressly collide
689with established practice.
690
161ed8a6
DL
691
692Container implementations
693^^^^^^^^^^^^^^^^^^^^^^^^^
694
695In particular to gain defensive coding benefits from better compiler type
696checks, there is a set of replacement container data structures to be found
697in :file:`lib/typesafe.h`. They're documented under :ref:`lists`.
698
699Unfortunately, the FRR codebase is quite large, and migrating existing code to
700use these new structures is a tedious and far-reaching process (even if it
701can be automated with coccinelle, the patches would touch whole swaths of code
702and create tons of merge conflicts for ongoing work.) Therefore, little
703existing code has been migrated.
704
705However, both **new code and refactors of existing code should use the new
706containers**. If there are any reasons this can't be done, please work to
707remove these reasons (e.g. by adding necessary features to the new containers)
708rather than falling back to the old code.
709
710In order of likelyhood of removal, these are the old containers:
711
712- :file:`nhrpd/list.*`, ``hlist_*`` ⇒ ``DECLARE_LIST``
713- :file:`nhrpd/list.*`, ``list_*`` ⇒ ``DECLARE_DLIST``
714- :file:`lib/skiplist.*`, ``skiplist_*`` ⇒ ``DECLARE_SKIPLIST``
715- :file:`lib/*_queue.h` (BSD), ``SLIST_*`` ⇒ ``DECLARE_LIST``
716- :file:`lib/*_queue.h` (BSD), ``LIST_*`` ⇒ ``DECLARE_DLIST``
717- :file:`lib/*_queue.h` (BSD), ``STAILQ_*`` ⇒ ``DECLARE_LIST``
718- :file:`lib/*_queue.h` (BSD), ``TAILQ_*`` ⇒ ``DECLARE_DLIST``
719- :file:`lib/hash.*`, ``hash_*`` ⇒ ``DECLARE_HASH``
720- :file:`lib/linklist.*`, ``list_*`` ⇒ ``DECLARE_DLIST``
721- open-coded linked lists ⇒ ``DECLARE_LIST``/``DECLARE_DLIST``
722
723
c964e511 724Code Formatting
9de103f0 725---------------
d1890d04 726
6f7a9254
QY
727C Code
728^^^^^^
729
730For C code, FRR uses Linux kernel style except where noted below. Code which
731does not comply with these style guidelines will not be accepted.
d1890d04 732
281ba953
QY
733The project provides multiple tools to allow you to correctly style your code
734as painlessly as possible, primarily built around ``clang-format``.
735
736clang-format
737 In the project root there is a :file:`.clang-format` configuration file
738 which can be used with the ``clang-format`` source formatter tool from the
739 LLVM project. Most of the time, this is the easiest and smartest tool to
740 use. It can be run in a variety of ways. If you point it at a C source file
741 or directory of source files, it will format all of them. In the LLVM source
742 tree there are scripts that allow you to integrate it with ``git``, ``vim``
743 and ``emacs``, and there are third-party plugins for other editors. The
744 ``git`` integration is particularly useful; suppose you have some changes in
745 your git index. Then, with the integration installed, you can do the
746 following:
747
748 ::
749
750 git clang-format
751
752 This will format *only* the changes present in your index. If you have just
753 made a few commits and would like to correctly style only the changes made
754 in those commits, you can use the following syntax:
755
756 ::
757
758 git clang-format HEAD~X
759
760 Where X is one more than the number of commits back from the tip of your
761 branch you would like ``clang-format`` to look at (similar to specifying the
762 target for a rebase).
763
764 The ``vim`` plugin is particularly useful. It allows you to select lines in
765 visual line mode and press a key binding to invoke ``clang-format`` on only
766 those lines.
767
768 When using ``clang-format``, it is recommended to use the latest version.
769 Each consecutive version generally has better handling of various edge
770 cases. You may notice on occasion that two consecutive runs of
771 ``clang-format`` over the same code may result in changes being made on the
772 second run. This is an unfortunate artifact of the tool. Please check with
773 the kernel style guide if in doubt.
774
775 One stylistic problem with the FRR codebase is the use of ``DEFUN`` macros
776 for defining CLI commands. ``clang-format`` will happily format these macro
777 invocations, but the result is often unsightly and difficult to read.
778 Consequently, FRR takes a more relaxed position with how these are
779 formatted. In general you should lean towards using the style exemplified in
780 the section on :ref:`command-line-interface`. Because ``clang-format``
781 mangles this style, there is a Python script named ``tools/indent.py`` that
782 wraps ``clang-format`` and handles ``DEFUN`` macros as well as some other
783 edge cases specific to FRR. If you are submitting a new file, it is
784 recommended to run that script over the new file, preferably after ensuring
785 that the latest stable release of ``clang-format`` is in your ``PATH``.
786
787 Documentation on ``clang-format`` and its various integrations is maintained
788 on the LLVM website.
789
790 https://clang.llvm.org/docs/ClangFormat.html
791
792checkpatch.sh
793 In the Linux kernel source tree there is a Perl script used to check
794 incoming patches for style errors. FRR uses an adapted version of this
795 script for the same purpose. It can be found at
2780ae0c 796 :file:`tools/checkpatch.sh`. This script takes a git-formatted diff or
281ba953
QY
797 patch file, applies it to a clean FRR tree, and inspects the result to catch
798 potential style errors. Running this script on your patches before
799 submission is highly recommended. The CI system runs this script as well and
800 will comment on the PR with the results if style errors are found.
801
b6820993 802 It is run like this::
281ba953 803
b6820993 804 ./checkpatch.sh <patch> <tree>
281ba953
QY
805
806 Reports are generated on ``stderr`` and the exit code indicates whether
807 issues were found (2, 1) or not (0).
808
809 Where ``<patch>`` is the path to the diff or patch file and ``<tree>`` is
810 the path to your FRR source tree. The tree should be on the branch that you
811 intend to submit the patch against. The script will make a best-effort
812 attempt to save the state of your working tree and index before applying the
813 patch, and to restore it when it is done, but it is still recommended that
814 you have a clean working tree as the script does perform a hard reset on
815 your tree during its run.
816
817 The script reports two classes of issues, namely WARNINGs and ERRORs. Please
818 pay attention to both of them. The script will generally report WARNINGs
819 where it cannot be 100% sure that a particular issue is real. In most cases
820 WARNINGs indicate an issue that needs to be fixed. Sometimes the script will
821 report false positives; these will be handled in code review on a
822 case-by-case basis. Since the script only looks at changed lines,
823 occasionally changing one part of a line can cause the script to report a
824 style issue already present on that line that is unrelated to the change.
825 When convenient it is preferred that these be cleaned up inline, but this is
826 not required.
827
115e70a1
PZ
828 In general, a developer should heed the information reported by checkpatch.
829 However, some flexibility is needed for cases where human judgement yields
830 better clarity than the script. Accordingly, it may be appropriate to
831 ignore some checkpatch.sh warnings per discussion among the submitter(s)
832 and reviewer(s) of a change. Misreporting of errors by the script is
d3c2e316
QY
833 possible. When this occurs, the exception should be handled either by
834 patching checkpatch to correct the false error report, or by documenting the
835 exception in this document under :ref:`style-exceptions`. If the incorrect
836 report is likely to appear again, a checkpatch update is preferred.
115e70a1 837
281ba953
QY
838 If the script finds one or more WARNINGs it will exit with 1. If it finds
839 one or more ERRORs it will exit with 2.
840
841
842Please remember that while FRR provides these tools for your convenience,
843responsibility for properly formatting your code ultimately lies on the
844shoulders of the submitter. As such, it is recommended to double-check the
845results of these tools to avoid delays in merging your submission.
d1890d04 846
115e70a1
PZ
847In some cases, these tools modify or flag the format in ways that go beyond or
848even conflict [#tool_style_conflicts]_ with the canonical documented Linux
849kernel style. In these cases, the Linux kernel style takes priority;
850non-canonical issues flagged by the tools are not compulsory but rather are
851opportunities for discussion among the submitter(s) and reviewer(s) of a change.
852
d1890d04
QY
853**Whitespace changes in untouched parts of the code are not acceptable
854in patches that change actual code.** To change/fix formatting issues,
855please create a separate patch that only does formatting changes and
856nothing else.
857
d1890d04
QY
858Kernel and BSD styles are documented externally:
859
860- https://www.kernel.org/doc/html/latest/process/coding-style.html
861- http://man.openbsd.org/style
862
863For GNU coding style, use ``indent`` with the following invocation:
864
865::
866
867 indent -nut -nfc1 file_for_submission.c
868
28ac5a03
QY
869
870Historically, FRR used fixed-width integral types that do not exist in any
871standard but were defined by most platforms at some point. Officially these
872types are not guaranteed to exist. Therefore, please use the fixed-width
873integral types introduced in the C99 standard when contributing new code to
874FRR. If you need to convert a large amount of code to use the correct types,
875there is a shell script in :file:`tools/convert-fixedwidth.sh` that will do the
876necessary replacements.
877
878+-----------+--------------------------+
879| Incorrect | Correct |
880+===========+==========================+
881| u_int8_t | uint8_t |
882+-----------+--------------------------+
883| u_int16_t | uint16_t |
884+-----------+--------------------------+
885| u_int32_t | uint32_t |
886+-----------+--------------------------+
887| u_int64_t | uint64_t |
888+-----------+--------------------------+
889| u_char | uint8_t or unsigned char |
890+-----------+--------------------------+
891| u_short | unsigned short |
892+-----------+--------------------------+
893| u_int | unsigned int |
894+-----------+--------------------------+
895| u_long | unsigned long |
896+-----------+--------------------------+
897
d3c2e316
QY
898.. _style-exceptions:
899
d1890d04 900Exceptions
3656e87b 901""""""""""
d1890d04
QY
902
903FRR project code comes from a variety of sources, so there are some
904stylistic exceptions in place. They are organized here by branch.
905
3656e87b 906For ``master``:
d1890d04
QY
907
908BSD coding style applies to:
909
910- ``ldpd/``
911
912``babeld`` uses, approximately, the following style:
913
914- K&R style braces
915- Indents are 4 spaces
916- Function return types are on their own line
917
3656e87b 918For ``stable/3.0`` and ``stable/2.0``:
d1890d04
QY
919
920GNU coding style apply to the following parts:
921
922- ``lib/``
923- ``zebra/``
924- ``bgpd/``
925- ``ospfd/``
926- ``ospf6d/``
927- ``isisd/``
928- ``ripd/``
929- ``ripngd/``
930- ``vtysh/``
931
932BSD coding style applies to:
933
934- ``ldpd/``
935
3656e87b
QY
936
937Python Code
938^^^^^^^^^^^
939
940Format all Python code with `black <https://github.com/psf/black>`_.
941
942In a line::
943
944 python3 -m black <file.py>
945
946Run this on any Python files you modify before committing.
947
948FRR's Python code has been formatted with black version 19.10b.
949
950
6f7a9254
QY
951YANG
952^^^^
953
954FRR uses YANG to define data models for its northbound interface. YANG models
955should follow conventions used by the IETF standard models. From a practical
956standpoint, this corresponds to the output produced by the ``yanglint`` tool
957included in the ``libyang`` project, which is used by FRR to parse and validate
958YANG models. You should run the following command on all YANG documents you
959write:
960
961.. code-block:: console
962
963 yanglint -f yang <model>
964
965The output of this command should be identical to the input file. The sole
966exception to this is comments. ``yanglint`` does not support comments and will
967strip them from its output. You may include comments in your YANG documents,
968but they should be indented appropriately (use spaces). Where possible,
969comments should be eschewed in favor of a suitable ``description`` statement.
970
971In short, a diff between your input file and the output of ``yanglint`` should
972either be empty or contain only comments.
d3c2e316
QY
973
974Specific Exceptions
975^^^^^^^^^^^^^^^^^^^
976
977Most of the time checkpatch errors should be corrected. Occasionally as a group
978maintainers will decide to ignore certain stylistic issues. Usually this is
979because correcting the issue is not possible without large unrelated code
980changes. When an exception is made, if it is unlikely to show up again and
981doesn't warrant an update to checkpatch, it is documented here.
982
983+------------------------------------------+---------------------------------------------------------------+
984| Issue | Ignore Reason |
985+==========================================+===============================================================+
986| DEFPY_HIDDEN, DEFPY_ATTR: complex macros | DEF* macros cannot be wrapped in parentheses without updating |
987| should be wrapped in parentheses | all usages of the macro, which would be highly disruptive. |
988+------------------------------------------+---------------------------------------------------------------+
989
b6660a65
DL
990Types of configurables
991----------------------
992
993.. note::
994
995 This entire section essentially just argues to not make configuration
996 unnecessarily involved for the user. Rather than rules, this is more of
997 a list of conclusions intended to help make FRR usable for operators.
998
999
1000Almost every feature FRR has comes with its own set of switches and options.
1001There are several stages at which configuration can be applied. In order of
1002preference, these are:
1003
1004- at configuration/runtime, through YANG.
1005
1006 This is the preferred way for all FRR knobs. Not all daemons and features
1007 are fully YANGified yet, so in some cases new features cannot rely on a
424117e5
DL
1008 YANG interface. If a daemon already implements a YANG interface (even
1009 partial), new CLI options must be implemented through a YANG model.
1010
1011 .. warning::
1012
1013 Unlike everything else in this section being guidelines with some slack,
1014 implementing and using a YANG interface for new CLI options in (even
1015 partially!) YANGified daemons is a hard requirement.
1016
b6660a65
DL
1017
1018- at configuration/runtime, through the CLI.
1019
1020 The "good old" way for all regular configuration. More involved for users
1021 to automate *correctly* than YANG.
1022
1023- at startup, by loading additional modules.
1024
1025 If a feature introduces a dependency on additional libraries (e.g. libsnmp,
1026 rtrlib, etc.), this is the best way to encapsulate the dependency. Having
1027 a separate module allows the distribution to create a separate package
1028 with the extra dependency, so FRR can still be installed without pulling
1029 everything in.
1030
1031 A module may also be appropriate if a feature is large and reasonably well
1032 isolated. Reducing the amount of running the code is a security benefit,
1033 so even if there are no new external dependencies, modules can be useful.
1034
1035 While modules cannot currently be loaded at runtime, this is a tradeoff
1036 decision that was made to allow modules to change/extend code that is very
1037 hard to (re)adjust at runtime. If there is a case for runtime (un)loading
1038 of modules, this tradeoff can absolutely be reevaluated.
1039
1040- at startup, with command line options.
1041
1042 This interface is only appropriate for options that have an effect very
1043 early in FRR startup, i.e. before configuration is loaded. Anything that
1044 affects configuration load itself should be here, as well as options
1045 changing the environment FRR runs in.
1046
1047 If a tunable can be changed at runtime, a command line option is only
1048 acceptable if the configured value has an effect before configuration is
1049 loaded (e.g. zebra reads routes from the kernel before loading config, so
1050 the netlink buffer size is an appropriate command line option.)
1051
1052- at compile time, with ``./configure`` options.
1053
1054 This is the absolute last preference for tunables, since the distribution
1055 needs to make the decision for the user and/or the user needs to rebuild
1056 FRR in order to change the option.
1057
1058 "Good" configure options do one of three things:
1059
1060 - set distribution-specific parameters, most prominently all the path
1061 options. File system layout is a distribution/packaging choice, so the
1062 user would hopefully never need to adjust these.
1063
1064 - changing toolchain behavior, e.g. instrumentation, warnings,
1065 optimizations and sanitizers.
1066
1067 - enabling/disabling parts of the build, especially if they need
1068 additional dependencies. Being able to build only parts of FRR, or
1069 without some library, is useful. **The only effect these options should
1070 have is adding or removing files from the build result.** If a knob
1071 in this category causes the same binary to exist in different variants,
1072 it is likely implemented incorrectly!
1073
1074 .. note::
1075
1076 This last guideline is currently ignored by several configure options.
1077 ``vtysh`` in general depends on the entire list of enabled daemons,
1078 and options like ``--enable-bgp-vnc`` and ``--enable-ospfapi`` change
1079 daemons internally. Consider this more of an "ideal" than a "rule".
1080
1081
1082Whenever adding new knobs, please try reasonably hard to go up as far as
1083possible on the above list. Especially ``./configure`` flags are often enough
1084the "easy way out" but should be avoided when at all possible. To a lesser
1085degree, the same applies to command line options.
1086
1087
d1890d04 1088Compile-time conditional code
9de103f0 1089-----------------------------
d1890d04
QY
1090
1091Many users access FRR via binary packages from 3rd party sources;
1092compile-time code puts inclusion/exclusion in the hands of the package
1093maintainer. Please think very carefully before making code conditional
1094at compile time, as it increases regression testing, maintenance
1095burdens, and user confusion. In particular, please avoid gratuitous
1096``--enable-…`` switches to the configure script - in general, code
1097should be of high quality and in working condition, or it shouldn’t be
1098in FRR at all.
1099
1100When code must be compile-time conditional, try have the compiler make
1101it conditional rather than the C pre-processor so that it will still be
1102checked by the compiler, even if disabled. For example,
1103
1104::
1105
1106 if (SOME_SYMBOL)
1107 frobnicate();
1108
1109is preferred to
1110
1111::
1112
1113 #ifdef SOME_SYMBOL
1114 frobnicate ();
1115 #endif /* SOME_SYMBOL */
1116
b6820993
QY
1117Note that the former approach requires ensuring that ``SOME_SYMBOL`` will be
1118defined (watch your ``AC_DEFINE``\ s).
d1890d04
QY
1119
1120Debug-guards in code
9de103f0 1121--------------------
d1890d04 1122
b6820993
QY
1123Debugging statements are an important methodology to allow developers to fix
1124issues found in the code after it has been released. The caveat here is that
1125the developer must remember that people will be using the code at scale and in
1126ways that can be unexpected for the original implementor. As such debugs
1127**MUST** be guarded in such a way that they can be turned off. FRR has the
1128ability to turn on/off debugs from the CLI and it is expected that the
1129developer will use this convention to allow control of their debugs.
d1890d04 1130
81047bc5
DL
1131Custom syntax-like block macros
1132-------------------------------
1133
1134FRR uses some macros that behave like the ``for`` or ``if`` C keywords. These
1135macros follow these patterns:
1136
1137- loop-style macros are named ``frr_each_*`` (and ``frr_each``)
1138- single run macros are named ``frr_with_*``
1139- to avoid confusion, ``frr_with_*`` macros must always use a ``{ ... }``
1140 block even if the block only contains one statement. The ``frr_each``
1141 constructs are assumed to be well-known enough to use normal ``for`` rules.
1142- ``break``, ``return`` and ``goto`` all work correctly. For loop-style
1143 macros, ``continue`` works correctly too.
1144
1145Both the ``each`` and ``with`` keywords are inspired by other (more
1146higher-level) programming languages that provide these constructs.
1147
1148There are also some older iteration macros, e.g. ``ALL_LIST_ELEMENTS`` and
1149``FOREACH_AFI_SAFI``. These macros in some cases do **not** fulfill the above
1150pattern (e.g. ``break`` does not work in ``FOREACH_AFI_SAFI`` because it
1151expands to 2 nested loops.)
1152
9e001286
QY
1153Static Analysis and Sanitizers
1154------------------------------
81af0317
DL
1155Clang/LLVM and GCC come with a variety of tools that can be used to help find
1156bugs in FRR.
9e001286
QY
1157
1158clang-analyze
1159 This is a static analyzer that scans the source code looking for patterns
1160 that are likely to be bugs. The tool is run automatically on pull requests
1161 as part of CI and new static analysis warnings will be placed in the CI
1162 results. FRR aims for absolutely zero static analysis errors. While the
1163 project is not quite there, code that introduces new static analysis errors
1164 is very unlikely to be merged.
1165
1166AddressSanitizer
1167 This is an excellent tool that provides runtime instrumentation for
1168 detecting memory errors. As part of CI FRR is built with this
1169 instrumentation and run through a series of tests to look for any results.
1170 Testing your own code with this tool before submission is encouraged. You
1171 can enable it by passing::
d5403d4f 1172
9e001286
QY
1173 --enable-address-sanitizer
1174
1175 to ``configure``.
1176
1177ThreadSanitizer
1178 Similar to AddressSanitizer, this tool provides runtime instrumentation for
1179 detecting data races. If you are working on or around multithreaded code,
1180 extensive testing with this instrumtation enabled is *highly* recommended.
1181 You can enable it by passing::
d5403d4f 1182
9e001286
QY
1183 --enable-thread-sanitizer
1184
1185 to ``configure``.
1186
1187MemorySanitizer
1188 Similar to AddressSanitizer, this tool provides runtime instrumentation for
1189 detecting use of uninitialized heap memory. Testing your own code with this
1190 tool before submission is encouraged. You can enable it by passing::
d5403d4f 1191
9e001286
QY
1192 --enable-memory-sanitizer
1193
1194 to ``configure``.
1195
1196All of the above tools are available in the Clang/LLVM toolchain since 3.4.
1197AddressSanitizer and ThreadSanitizer are available in recent versions of GCC,
1198but are no longer actively maintained. MemorySanitizer is not available in GCC.
1199
81af0317
DL
1200.. note::
1201
1202 The different Sanitizers are mostly incompatible with each other. Please
1203 refer to GCC/LLVM documentation for details.
1204
f62de63c
DL
1205frr-format plugin
1206 This is a GCC plugin provided with FRR that does extended type checks for
1207 ``%pFX``-style printfrr extensions. To use this plugin,
1208
1209 1. install GCC plugin development files, e.g.::
1210
1211 apt-get install gcc-10-plugin-dev
1212
1213 2. **before** running ``configure``, compile the plugin with::
1214
1215 make -C tools/gcc-plugins CXX=g++-10
1216
1217 (Edit the GCC version to what you're using, it should work for GCC 9 or
1218 newer.)
1219
1220 After this, the plugin should be automatically picked up by ``configure``.
1221 The plugin does not change very frequently, so you can keep it around across
1222 work on different FRR branches. After a ``git clean -x``, the ``make`` line
1223 will need to be run again. You can also add ``--with-frr-format`` to the
1224 ``configure`` line to make sure the plugin is used, otherwise if something
1225 is not set up correctly it might be silently ignored.
1226
1227 .. warning::
1228
1229 Do **not** enable this plugin for package/release builds. It is intended
1230 for developer/debug builds only. Since it modifies the compiler, it may
1231 cause silent corruption of the executable files.
1232
1233 Using the plugin also changes the string for ``PRI[udx]64`` from the
1234 system value to ``%L[udx]`` (normally ``%ll[udx]`` or ``%l[udx]``.)
1235
9e001286
QY
1236Additionally, the FRR codebase is regularly scanned with Coverity.
1237Unfortunately Coverity does not have the ability to handle scanning pull
1238requests, but after code is merged it will send an email notifying project
1239members with Coverity access of newly introduced defects.
1240
81af0317
DL
1241Executing non-installed dynamic binaries
1242----------------------------------------
1243
1244Since FRR uses the GNU autotools build system, it inherits its shortcomings.
1245To execute a binary directly from the build tree under a wrapper like
1246`valgrind`, `gdb` or `strace`, use::
1247
1248 ./libtool --mode=execute valgrind [--valgrind-opts] zebra/zebra [--zebra-opts]
1249
1250While replacing valgrind/zebra as needed. The `libtool` script is found in
1251the root of the build directory after `./configure` has completed. Its purpose
1252is to correctly set up `LD_LIBRARY_PATH` so that libraries from the build tree
1253are used. (On some systems, `libtool` is also available from PATH, but this is
1254not always the case.)
1255
d1890d04 1256CLI changes
9de103f0 1257-----------
d1890d04 1258
b6820993
QY
1259CLI's are a complicated ugly beast. Additions or changes to the CLI should use
1260a DEFUN to encapsulate one setting as much as is possible. Additionally as new
1261DEFUN's are added to the system, documentation should be provided for the new
1262commands.
d1890d04
QY
1263
1264Backwards Compatibility
9de103f0 1265-----------------------
d1890d04 1266
b6820993
QY
1267As a general principle, changes to CLI and code in the lib/ directory should be
1268made in a backwards compatible fashion. This means that changes that are purely
1269stylistic in nature should be avoided, e.g., renaming an existing macro or
1270library function name without any functional change. When adding new parameters
1271to common functions, it is also good to consider if this too should be done in
1272a backward compatible fashion, e.g., by preserving the old form in addition to
d1890d04
QY
1273adding the new form.
1274
b6820993
QY
1275This is not to say that minor or even major functional changes to CLI and
1276common code should be avoided, but rather that the benefit gained from a change
1277should be weighed against the added cost/complexity to existing code. Also,
1278that when making such changes, it is good to preserve compatibility when
1279possible to do so without introducing maintenance overhead/cost. It is also
1280important to keep in mind, existing code includes code that may reside in
1281private repositories (and is yet to be submitted) or code that has yet to be
1282migrated from Quagga to FRR.
110bb121 1283
b6820993
QY
1284That said, compatibility measures can (and should) be removed when either:
1285
1286- they become a significant burden, e.g. when data structures change and the
1287 compatibility measure would need a complex adaptation layer or becomes
1288 flat-out impossible
1289- some measure of time (dependent on the specific case) has passed, so that
1290 the compatibility grace period is considered expired.
1291
e12ea4bb
QY
1292For CLI commands, the deprecation period is 1 year.
1293
b6820993
QY
1294In all cases, compatibility pieces should be marked with compiler/preprocessor
1295annotations to print warnings at compile time, pointing to the appropriate
1296update path. A ``-Werror`` build should fail if compatibility bits are used. To
1297avoid compilation issues in released code, such compiler/preprocessor
1298annotations must be ignored non-development branches. For example:
1299
1300.. code-block:: c
1301
e60dd6ca 1302 #if CONFDATE > 20180403
b6820993
QY
1303 CPP_NOTICE("Use of <XYZ> is deprecated, please use <ABC>")
1304 #endif
d1890d04 1305
cab3f811
LB
1306Preferably, the shell script :file:`tools/fixup-deprecated.py` will be
1307updated along with making non-backwards compatible code changes, or an
1308alternate script should be introduced, to update the code to match the
1309change. When the script is updated, there is no need to preserve the
1310deprecated code. Note that this does not apply to user interface
1311changes, just internal code, macros and libraries.
1312
d1890d04 1313Miscellaneous
9de103f0 1314-------------
d1890d04 1315
b6820993
QY
1316When in doubt, follow the guidelines in the Linux kernel style guide, or ask on
1317the development mailing list / public Slack instance.
9de103f0 1318
e9f2bc24
QY
1319JSON Output
1320^^^^^^^^^^^
1321
47563324
QY
1322* All JSON keys are to be camelCased, with no spaces
1323* Commands which output JSON should produce ``{}`` if they have nothing to
1324 display
e9f2bc24 1325
7d68dd44
MS
1326Use of const
1327^^^^^^^^^^^^
1328
1329Please consider using ``const`` when possible: it's a useful hint to
1330callers about the limits to side-effects from your apis, and it makes
1331it possible to use your apis in paths that involve ``const``
1332objects. If you encounter existing apis that *could* be ``const``,
1333consider including changes in your own pull-request.
1334
e5af0fc8
DL
1335Help with specific warnings
1336^^^^^^^^^^^^^^^^^^^^^^^^^^^
1337
1338FRR's configure script enables a whole batch of extra warnings, some of which
1339may not be obvious in how to fix. Here are some notes on specific warnings:
1340
1341* ``-Wstrict-prototypes``: you probably just forgot the ``void`` in a function
1342 declaration with no parameters, i.e. ``static void foo() {...}`` rather than
1343 ``static void foo(void) {...}``.
1344
1345 Without the ``void``, in C, it's a function with *unspecified* parameters
1346 (and varargs calling convention.) This is a notable difference to C++, where
1347 the ``void`` is optional and an empty parameter list means no parameters.
1348
f62de63c
DL
1349* ``"strict match required"`` from the frr-format plugin: check if you are
1350 using a cast in a printf parameter list. The frr-format plugin cannot
1351 access correct full type information for casts like
1352 ``printfrr(..., (uint64_t)something, ...)`` and will print incorrect
1353 warnings particularly if ``uint64_t``, ``size_t`` or ``ptrdiff_t`` are
1354 involved. The problem is *not* triggered with a variable or function return
1355 value of the exact same type (without a cast).
1356
1357 Since these cases are very rare, community consensus is to just work around
1358 the warning even though the code might be correct. If you are running into
1359 this, your options are:
1360
1361 1. try to avoid the cast altogether, maybe using a different printf format
1362 specifier (e.g. ``%lu`` instead of ``%zu`` or ``PRIu64``).
1363 2. fix the type(s) of the function/variable/struct member being printed
1364 3. create a temporary variable with the value and print that without a cast
1365 (this is the last resort and was not necessary anywhere so far.)
1366
9de103f0
QY
1367
1368.. _documentation:
1369
1370Documentation
1371=============
1372
1373FRR uses Sphinx+RST as its documentation system. The document you are currently
1374reading was generated by Sphinx from RST source in
1375:file:`doc/developer/workflow.rst`. The documentation is structured as follows:
1376
d5403d4f
QY
1377+-----------------------+-------------------------------------------+
1378| Directory | Contents |
1379+=======================+===========================================+
1380| :file:`doc/user` | User documentation; configuration guides; |
1381| | protocol overviews |
1382+-----------------------+-------------------------------------------+
1383| :file:`doc/developer` | Developer's documentation; API specs; |
1384| | datastructures; architecture overviews; |
1385| | project management procedure |
1386+-----------------------+-------------------------------------------+
1387| :file:`doc/manpages` | Source for manpages |
1388+-----------------------+-------------------------------------------+
1389| :file:`doc/figures` | Images and diagrams |
1390+-----------------------+-------------------------------------------+
1391| :file:`doc/extra` | Miscellaneous Sphinx extensions, scripts, |
1392| | customizations, etc. |
1393+-----------------------+-------------------------------------------+
1394
1395Each of these directories, with the exception of :file:`doc/figures` and
1396:file:`doc/extra`, contains a Sphinx-generated Makefile and configuration
1397script :file:`conf.py` used to set various document parameters. The makefile
1398can be used for a variety of targets; invoke `make help` in any of these
1399directories for a listing of available output formats. For convenience, there
1400is a top-level :file:`Makefile.am` that has targets for PDF and HTML
1401documentation for both developer and user documentation, respectively. That
1402makefile is also responsible for building manual pages packed with distribution
1403builds.
9de103f0
QY
1404
1405Indent and styling should follow existing conventions:
1406
1407- 3 spaces for indents under directives
1408- Cross references may contain only lowercase alphanumeric characters and
1409 hyphens ('-')
1410- Lines wrapped to 80 characters where possible
1411
1412Characters for header levels should follow Python documentation guide:
1413
1414- ``#`` with overline, for parts
1415- ``*`` with overline, for chapters
1416- ``=``, for sections
1417- ``-``, for subsections
1418- ``^``, for subsubsections
1419- ``"``, for paragraphs
1420
1421After you have made your changes, please make sure that you can invoke
1422``make latexpdf`` and ``make html`` with no warnings.
1423
1424The documentation is currently incomplete and needs love. If you find a broken
1425cross-reference, figure, dead hyperlink, style issue or any other nastiness we
1426gladly accept documentation patches.
1427
c91e9b8f
QY
1428To build the docs, please ensure you have installed a recent version of
1429`Sphinx <http://www.sphinx-doc.org/en/stable/install.html>`_. If you want to
1430build LaTeX or PDF docs, you will also need a full LaTeX distribution
1431installed.
1432
9de103f0
QY
1433Code
1434----
1435
1436FRR is a large and complex software project developed by many different people
1437over a long period of time. Without adequate documentation, it can be
1438exceedingly difficult to understand code segments, APIs and other interfaces.
1439In the interest of keeping the project healthy and maintainable, you should
1440make every effort to document your code so that other people can understand
1441what it does without needing to closely read the code itself.
1442
1443Some specific guidelines that contributors should follow are:
1444
1445- Functions exposed in header files should have descriptive comments above
1446 their signatures in the header file. At a minimum, a function comment should
1447 contain information about the return value, parameters, and a general summary
1448 of the function's purpose. Documentation on parameter values can be omitted
1449 if it is (very) obvious what they are used for.
1450
1451 Function comments must follow the style for multiline comments laid out in
1452 the kernel style guide.
1453
1454 Example:
1455
1456 .. code-block:: c
1457
1458 /*
1459 * Determines whether or not a string is cool.
1460 *
b6820993
QY
1461 * text
1462 * the string to check for coolness
1463 *
1464 * is_clccfc
1465 * whether capslock is cruise control for cool
1466 *
1467 * Returns:
1468 * 7 if the text is cool, 0 otherwise
9de103f0
QY
1469 */
1470 int check_coolness(const char *text, bool is_clccfc);
1471
b6820993
QY
1472 Function comments should make it clear what parameters and return values are
1473 used for.
9de103f0
QY
1474
1475- Static functions should have descriptive comments in the same form as above
1476 if what they do is not immediately obvious. Use good engineering judgement
1477 when deciding whether a comment is necessary. If you are unsure, document
1478 your code.
1479- Global variables, static or not, should have a comment describing their use.
1480- **For new code in lib/, these guidelines are hard requirements.**
1481
1482If you make significant changes to portions of the codebase covered in the
1483Developer's Manual, add a major subsystem or feature, or gain arcane mastery of
1484some undocumented or poorly documented part of the codebase, please document
1485your work so others can benefit. If you add a major feature or introduce a new
1486API, please document the architecture and API to the best of your abilities in
1487the Developer's Manual, using good judgement when choosing where to place it.
1488
1489Finally, if you come across some code that is undocumented and feel like
1490going above and beyond, document it! We absolutely appreciate and accept
1491patches that document previously undocumented code.
1492
1493User
1494----
1495
1496If you are contributing code that adds significant user-visible functionality
1497please document how to use it in :file:`doc/user`. Use good judgement when
1498choosing where to place documentation. For example, instructions on how to use
1499your implementation of a new BGP draft should go in the BGP chapter instead of
1500being its own chapter. If you are adding a new protocol daemon, please create a
1501new chapter.
1502
d5403d4f
QY
1503FRR Specific Markup
1504-------------------
1505
1506FRR has some customizations applied to the Sphinx markup that go a long way
1507towards making documentation easier to use, write and maintain.
1508
1509CLI Commands
1510^^^^^^^^^^^^
1511
e1ac6ff4
QY
1512When documenting CLI please use the ``.. clicmd::`` directive. This directive
1513will format the command and generate index entries automatically. For example,
1514the command :clicmd:`show pony` would be documented as follows:
9de103f0
QY
1515
1516.. code-block:: rest
1517
9de103f0
QY
1518 .. clicmd:: show pony
1519
1520 Prints an ASCII pony. Example output:::
1521
1522 >>\.
1523 /_ )`.
1524 / _)`^)`. _.---. _
1525 (_,' \ `^-)"" `.\
1526 | | \
1527 \ / |
1528 / \ /.___.'\ (\ (_
1529 < ,"|| \ |`. \`-'
1530 \\ () )| )/
1531 hjw |_>|> /_] //
1532 /_] /_]
1533
e1ac6ff4 1534
9de103f0
QY
1535When documented this way, CLI commands can be cross referenced with the
1536``:clicmd:`` inline markup like so:
1537
1538.. code-block:: rest
1539
1540 :clicmd:`show pony`
1541
1542This is very helpful for users who want to quickly remind themselves what a
1543particular command does.
1544
e1ac6ff4
QY
1545When documenting a cli that has a ``no`` form, please do not include the ``no``
1546form. I.e. ``no show pony`` would not be documented anywhere. Since most
1547commands have ``no`` forms, users should be able to infer these or get help
1548from vtysh's completions.
1549
1550When documenting commands that have lots of possible variants, just document
1551the single command in summary rather than enumerating each possible variant.
1552E.g. for ``show pony [foo|bar]``, do not:
1553
1554.. code-block:: rest
1555
1556 .. clicmd:: show pony
1557 .. clicmd:: show pony foo
1558 .. clicmd:: show pony bar
1559
1560Do:
1561
1562.. code-block:: rest
1563
1564 .. clicmd:: show pony [foo|bar]
1565
41cb383f 1566
d5403d4f
QY
1567Configuration Snippets
1568^^^^^^^^^^^^^^^^^^^^^^
1569
1570When putting blocks of example configuration please use the
1571``.. code-block::`` directive and specify ``frr`` as the highlighting language,
1572as in the following example. This will tell Sphinx to use a custom Pygments
1573lexer to highlight FRR configuration syntax.
1574
1575.. code-block:: rest
1576
1577 .. code-block:: frr
1578
1579 !
1580 ! Example configuration file.
1581 !
1582 log file /tmp/log.log
1583 service integrated-vtysh-config
1584 !
1585 ip route 1.2.3.0/24 reject
1586 ipv6 route de:ea:db:ee:ff::/64 reject
1587 !
1588
1589
9de103f0
QY
1590.. _GitHub: https://github.com/frrouting/frr
1591.. _GitHub issues: https://github.com/frrouting/frr/issues
115e70a1
PZ
1592
1593.. rubric:: Footnotes
1594
1595.. [#tool_style_conflicts] For example, lines over 80 characters are allowed
1596 for text strings to make it possible to search the code for them: please
1597 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>`_
1598 and `Issue #1794 <https://github.com/FRRouting/frr/issues/1794>`_.