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