xref: /dpdk/doc/guides/contributing/coding_style.rst (revision 904ffb2e96f502979da94d9fdcd3cadcd67af464)
177c79de0SHemant Agrawal..  SPDX-License-Identifier: BSD-3-Clause
277c79de0SHemant Agrawal    Copyright 2018 The DPDK contributors
377c79de0SHemant Agrawal
46bdae907SThomas Monjalon.. _coding_style:
56bdae907SThomas Monjalon
66bdae907SThomas MonjalonDPDK Coding Style
76bdae907SThomas Monjalon=================
86bdae907SThomas Monjalon
96bdae907SThomas MonjalonDescription
106bdae907SThomas Monjalon-----------
116bdae907SThomas Monjalon
126bdae907SThomas MonjalonThis document specifies the preferred style for source files in the DPDK source tree.
136bdae907SThomas MonjalonIt is based on the Linux Kernel coding guidelines and the FreeBSD 7.2 Kernel Developer's Manual (see man style(9)), but was heavily modified for the needs of the DPDK.
146bdae907SThomas Monjalon
156bdae907SThomas MonjalonGeneral Guidelines
166bdae907SThomas Monjalon------------------
176bdae907SThomas Monjalon
186bdae907SThomas MonjalonThe rules and guidelines given in this document cannot cover every situation, so the following general guidelines should be used as a fallback:
196bdae907SThomas Monjalon
206bdae907SThomas Monjalon* The code style should be consistent within each individual file.
216bdae907SThomas Monjalon* In the case of creating new files, the style should be consistent within each file in a given directory or module.
226bdae907SThomas Monjalon* The primary reason for coding standards is to increase code readability and comprehensibility, therefore always use whatever option will make the code easiest to read.
236bdae907SThomas Monjalon
246bdae907SThomas MonjalonLine length is recommended to be not more than 80 characters, including comments.
256bdae907SThomas Monjalon[Tab stop size should be assumed to be 8-characters wide].
266bdae907SThomas Monjalon
276bdae907SThomas Monjalon.. note::
286bdae907SThomas Monjalon
296bdae907SThomas Monjalon	The above is recommendation, and not a hard limit.
306bdae907SThomas Monjalon	However, it is expected that the recommendations should be followed in all but the rarest situations.
316bdae907SThomas Monjalon
326bdae907SThomas MonjalonC Comment Style
336bdae907SThomas Monjalon---------------
346bdae907SThomas Monjalon
356bdae907SThomas MonjalonUsual Comments
366bdae907SThomas Monjalon~~~~~~~~~~~~~~
376bdae907SThomas Monjalon
386bdae907SThomas MonjalonThese comments should be used in normal cases.
396bdae907SThomas MonjalonTo document a public API, a doxygen-like format must be used: refer to :ref:`doxygen_guidelines`.
406bdae907SThomas Monjalon
416bdae907SThomas Monjalon.. code-block:: c
426bdae907SThomas Monjalon
436bdae907SThomas Monjalon /*
446bdae907SThomas Monjalon  * VERY important single-line comments look like this.
456bdae907SThomas Monjalon  */
466bdae907SThomas Monjalon
476bdae907SThomas Monjalon /* Most single-line comments look like this. */
486bdae907SThomas Monjalon
496bdae907SThomas Monjalon /*
506bdae907SThomas Monjalon  * Multi-line comments look like this.  Make them real sentences. Fill
516bdae907SThomas Monjalon  * them so they look like real paragraphs.
526bdae907SThomas Monjalon  */
536bdae907SThomas Monjalon
546bdae907SThomas MonjalonLicense Header
556bdae907SThomas Monjalon~~~~~~~~~~~~~~
566bdae907SThomas Monjalon
576bdae907SThomas MonjalonEach file should begin with a special comment containing the appropriate copyright and license for the file.
586bdae907SThomas MonjalonGenerally this is the BSD License, except for code for Linux Kernel modules.
596bdae907SThomas MonjalonAfter any copyright header, a blank line should be left before any other contents, e.g. include statements in a C file.
606bdae907SThomas Monjalon
616bdae907SThomas MonjalonC Preprocessor Directives
626bdae907SThomas Monjalon-------------------------
636bdae907SThomas Monjalon
646bdae907SThomas MonjalonHeader Includes
656bdae907SThomas Monjalon~~~~~~~~~~~~~~~
666bdae907SThomas Monjalon
676bdae907SThomas MonjalonIn DPDK sources, the include files should be ordered as following:
686bdae907SThomas Monjalon
696bdae907SThomas Monjalon#. libc includes (system includes first)
706bdae907SThomas Monjalon#. DPDK EAL includes
716bdae907SThomas Monjalon#. DPDK misc libraries includes
726bdae907SThomas Monjalon#. application-specific includes
736bdae907SThomas Monjalon
746bdae907SThomas MonjalonInclude files from the local application directory are included using quotes, while includes from other paths are included using angle brackets: "<>".
756bdae907SThomas Monjalon
766bdae907SThomas MonjalonExample:
776bdae907SThomas Monjalon
786bdae907SThomas Monjalon.. code-block:: c
796bdae907SThomas Monjalon
806bdae907SThomas Monjalon #include <stdio.h>
816bdae907SThomas Monjalon #include <stdlib.h>
826bdae907SThomas Monjalon
836bdae907SThomas Monjalon #include <rte_eal.h>
846bdae907SThomas Monjalon
856bdae907SThomas Monjalon #include <rte_ring.h>
866bdae907SThomas Monjalon #include <rte_mempool.h>
876bdae907SThomas Monjalon
886bdae907SThomas Monjalon #include "application.h"
896bdae907SThomas Monjalon
906bdae907SThomas MonjalonHeader File Guards
916bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~~
926bdae907SThomas Monjalon
936bdae907SThomas MonjalonHeaders should be protected against multiple inclusion with the usual:
946bdae907SThomas Monjalon
956bdae907SThomas Monjalon.. code-block:: c
966bdae907SThomas Monjalon
976bdae907SThomas Monjalon   #ifndef _FILE_H_
986bdae907SThomas Monjalon   #define _FILE_H_
996bdae907SThomas Monjalon
1006bdae907SThomas Monjalon   /* Code */
1016bdae907SThomas Monjalon
1026bdae907SThomas Monjalon   #endif /* _FILE_H_ */
1036bdae907SThomas Monjalon
1046bdae907SThomas Monjalon
1056bdae907SThomas MonjalonMacros
1066bdae907SThomas Monjalon~~~~~~
1076bdae907SThomas Monjalon
1086bdae907SThomas MonjalonDo not ``#define`` or declare names except with the standard DPDK prefix: ``RTE_``.
1096bdae907SThomas MonjalonThis is to ensure there are no collisions with definitions in the application itself.
1106bdae907SThomas Monjalon
1116bdae907SThomas MonjalonThe names of "unsafe" macros (ones that have side effects), and the names of macros for manifest constants, are all in uppercase.
1126bdae907SThomas Monjalon
1136bdae907SThomas MonjalonThe expansions of expression-like macros are either a single token or have outer parentheses.
1146bdae907SThomas MonjalonIf a macro is an inline expansion of a function, the function name is all in lowercase and the macro has the same name all in uppercase.
1156bdae907SThomas MonjalonIf the macro encapsulates a compound statement, enclose it in a do-while loop, so that it can be used safely in if statements.
1166bdae907SThomas MonjalonAny final statement-terminating semicolon should be supplied by the macro invocation rather than the macro, to make parsing easier for pretty-printers and editors.
1176bdae907SThomas Monjalon
1186bdae907SThomas MonjalonFor example:
1196bdae907SThomas Monjalon
1206bdae907SThomas Monjalon.. code-block:: c
1216bdae907SThomas Monjalon
1226bdae907SThomas Monjalon #define MACRO(x, y) do {                                        \
1236bdae907SThomas Monjalon         variable = (x) + (y);                                   \
1246bdae907SThomas Monjalon         (y) += 2;                                               \
1256bdae907SThomas Monjalon } while(0)
1266bdae907SThomas Monjalon
1276bdae907SThomas Monjalon.. note::
1286bdae907SThomas Monjalon
1296bdae907SThomas Monjalon Wherever possible, enums and inline functions should be preferred to macros, since they provide additional degrees of type-safety and can allow compilers to emit extra warnings about unsafe code.
1306bdae907SThomas Monjalon
1316bdae907SThomas MonjalonConditional Compilation
1326bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~~~~~~~
1336bdae907SThomas Monjalon
1346bdae907SThomas Monjalon* When code is conditionally compiled using ``#ifdef`` or ``#if``, a comment may be added following the matching
1356bdae907SThomas Monjalon  ``#endif`` or ``#else`` to permit the reader to easily discern where conditionally compiled code regions end.
1366bdae907SThomas Monjalon* This comment should be used only for (subjectively) long regions, regions greater than 20 lines, or where a series of nested ``#ifdef``'s may be confusing to the reader.
1376bdae907SThomas Monjalon  Exceptions may be made for cases where code is conditionally not compiled for the purposes of lint(1), or other tools, even though the uncompiled region may be small.
1386bdae907SThomas Monjalon* The comment should be separated from the ``#endif`` or ``#else`` by a single space.
1396bdae907SThomas Monjalon* For short conditionally compiled regions, a closing comment should not be used.
1406bdae907SThomas Monjalon* The comment for ``#endif`` should match the expression used in the corresponding ``#if`` or ``#ifdef``.
1416bdae907SThomas Monjalon* The comment for ``#else`` and ``#elif`` should match the inverse of the expression(s) used in the preceding ``#if`` and/or ``#elif`` statements.
1426bdae907SThomas Monjalon* In the comments, the subexpression ``defined(FOO)`` is abbreviated as "FOO".
1436bdae907SThomas Monjalon  For the purposes of comments, ``#ifndef FOO`` is treated as ``#if !defined(FOO)``.
1446bdae907SThomas Monjalon
1456bdae907SThomas Monjalon.. code-block:: c
1466bdae907SThomas Monjalon
1476bdae907SThomas Monjalon #ifdef KTRACE
1486bdae907SThomas Monjalon #include <sys/ktrace.h>
1496bdae907SThomas Monjalon #endif
1506bdae907SThomas Monjalon
1516bdae907SThomas Monjalon #ifdef COMPAT_43
1526bdae907SThomas Monjalon /* A large region here, or other conditional code. */
1536bdae907SThomas Monjalon #else /* !COMPAT_43 */
1546bdae907SThomas Monjalon /* Or here. */
1556bdae907SThomas Monjalon #endif /* COMPAT_43 */
1566bdae907SThomas Monjalon
1576bdae907SThomas Monjalon #ifndef COMPAT_43
1586bdae907SThomas Monjalon /* Yet another large region here, or other conditional code. */
1596bdae907SThomas Monjalon #else /* COMPAT_43 */
1606bdae907SThomas Monjalon /* Or here. */
1616bdae907SThomas Monjalon #endif /* !COMPAT_43 */
1626bdae907SThomas Monjalon
1636bdae907SThomas Monjalon.. note::
1646bdae907SThomas Monjalon
1656bdae907SThomas Monjalon Conditional compilation should be used only when absolutely necessary, as it increases the number of target binaries that need to be built and tested.
1666bdae907SThomas Monjalon
1676bdae907SThomas MonjalonC Types
1686bdae907SThomas Monjalon-------
1696bdae907SThomas Monjalon
1706bdae907SThomas MonjalonIntegers
1716bdae907SThomas Monjalon~~~~~~~~
1726bdae907SThomas Monjalon
1736bdae907SThomas MonjalonFor fixed/minimum-size integer values, the project uses the form uintXX_t (from stdint.h) instead of older BSD-style integer identifiers of the form u_intXX_t.
1746bdae907SThomas Monjalon
1756bdae907SThomas MonjalonEnumerations
1766bdae907SThomas Monjalon~~~~~~~~~~~~
1776bdae907SThomas Monjalon
1786bdae907SThomas Monjalon* Enumeration values are all uppercase.
1796bdae907SThomas Monjalon
1806bdae907SThomas Monjalon.. code-block:: c
1816bdae907SThomas Monjalon
1826bdae907SThomas Monjalon enum enumtype { ONE, TWO } et;
1836bdae907SThomas Monjalon
1846bdae907SThomas Monjalon* Enum types should be used in preference to macros #defining a set of (sequential) values.
1856bdae907SThomas Monjalon* Enum types should be prefixed with ``rte_`` and the elements by a suitable prefix [generally starting ``RTE_<enum>_`` - where <enum> is a shortname for the enum type] to avoid namespace collisions.
1866bdae907SThomas Monjalon
1876bdae907SThomas MonjalonBitfields
1886bdae907SThomas Monjalon~~~~~~~~~
1896bdae907SThomas Monjalon
1906bdae907SThomas MonjalonThe developer should group bitfields that are included in the same integer, as follows:
1916bdae907SThomas Monjalon
1926bdae907SThomas Monjalon.. code-block:: c
1936bdae907SThomas Monjalon
1946bdae907SThomas Monjalon struct grehdr {
1956bdae907SThomas Monjalon   uint16_t rec:3,
1966bdae907SThomas Monjalon       srr:1,
1976bdae907SThomas Monjalon       seq:1,
1986bdae907SThomas Monjalon       key:1,
1996bdae907SThomas Monjalon       routing:1,
2006bdae907SThomas Monjalon       csum:1,
2016bdae907SThomas Monjalon       version:3,
2026bdae907SThomas Monjalon       reserved:4,
2036bdae907SThomas Monjalon       ack:1;
2046bdae907SThomas Monjalon /* ... */
2056bdae907SThomas Monjalon }
2066bdae907SThomas Monjalon
2076bdae907SThomas MonjalonVariable Declarations
2086bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~~~~~
2096bdae907SThomas Monjalon
2106bdae907SThomas MonjalonIn declarations, do not put any whitespace between asterisks and adjacent tokens, except for tokens that are identifiers related to types.
2116bdae907SThomas Monjalon(These identifiers are the names of basic types, type qualifiers, and typedef-names other than the one being declared.)
2126bdae907SThomas MonjalonSeparate these identifiers from asterisks using a single space.
2136bdae907SThomas Monjalon
2146bdae907SThomas MonjalonFor example:
2156bdae907SThomas Monjalon
2166bdae907SThomas Monjalon.. code-block:: c
2176bdae907SThomas Monjalon
2186bdae907SThomas Monjalon   int *x;         /* no space after asterisk */
2196bdae907SThomas Monjalon   int * const x;  /* space after asterisk when using a type qualifier */
2206bdae907SThomas Monjalon
2216bdae907SThomas Monjalon* All externally-visible variables should have an ``rte_`` prefix in the name to avoid namespace collisions.
2226bdae907SThomas Monjalon* Do not use uppercase letters - either in the form of ALL_UPPERCASE, or CamelCase - in variable names.
2236bdae907SThomas Monjalon  Lower-case letters and underscores only.
2246bdae907SThomas Monjalon
2256bdae907SThomas MonjalonStructure Declarations
2266bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~~~~~~
2276bdae907SThomas Monjalon
2286bdae907SThomas Monjalon* In general, when declaring variables in new structures, declare them sorted by use, then by size (largest to smallest), and then in alphabetical order.
2296bdae907SThomas Monjalon  Sorting by use means that commonly used variables are used together and that the structure layout makes logical sense.
2306bdae907SThomas Monjalon  Ordering by size then ensures that as little padding is added to the structure as possible.
2316bdae907SThomas Monjalon* For existing structures, additions to structures should be added to the end so for backward compatibility reasons.
2326bdae907SThomas Monjalon* Each structure element gets its own line.
2336bdae907SThomas Monjalon* Try to make the structure readable by aligning the member names using spaces as shown below.
2346bdae907SThomas Monjalon* Names following extremely long types, which therefore cannot be easily aligned with the rest, should be separated by a single space.
2356bdae907SThomas Monjalon
2366bdae907SThomas Monjalon.. code-block:: c
2376bdae907SThomas Monjalon
2386bdae907SThomas Monjalon struct foo {
2396bdae907SThomas Monjalon         struct foo      *next;          /* List of active foo. */
2406bdae907SThomas Monjalon         struct mumble   amumble;        /* Comment for mumble. */
2416bdae907SThomas Monjalon         int             bar;            /* Try to align the comments. */
2426bdae907SThomas Monjalon         struct verylongtypename *baz;   /* Won't fit with other members */
2436bdae907SThomas Monjalon };
2446bdae907SThomas Monjalon
2456bdae907SThomas Monjalon
2466bdae907SThomas Monjalon* Major structures should be declared at the top of the file in which they are used, or in separate header files if they are used in multiple source files.
2476bdae907SThomas Monjalon* Use of the structures should be by separate variable declarations and those declarations must be extern if they are declared in a header file.
2486bdae907SThomas Monjalon* Externally visible structure definitions should have the structure name prefixed by ``rte_`` to avoid namespace collisions.
2496bdae907SThomas Monjalon
250*904ffb2eSMarko Kovacevic.. note::
251*904ffb2eSMarko Kovacevic
252*904ffb2eSMarko Kovacevic    Uses of ``bool`` in structures are not preferred as is wastes space and
253*904ffb2eSMarko Kovacevic    it's also not clear as to what type size the bool is. A preferred use of
254*904ffb2eSMarko Kovacevic    ``bool`` is mainly as a return type from functions that return true/false,
255*904ffb2eSMarko Kovacevic    and maybe local variable functions.
256*904ffb2eSMarko Kovacevic
257*904ffb2eSMarko Kovacevic    Ref: `LKML <https://lkml.org/lkml/2017/11/21/384>`_
258*904ffb2eSMarko Kovacevic
2596bdae907SThomas MonjalonQueues
2606bdae907SThomas Monjalon~~~~~~
2616bdae907SThomas Monjalon
2626bdae907SThomas MonjalonUse queue(3) macros rather than rolling your own lists, whenever possible.
2636bdae907SThomas MonjalonThus, the previous example would be better written:
2646bdae907SThomas Monjalon
2656bdae907SThomas Monjalon.. code-block:: c
2666bdae907SThomas Monjalon
2676bdae907SThomas Monjalon #include <sys/queue.h>
2686bdae907SThomas Monjalon
2696bdae907SThomas Monjalon struct foo {
2706bdae907SThomas Monjalon         LIST_ENTRY(foo) link;      /* Use queue macros for foo lists. */
2716bdae907SThomas Monjalon         struct mumble   amumble;   /* Comment for mumble. */
2726bdae907SThomas Monjalon         int             bar;       /* Try to align the comments. */
2736bdae907SThomas Monjalon         struct verylongtypename *baz;   /* Won't fit with other members */
2746bdae907SThomas Monjalon };
2756bdae907SThomas Monjalon LIST_HEAD(, foo) foohead;          /* Head of global foo list. */
2766bdae907SThomas Monjalon
2776bdae907SThomas Monjalon
2786bdae907SThomas MonjalonDPDK also provides an optimized way to store elements in lockless rings.
2796bdae907SThomas MonjalonThis should be used in all data-path code, when there are several consumer and/or producers to avoid locking for concurrent access.
2806bdae907SThomas Monjalon
2816bdae907SThomas MonjalonTypedefs
2826bdae907SThomas Monjalon~~~~~~~~
2836bdae907SThomas Monjalon
2846bdae907SThomas MonjalonAvoid using typedefs for structure types.
2856bdae907SThomas Monjalon
2866bdae907SThomas MonjalonFor example, use:
2876bdae907SThomas Monjalon
2886bdae907SThomas Monjalon.. code-block:: c
2896bdae907SThomas Monjalon
2906bdae907SThomas Monjalon struct my_struct_type {
2916bdae907SThomas Monjalon /* ... */
2926bdae907SThomas Monjalon };
2936bdae907SThomas Monjalon
2946bdae907SThomas Monjalon struct my_struct_type my_var;
2956bdae907SThomas Monjalon
2966bdae907SThomas Monjalon
2976bdae907SThomas Monjalonrather than:
2986bdae907SThomas Monjalon
2996bdae907SThomas Monjalon.. code-block:: c
3006bdae907SThomas Monjalon
3016bdae907SThomas Monjalon typedef struct my_struct_type {
3026bdae907SThomas Monjalon /* ... */
3036bdae907SThomas Monjalon } my_struct_type;
3046bdae907SThomas Monjalon
3056bdae907SThomas Monjalon my_struct_type my_var
3066bdae907SThomas Monjalon
3076bdae907SThomas Monjalon
3086bdae907SThomas MonjalonTypedefs are problematic because they do not properly hide their underlying type;
3096bdae907SThomas Monjalonfor example, you need to know if the typedef is the structure itself, as shown above, or a pointer to the structure.
3106bdae907SThomas MonjalonIn addition, they must be declared exactly once, whereas an incomplete structure type can be mentioned as many times as necessary.
3116bdae907SThomas MonjalonTypedefs are difficult to use in stand-alone header files.
3126bdae907SThomas MonjalonThe header that defines the typedef must be included before the header that uses it, or by the header that uses it (which causes namespace pollution),
3136bdae907SThomas Monjalonor there must be a back-door mechanism for obtaining the typedef.
3146bdae907SThomas Monjalon
3156bdae907SThomas MonjalonNote that #defines used instead of typedefs also are problematic (since they do not propagate the pointer type correctly due to direct text replacement).
3166bdae907SThomas MonjalonFor example, ``#define pint int *`` does not work as expected, while ``typedef int *pint`` does work.
3176bdae907SThomas MonjalonAs stated when discussing macros, typedefs should be preferred to macros in cases like this.
3186bdae907SThomas Monjalon
3196bdae907SThomas MonjalonWhen convention requires a typedef; make its name match the struct tag.
3206bdae907SThomas MonjalonAvoid typedefs ending in ``_t``, except as specified in Standard C or by POSIX.
3216bdae907SThomas Monjalon
3226bdae907SThomas Monjalon.. note::
3236bdae907SThomas Monjalon
3246bdae907SThomas Monjalon	It is recommended to use typedefs to define function pointer types, for reasons of code readability.
3256bdae907SThomas Monjalon	This is especially true when the function type is used as a parameter to another function.
3266bdae907SThomas Monjalon
3276bdae907SThomas MonjalonFor example:
3286bdae907SThomas Monjalon
3296bdae907SThomas Monjalon.. code-block:: c
3306bdae907SThomas Monjalon
3316bdae907SThomas Monjalon	/**
3326bdae907SThomas Monjalon	 * Definition of a remote launch function.
3336bdae907SThomas Monjalon	 */
3346bdae907SThomas Monjalon	typedef int (lcore_function_t)(void *);
3356bdae907SThomas Monjalon
3366bdae907SThomas Monjalon	/* launch a function of lcore_function_t type */
3376bdae907SThomas Monjalon	int rte_eal_remote_launch(lcore_function_t *f, void *arg, unsigned slave_id);
3386bdae907SThomas Monjalon
3396bdae907SThomas Monjalon
3406bdae907SThomas MonjalonC Indentation
3416bdae907SThomas Monjalon-------------
3426bdae907SThomas Monjalon
3436bdae907SThomas MonjalonGeneral
3446bdae907SThomas Monjalon~~~~~~~
3456bdae907SThomas Monjalon
3466bdae907SThomas Monjalon* Indentation is a hard tab, that is, a tab character, not a sequence of spaces,
3476bdae907SThomas Monjalon
3486bdae907SThomas Monjalon.. note::
3496bdae907SThomas Monjalon
3506bdae907SThomas Monjalon	Global whitespace rule in DPDK, use tabs for indentation, spaces for alignment.
3516bdae907SThomas Monjalon
3526bdae907SThomas Monjalon* Do not put any spaces before a tab for indentation.
3536bdae907SThomas Monjalon* If you have to wrap a long statement, put the operator at the end of the line, and indent again.
3546bdae907SThomas Monjalon* For control statements (if, while, etc.), continuation it is recommended that the next line be indented by two tabs, rather than one,
3556bdae907SThomas Monjalon  to prevent confusion as to whether the second line of the control statement forms part of the statement body or not.
3566bdae907SThomas Monjalon  Alternatively, the line continuation may use additional spaces to line up to an appropriately point on the preceding line, for example, to align to an opening brace.
3576bdae907SThomas Monjalon
3586bdae907SThomas Monjalon.. note::
3596bdae907SThomas Monjalon
3606bdae907SThomas Monjalon	As with all style guidelines, code should match style already in use in an existing file.
3616bdae907SThomas Monjalon
3626bdae907SThomas Monjalon.. code-block:: c
3636bdae907SThomas Monjalon
3646bdae907SThomas Monjalon while (really_long_variable_name_1 == really_long_variable_name_2 &&
3656bdae907SThomas Monjalon     var3 == var4){  /* confusing to read as */
3666bdae907SThomas Monjalon     x = y + z;      /* control stmt body lines up with second line of */
3676bdae907SThomas Monjalon     a = b + c;      /* control statement itself if single indent used */
3686bdae907SThomas Monjalon }
3696bdae907SThomas Monjalon
3706bdae907SThomas Monjalon if (really_long_variable_name_1 == really_long_variable_name_2 &&
3716bdae907SThomas Monjalon         var3 == var4){  /* two tabs used */
3726bdae907SThomas Monjalon     x = y + z;          /* statement body no longer lines up */
3736bdae907SThomas Monjalon     a = b + c;
3746bdae907SThomas Monjalon }
3756bdae907SThomas Monjalon
3766bdae907SThomas Monjalon z = a + really + long + statement + that + needs +
3776bdae907SThomas Monjalon         two + lines + gets + indented + on + the +
3786bdae907SThomas Monjalon         second + and + subsequent + lines;
3796bdae907SThomas Monjalon
3806bdae907SThomas Monjalon
3816bdae907SThomas Monjalon* Do not add whitespace at the end of a line.
3826bdae907SThomas Monjalon
3836bdae907SThomas Monjalon* Do not add whitespace or a blank line at the end of a file.
3846bdae907SThomas Monjalon
3856bdae907SThomas Monjalon
3866bdae907SThomas MonjalonControl Statements and Loops
3876bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3886bdae907SThomas Monjalon
3896bdae907SThomas Monjalon* Include a space after keywords (if, while, for, return, switch).
3906bdae907SThomas Monjalon* Do not use braces (``{`` and ``}``) for control statements with zero or just a single statement, unless that statement is more than a single line in which case the braces are permitted.
3916bdae907SThomas Monjalon
3926bdae907SThomas Monjalon.. code-block:: c
3936bdae907SThomas Monjalon
3946bdae907SThomas Monjalon for (p = buf; *p != '\0'; ++p)
3956bdae907SThomas Monjalon         ;       /* nothing */
3966bdae907SThomas Monjalon for (;;)
3976bdae907SThomas Monjalon         stmt;
3986bdae907SThomas Monjalon for (;;) {
3996bdae907SThomas Monjalon         z = a + really + long + statement + that + needs +
4006bdae907SThomas Monjalon                 two + lines + gets + indented + on + the +
4016bdae907SThomas Monjalon                 second + and + subsequent + lines;
4026bdae907SThomas Monjalon }
4036bdae907SThomas Monjalon for (;;) {
4046bdae907SThomas Monjalon         if (cond)
4056bdae907SThomas Monjalon                 stmt;
4066bdae907SThomas Monjalon }
4076bdae907SThomas Monjalon if (val != NULL)
4086bdae907SThomas Monjalon         val = realloc(val, newsize);
4096bdae907SThomas Monjalon
4106bdae907SThomas Monjalon
4116bdae907SThomas Monjalon* Parts of a for loop may be left empty.
4126bdae907SThomas Monjalon
4136bdae907SThomas Monjalon.. code-block:: c
4146bdae907SThomas Monjalon
4156bdae907SThomas Monjalon for (; cnt < 15; cnt++) {
4166bdae907SThomas Monjalon         stmt1;
4176bdae907SThomas Monjalon         stmt2;
4186bdae907SThomas Monjalon }
4196bdae907SThomas Monjalon
4206bdae907SThomas Monjalon* Closing and opening braces go on the same line as the else keyword.
4216bdae907SThomas Monjalon* Braces that are not necessary should be left out.
4226bdae907SThomas Monjalon
4236bdae907SThomas Monjalon.. code-block:: c
4246bdae907SThomas Monjalon
4256bdae907SThomas Monjalon if (test)
4266bdae907SThomas Monjalon         stmt;
4276bdae907SThomas Monjalon else if (bar) {
4286bdae907SThomas Monjalon         stmt;
4296bdae907SThomas Monjalon         stmt;
4306bdae907SThomas Monjalon } else
4316bdae907SThomas Monjalon         stmt;
4326bdae907SThomas Monjalon
4336bdae907SThomas Monjalon
4346bdae907SThomas MonjalonFunction Calls
4356bdae907SThomas Monjalon~~~~~~~~~~~~~~
4366bdae907SThomas Monjalon
4376bdae907SThomas Monjalon* Do not use spaces after function names.
4386bdae907SThomas Monjalon* Commas should have a space after them.
4396bdae907SThomas Monjalon* No spaces after ``(`` or ``[`` or preceding the ``]`` or ``)`` characters.
4406bdae907SThomas Monjalon
4416bdae907SThomas Monjalon.. code-block:: c
4426bdae907SThomas Monjalon
4436bdae907SThomas Monjalon	error = function(a1, a2);
4446bdae907SThomas Monjalon	if (error != 0)
4456bdae907SThomas Monjalon		exit(error);
4466bdae907SThomas Monjalon
4476bdae907SThomas Monjalon
4486bdae907SThomas MonjalonOperators
4496bdae907SThomas Monjalon~~~~~~~~~
4506bdae907SThomas Monjalon
4516bdae907SThomas Monjalon* Unary operators do not require spaces, binary operators do.
4526bdae907SThomas Monjalon* Do not use parentheses unless they are required for precedence or unless the statement is confusing without them.
4536bdae907SThomas Monjalon  However, remember that other people may be more easily confused than you.
4546bdae907SThomas Monjalon
4556bdae907SThomas MonjalonExit
4566bdae907SThomas Monjalon~~~~
4576bdae907SThomas Monjalon
4586bdae907SThomas MonjalonExits should be 0 on success, or 1 on failure.
4596bdae907SThomas Monjalon
4606bdae907SThomas Monjalon.. code-block:: c
4616bdae907SThomas Monjalon
4626bdae907SThomas Monjalon         exit(0);        /*
4636bdae907SThomas Monjalon                          * Avoid obvious comments such as
4646bdae907SThomas Monjalon                          * "Exit 0 on success."
4656bdae907SThomas Monjalon                          */
4666bdae907SThomas Monjalon }
4676bdae907SThomas Monjalon
4686bdae907SThomas MonjalonLocal Variables
4696bdae907SThomas Monjalon~~~~~~~~~~~~~~~
4706bdae907SThomas Monjalon
4716bdae907SThomas Monjalon* Variables should be declared at the start of a block of code rather than in the middle.
4726bdae907SThomas Monjalon  The exception to this is when the variable is ``const`` in which case the declaration must be at the point of first use/assignment.
4736bdae907SThomas Monjalon* When declaring variables in functions, multiple variables per line are OK.
4746bdae907SThomas Monjalon  However, if multiple declarations would cause the line to exceed a reasonable line length, begin a new set of declarations on the next line rather than using a line continuation.
4756bdae907SThomas Monjalon* Be careful to not obfuscate the code by initializing variables in the declarations, only the last variable on a line should be initialized.
4762fe68f32SJohn McNamara  If multiple variables are to be initialized when defined, put one per line.
4776bdae907SThomas Monjalon* Do not use function calls in initializers, except for ``const`` variables.
4786bdae907SThomas Monjalon
4796bdae907SThomas Monjalon.. code-block:: c
4806bdae907SThomas Monjalon
4816bdae907SThomas Monjalon int i = 0, j = 0, k = 0;  /* bad, too many initializer */
4826bdae907SThomas Monjalon
4836bdae907SThomas Monjalon char a = 0;        /* OK, one variable per line with initializer */
4846bdae907SThomas Monjalon char b = 0;
4856bdae907SThomas Monjalon
4866bdae907SThomas Monjalon float x, y = 0.0;  /* OK, only last variable has initializer */
4876bdae907SThomas Monjalon
4886bdae907SThomas Monjalon
4896bdae907SThomas MonjalonCasts and sizeof
4906bdae907SThomas Monjalon~~~~~~~~~~~~~~~~
4916bdae907SThomas Monjalon
4926bdae907SThomas Monjalon* Casts and sizeof statements are not followed by a space.
4936bdae907SThomas Monjalon* Always write sizeof statements with parenthesis.
4946bdae907SThomas Monjalon  The redundant parenthesis rules do not apply to sizeof(var) instances.
4956bdae907SThomas Monjalon
4966bdae907SThomas MonjalonC Function Definition, Declaration and Use
4976bdae907SThomas Monjalon-------------------------------------------
4986bdae907SThomas Monjalon
4996bdae907SThomas MonjalonPrototypes
5006bdae907SThomas Monjalon~~~~~~~~~~
5016bdae907SThomas Monjalon
5026bdae907SThomas Monjalon* It is recommended (and generally required by the compiler) that all non-static functions are prototyped somewhere.
5036bdae907SThomas Monjalon* Functions local to one source module should be declared static, and should not be prototyped unless absolutely necessary.
5046bdae907SThomas Monjalon* Functions used from other parts of code (external API) must be prototyped in the relevant include file.
5056bdae907SThomas Monjalon* Function prototypes should be listed in a logical order, preferably alphabetical unless there is a compelling reason to use a different ordering.
5066bdae907SThomas Monjalon* Functions that are used locally in more than one module go into a separate header file, for example, "extern.h".
5076bdae907SThomas Monjalon* Do not use the ``__P`` macro.
5086bdae907SThomas Monjalon* Functions that are part of an external API should be documented using Doxygen-like comments above declarations. See :ref:`doxygen_guidelines` for details.
5096bdae907SThomas Monjalon* Functions that are part of the external API must have an ``rte_`` prefix on the function name.
5106bdae907SThomas Monjalon* Do not use uppercase letters - either in the form of ALL_UPPERCASE, or CamelCase - in function names. Lower-case letters and underscores only.
5116bdae907SThomas Monjalon* When prototyping functions, associate names with parameter types, for example:
5126bdae907SThomas Monjalon
5136bdae907SThomas Monjalon.. code-block:: c
5146bdae907SThomas Monjalon
5156bdae907SThomas Monjalon void function1(int fd); /* good */
5166bdae907SThomas Monjalon void function2(int);    /* bad */
5176bdae907SThomas Monjalon
5186bdae907SThomas Monjalon* Short function prototypes should be contained on a single line.
5196bdae907SThomas Monjalon  Longer prototypes, e.g. those with many parameters, can be split across multiple lines.
5206bdae907SThomas Monjalon  The second and subsequent lines should be further indented as for line statement continuations as described in the previous section.
5216bdae907SThomas Monjalon
5226bdae907SThomas Monjalon.. code-block:: c
5236bdae907SThomas Monjalon
5246bdae907SThomas Monjalon static char *function1(int _arg, const char *_arg2,
5256bdae907SThomas Monjalon        struct foo *_arg3,
5266bdae907SThomas Monjalon        struct bar *_arg4,
5276bdae907SThomas Monjalon        struct baz *_arg5);
5286bdae907SThomas Monjalon static void usage(void);
5296bdae907SThomas Monjalon
5306bdae907SThomas Monjalon.. note::
5316bdae907SThomas Monjalon
5326bdae907SThomas Monjalon	Unlike function definitions, the function prototypes do not need to place the function return type on a separate line.
5336bdae907SThomas Monjalon
5346bdae907SThomas MonjalonDefinitions
5356bdae907SThomas Monjalon~~~~~~~~~~~
5366bdae907SThomas Monjalon
5376bdae907SThomas Monjalon* The function type should be on a line by itself preceding the function.
5386bdae907SThomas Monjalon* The opening brace of the function body should be on a line by itself.
5396bdae907SThomas Monjalon
5406bdae907SThomas Monjalon.. code-block:: c
5416bdae907SThomas Monjalon
5426bdae907SThomas Monjalon static char *
5436bdae907SThomas Monjalon function(int a1, int a2, float fl, int a4)
5446bdae907SThomas Monjalon {
5456bdae907SThomas Monjalon
5466bdae907SThomas Monjalon
5476bdae907SThomas Monjalon* Do not declare functions inside other functions.
5486bdae907SThomas Monjalon  ANSI C states that such declarations have file scope regardless of the nesting of the declaration.
5496bdae907SThomas Monjalon  Hiding file declarations in what appears to be a local scope is undesirable and will elicit complaints from a good compiler.
5506bdae907SThomas Monjalon* Old-style (K&R) function declaration should not be used, use ANSI function declarations instead as shown below.
5516bdae907SThomas Monjalon* Long argument lists should be wrapped as described above in the function prototypes section.
5526bdae907SThomas Monjalon
5536bdae907SThomas Monjalon.. code-block:: c
5546bdae907SThomas Monjalon
5556bdae907SThomas Monjalon /*
5566bdae907SThomas Monjalon  * All major routines should have a comment briefly describing what
5576bdae907SThomas Monjalon  * they do. The comment before the "main" routine should describe
5586bdae907SThomas Monjalon  * what the program does.
5596bdae907SThomas Monjalon  */
5606bdae907SThomas Monjalon int
5616bdae907SThomas Monjalon main(int argc, char *argv[])
5626bdae907SThomas Monjalon {
5636bdae907SThomas Monjalon         char *ep;
5646bdae907SThomas Monjalon         long num;
5656bdae907SThomas Monjalon         int ch;
5666bdae907SThomas Monjalon
5676bdae907SThomas MonjalonC Statement Style and Conventions
5686bdae907SThomas Monjalon---------------------------------
5696bdae907SThomas Monjalon
5706bdae907SThomas MonjalonNULL Pointers
5716bdae907SThomas Monjalon~~~~~~~~~~~~~
5726bdae907SThomas Monjalon
5736bdae907SThomas Monjalon* NULL is the preferred null pointer constant.
5746bdae907SThomas Monjalon  Use NULL instead of ``(type *)0`` or ``(type *)NULL``, except where the compiler does not know the destination type e.g. for variadic args to a function.
5756bdae907SThomas Monjalon* Test pointers against NULL, for example, use:
5766bdae907SThomas Monjalon
5776bdae907SThomas Monjalon.. code-block:: c
5786bdae907SThomas Monjalon
5796bdae907SThomas Monjalon if (p == NULL) /* Good, compare pointer to NULL */
5806bdae907SThomas Monjalon
5816bdae907SThomas Monjalon if (!p) /* Bad, using ! on pointer */
5826bdae907SThomas Monjalon
5836bdae907SThomas Monjalon
5846bdae907SThomas Monjalon* Do not use ! for tests unless it is a boolean, for example, use:
5856bdae907SThomas Monjalon
5866bdae907SThomas Monjalon.. code-block:: c
5876bdae907SThomas Monjalon
5886bdae907SThomas Monjalon	if (*p == '\0') /* check character against (char)0 */
5896bdae907SThomas Monjalon
5906bdae907SThomas MonjalonReturn Value
5916bdae907SThomas Monjalon~~~~~~~~~~~~
5926bdae907SThomas Monjalon
5936bdae907SThomas Monjalon* Functions which create objects, or allocate memory, should return pointer types, and NULL on error.
5946bdae907SThomas Monjalon  The error type should be indicated may setting the variable ``rte_errno`` appropriately.
5956bdae907SThomas Monjalon* Functions which work on bursts of packets, such as RX-like or TX-like functions, should return the number of packets handled.
5966bdae907SThomas Monjalon* Other functions returning int should generally behave like system calls:
5976bdae907SThomas Monjalon  returning 0 on success and -1 on error, setting ``rte_errno`` to indicate the specific type of error.
5986bdae907SThomas Monjalon* Where already standard in a given library, the alternative error approach may be used where the negative value is not -1 but is instead ``-errno`` if relevant, for example, ``-EINVAL``.
5996bdae907SThomas Monjalon  Note, however, to allow consistency across functions returning integer or pointer types, the previous approach is preferred for any new libraries.
6006bdae907SThomas Monjalon* For functions where no error is possible, the function type should be ``void`` not ``int``.
6016bdae907SThomas Monjalon* Routines returning ``void *`` should not have their return values cast to any pointer type.
6026bdae907SThomas Monjalon  (Typecasting can prevent the compiler from warning about missing prototypes as any implicit definition of a function returns int,
6036bdae907SThomas Monjalon  which, unlike ``void *``, needs a typecast to assign to a pointer variable.)
6046bdae907SThomas Monjalon
6056bdae907SThomas Monjalon.. note::
6066bdae907SThomas Monjalon
6076bdae907SThomas Monjalon	The above rule about not typecasting ``void *`` applies to malloc, as well as to DPDK functions.
6086bdae907SThomas Monjalon
6096bdae907SThomas Monjalon* Values in return statements should not be enclosed in parentheses.
6106bdae907SThomas Monjalon
6116bdae907SThomas MonjalonLogging and Errors
6126bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~~
6136bdae907SThomas Monjalon
6146bdae907SThomas MonjalonIn the DPDK environment, use the logging interface provided:
6156bdae907SThomas Monjalon
6166bdae907SThomas Monjalon.. code-block:: c
6176bdae907SThomas Monjalon
618c1b5fa94SOlivier Matz /* register log types for this application */
619c1b5fa94SOlivier Matz int my_logtype1 = rte_log_register("myapp.log1");
620c1b5fa94SOlivier Matz int my_logtype2 = rte_log_register("myapp.log2");
6216bdae907SThomas Monjalon
622c1b5fa94SOlivier Matz /* set global log level to INFO */
623c1b5fa94SOlivier Matz rte_log_set_global_level(RTE_LOG_INFO);
624c1b5fa94SOlivier Matz
625c1b5fa94SOlivier Matz /* only display messages higher than NOTICE for log2 (default
626c1b5fa94SOlivier Matz  * is DEBUG) */
627c1b5fa94SOlivier Matz rte_log_set_level(my_logtype2, RTE_LOG_NOTICE);
628c1b5fa94SOlivier Matz
6297f0bb634SStephen Hemminger /* enable all PMD logs (whose identifier string starts with "pmd.") */
6307f0bb634SStephen Hemminger rte_log_set_level_pattern("pmd.*", RTE_LOG_DEBUG);
6316bdae907SThomas Monjalon
6326bdae907SThomas Monjalon /* log in debug level */
633c1b5fa94SOlivier Matz rte_log_set_global_level(RTE_LOG_DEBUG);
634c1b5fa94SOlivier Matz RTE_LOG(DEBUG, my_logtype1, "this is is a debug level message\n");
635c1b5fa94SOlivier Matz RTE_LOG(INFO, my_logtype1, "this is is a info level message\n");
636c1b5fa94SOlivier Matz RTE_LOG(WARNING, my_logtype1, "this is is a warning level message\n");
637c1b5fa94SOlivier Matz RTE_LOG(WARNING, my_logtype2, "this is is a debug level message (not displayed)\n");
6386bdae907SThomas Monjalon
6396bdae907SThomas Monjalon /* log in info level */
640c1b5fa94SOlivier Matz rte_log_set_global_level(RTE_LOG_INFO);
641c1b5fa94SOlivier Matz RTE_LOG(DEBUG, my_logtype1, "debug level message (not displayed)\n");
6426bdae907SThomas Monjalon
6436bdae907SThomas MonjalonBranch Prediction
6446bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~
6456bdae907SThomas Monjalon
6466bdae907SThomas Monjalon* When a test is done in a critical zone (called often or in a data path) the code can use the ``likely()`` and ``unlikely()`` macros to indicate the expected, or preferred fast path.
6476bdae907SThomas Monjalon  They are expanded as a compiler builtin and allow the developer to indicate if the branch is likely to be taken or not. Example:
6486bdae907SThomas Monjalon
6496bdae907SThomas Monjalon.. code-block:: c
6506bdae907SThomas Monjalon
6516bdae907SThomas Monjalon #include <rte_branch_prediction.h>
6526bdae907SThomas Monjalon if (likely(x > 1))
6536bdae907SThomas Monjalon   do_stuff();
6546bdae907SThomas Monjalon
6556bdae907SThomas Monjalon.. note::
6566bdae907SThomas Monjalon
6576bdae907SThomas Monjalon	The use of ``likely()`` and ``unlikely()`` should only be done in performance critical paths,
6586bdae907SThomas Monjalon	and only when there is a clearly preferred path, or a measured performance increase gained from doing so.
6596bdae907SThomas Monjalon	These macros should be avoided in non-performance-critical code.
6606bdae907SThomas Monjalon
6616bdae907SThomas MonjalonStatic Variables and Functions
6626bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6636bdae907SThomas Monjalon
6646bdae907SThomas Monjalon* All functions and variables that are local to a file must be declared as ``static`` because it can often help the compiler to do some optimizations (such as, inlining the code).
6656bdae907SThomas Monjalon* Functions that should be inlined should to be declared as ``static inline`` and can be defined in a .c or a .h file.
6666bdae907SThomas Monjalon
6676bdae907SThomas Monjalon.. note::
6686bdae907SThomas Monjalon	Static functions defined in a header file must be declared as ``static inline`` in order to prevent compiler warnings about the function being unused.
6696bdae907SThomas Monjalon
6706bdae907SThomas MonjalonConst Attribute
6716bdae907SThomas Monjalon~~~~~~~~~~~~~~~
6726bdae907SThomas Monjalon
6736bdae907SThomas MonjalonThe ``const`` attribute should be used as often as possible when a variable is read-only.
6746bdae907SThomas Monjalon
6756bdae907SThomas MonjalonInline ASM in C code
6766bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~~~~
6776bdae907SThomas Monjalon
6786bdae907SThomas MonjalonThe ``asm`` and ``volatile`` keywords do not have underscores. The AT&T syntax should be used.
6796bdae907SThomas MonjalonInput and output operands should be named to avoid confusion, as shown in the following example:
6806bdae907SThomas Monjalon
6816bdae907SThomas Monjalon.. code-block:: c
6826bdae907SThomas Monjalon
6836bdae907SThomas Monjalon	asm volatile("outb %[val], %[port]"
6846bdae907SThomas Monjalon		: :
6856bdae907SThomas Monjalon		[port] "dN" (port),
6866bdae907SThomas Monjalon		[val] "a" (val));
6876bdae907SThomas Monjalon
6886bdae907SThomas MonjalonControl Statements
6896bdae907SThomas Monjalon~~~~~~~~~~~~~~~~~~
6906bdae907SThomas Monjalon
6916bdae907SThomas Monjalon* Forever loops are done with for statements, not while statements.
6926bdae907SThomas Monjalon* Elements in a switch statement that cascade should have a FALLTHROUGH comment. For example:
6936bdae907SThomas Monjalon
6946bdae907SThomas Monjalon.. code-block:: c
6956bdae907SThomas Monjalon
6966bdae907SThomas Monjalon         switch (ch) {         /* Indent the switch. */
6976bdae907SThomas Monjalon         case 'a':             /* Don't indent the case. */
6986bdae907SThomas Monjalon                 aflag = 1;    /* Indent case body one tab. */
6996bdae907SThomas Monjalon                 /* FALLTHROUGH */
7006bdae907SThomas Monjalon         case 'b':
7016bdae907SThomas Monjalon                 bflag = 1;
7026bdae907SThomas Monjalon                 break;
7036bdae907SThomas Monjalon         case '?':
7046bdae907SThomas Monjalon         default:
7056bdae907SThomas Monjalon                 usage();
7066bdae907SThomas Monjalon                 /* NOTREACHED */
7076bdae907SThomas Monjalon         }
708d1a22085SJohn McNamara
7097db274b9SHarry van HaarenDynamic Logging
7107db274b9SHarry van Haaren---------------
7117db274b9SHarry van Haaren
7127db274b9SHarry van HaarenDPDK provides infrastructure to perform logging during runtime. This is very
7137db274b9SHarry van Haarenuseful for enabling debug output without recompilation. To enable or disable
7147db274b9SHarry van Haarenlogging of a particular topic, the ``--log-level`` parameter can be provided
7157db274b9SHarry van Haarento EAL, which will change the log level. DPDK code can register topics,
7167db274b9SHarry van Haarenwhich allows the user to adjust the log verbosity for that specific topic.
7177db274b9SHarry van Haaren
7187db274b9SHarry van HaarenIn general, the naming scheme is as follows: ``type.section.name``
7197db274b9SHarry van Haaren
7207db274b9SHarry van Haaren * Type is the type of component, where ``lib``, ``pmd``, ``bus`` and ``user``
7217db274b9SHarry van Haaren   are the common options.
7227db274b9SHarry van Haaren * Section refers to a specific area, for example a poll-mode-driver for an
7237db274b9SHarry van Haaren   ethernet device would use ``pmd.net``, while an eventdev PMD uses
7247db274b9SHarry van Haaren   ``pmd.event``.
7257db274b9SHarry van Haaren * The name identifies the individual item that the log applies to.
7267db274b9SHarry van Haaren   The name section must align with
7277db274b9SHarry van Haaren   the directory that the PMD code resides. See examples below for clarity.
7287db274b9SHarry van Haaren
7297db274b9SHarry van HaarenExamples:
7307db274b9SHarry van Haaren
7317db274b9SHarry van Haaren * The virtio network PMD in ``drivers/net/virtio`` uses ``pmd.net.virtio``
7327db274b9SHarry van Haaren * The eventdev software poll mode driver in ``drivers/event/sw`` uses ``pmd.event.sw``
7337db274b9SHarry van Haaren * The octeontx mempool driver in ``drivers/mempool/octeontx`` uses ``pmd.mempool.octeontx``
7347db274b9SHarry van Haaren * The DPDK hash library in ``lib/librte_hash`` uses ``lib.hash``
7357db274b9SHarry van Haaren
7367db274b9SHarry van HaarenSpecializations
7377db274b9SHarry van Haaren~~~~~~~~~~~~~~~
7387db274b9SHarry van Haaren
7397db274b9SHarry van HaarenIn addition to the above logging topic, any PMD or library can further split
7407db274b9SHarry van Haarenlogging output by using "specializations". A specialization could be the
7417db274b9SHarry van Haarendifference between initialization code, and logs of events that occur at runtime.
7427db274b9SHarry van Haaren
7437db274b9SHarry van HaarenAn example could be the initialization log messages getting one
7447db274b9SHarry van Haarenspecialization, while another specialization handles mailbox command logging.
7457db274b9SHarry van HaarenEach PMD, library or component can create as many specializations as required.
7467db274b9SHarry van Haaren
7477db274b9SHarry van HaarenA specialization looks like this:
7487db274b9SHarry van Haaren
7497db274b9SHarry van Haaren * Initialization output: ``type.section.name.init``
7507db274b9SHarry van Haaren * PF/VF mailbox output: ``type.section.name.mbox``
7517db274b9SHarry van Haaren
7527db274b9SHarry van HaarenA real world example is the i40e poll mode driver which exposes two
7539631253fSFerruh Yigitspecializations, one for initialization ``pmd.net.i40e.init`` and the other for
7549631253fSFerruh Yigitthe remaining driver logs ``pmd.net.i40e.driver``.
7557db274b9SHarry van Haaren
7567db274b9SHarry van HaarenNote that specializations have no formatting rules, but please follow
7577db274b9SHarry van Haarena precedent if one exists. In order to see all current log topics and
7587db274b9SHarry van Haarenspecializations, run the ``app/test`` binary, and use the ``dump_log_types``
759d1a22085SJohn McNamara
760d1a22085SJohn McNamaraPython Code
761d1a22085SJohn McNamara-----------
762d1a22085SJohn McNamara
763d76a5927SJohn McNamaraAll Python code should work with Python 2.7+ and 3.2+ and be compliant with
764d76a5927SJohn McNamara`PEP8 (Style Guide for Python Code) <https://www.python.org/dev/peps/pep-0008/>`_.
765d1a22085SJohn McNamara
766d1a22085SJohn McNamaraThe ``pep8`` tool can be used for testing compliance with the guidelines.
76744a6dfacSBruce Richardson
76844a6dfacSBruce RichardsonIntegrating with the Build System
76944a6dfacSBruce Richardson---------------------------------
77044a6dfacSBruce Richardson
77144a6dfacSBruce RichardsonDPDK supports being built in two different ways:
77244a6dfacSBruce Richardson
77344a6dfacSBruce Richardson* using ``make`` - or more specifically "GNU make", i.e. ``gmake`` on FreeBSD
77444a6dfacSBruce Richardson* using the tools ``meson`` and ``ninja``
77544a6dfacSBruce Richardson
77644a6dfacSBruce RichardsonAny new library or driver to be integrated into DPDK should support being
77744a6dfacSBruce Richardsonbuilt with both systems. While building using ``make`` is a legacy approach, and
77844a6dfacSBruce Richardsonmost build-system enhancements are being done using ``meson`` and ``ninja``
77944a6dfacSBruce Richardsonthere are no plans at this time to deprecate the legacy ``make`` build system.
78044a6dfacSBruce Richardson
78144a6dfacSBruce RichardsonTherefore all new component additions should include both a ``Makefile`` and a
78244a6dfacSBruce Richardson``meson.build`` file, and should be added to the component lists in both the
78344a6dfacSBruce Richardson``Makefile`` and ``meson.build`` files in the relevant top-level directory:
78444a6dfacSBruce Richardsoneither ``lib`` directory or a ``driver`` subdirectory.
78544a6dfacSBruce Richardson
78644a6dfacSBruce RichardsonMakefile Contents
78744a6dfacSBruce Richardson~~~~~~~~~~~~~~~~~
78844a6dfacSBruce Richardson
78944a6dfacSBruce RichardsonThe ``Makefile`` for the component should be of the following format, where
79044a6dfacSBruce Richardson``<name>`` corresponds to the name of the library in question, e.g. hash,
79144a6dfacSBruce Richardsonlpm, etc. For drivers, the same format of Makefile is used.
79244a6dfacSBruce Richardson
79344a6dfacSBruce Richardson.. code-block:: none
79444a6dfacSBruce Richardson
79544a6dfacSBruce Richardson	# pull in basic DPDK definitions, including whether library is to be
79644a6dfacSBruce Richardson	# built or not
79744a6dfacSBruce Richardson	include $(RTE_SDK)/mk/rte.vars.mk
79844a6dfacSBruce Richardson
79944a6dfacSBruce Richardson	# library name
80044a6dfacSBruce Richardson	LIB = librte_<name>.a
80144a6dfacSBruce Richardson
80244a6dfacSBruce Richardson	# any library cflags needed. Generally add "-O3 $(WERROR_FLAGS)"
80344a6dfacSBruce Richardson	CFLAGS += -O3
80444a6dfacSBruce Richardson	CFLAGS += $(WERROR_FLAGS)
80544a6dfacSBruce Richardson
80644a6dfacSBruce Richardson	# the symbol version information for the library, and .so version
80744a6dfacSBruce Richardson	EXPORT_MAP := rte_<name>_version.map
80844a6dfacSBruce Richardson	LIBABIVER := 1
80944a6dfacSBruce Richardson
81044a6dfacSBruce Richardson	# all source filenames are stored in SRCS-y
81144a6dfacSBruce Richardson	SRCS-$(CONFIG_RTE_LIBRTE_<NAME>) += rte_<name>.c
81244a6dfacSBruce Richardson
81344a6dfacSBruce Richardson	# install includes
81444a6dfacSBruce Richardson	SYMLINK-$(CONFIG_RTE_LIBRTE_<NAME>)-include += rte_<name>.h
81544a6dfacSBruce Richardson
81644a6dfacSBruce Richardson	# pull in rules to build the library
81744a6dfacSBruce Richardson	include $(RTE_SDK)/mk/rte.lib.mk
81844a6dfacSBruce Richardson
81944a6dfacSBruce RichardsonMeson Build File Contents - Libraries
82044a6dfacSBruce Richardson~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
82144a6dfacSBruce Richardson
82244a6dfacSBruce RichardsonThe ``meson.build`` file for a new DPDK library should be of the following basic
82344a6dfacSBruce Richardsonformat.
82444a6dfacSBruce Richardson
82544a6dfacSBruce Richardson.. code-block:: python
82644a6dfacSBruce Richardson
82744a6dfacSBruce Richardson	sources = files('file1.c', ...)
82844a6dfacSBruce Richardson	headers = files('file1.c', ...)
82944a6dfacSBruce Richardson
83044a6dfacSBruce Richardson
83144a6dfacSBruce RichardsonThe will build based on a number of conventions and assumptions within the DPDK
83244a6dfacSBruce Richardsonitself, for example, that the library name is the same as the directory name in
83344a6dfacSBruce Richardsonwhich the files are stored.
83444a6dfacSBruce Richardson
83544a6dfacSBruce RichardsonFor a library ``meson.build`` file, there are number of variables which can be
83644a6dfacSBruce Richardsonset, some mandatory, others optional. The mandatory fields are:
83744a6dfacSBruce Richardson
83844a6dfacSBruce Richardsonsources
83944a6dfacSBruce Richardson	**Default Value = []**.
84044a6dfacSBruce Richardson	This variable should list out the files to be compiled up to create the
84144a6dfacSBruce Richardson	library. Files must be specified using the meson ``files()`` function.
84244a6dfacSBruce Richardson
84344a6dfacSBruce Richardson
84444a6dfacSBruce RichardsonThe optional fields are:
84544a6dfacSBruce Richardson
84644a6dfacSBruce Richardsonallow_experimental_apis
84744a6dfacSBruce Richardson	**Default Value = false**
84844a6dfacSBruce Richardson	Used to allow the library to make use of APIs marked as experimental.
84944a6dfacSBruce Richardson	Set to ``true`` if the C files in the library call any functions
85044a6dfacSBruce Richardson	marked as experimental in any included header files.
85144a6dfacSBruce Richardson
85244a6dfacSBruce Richardsonbuild
85344a6dfacSBruce Richardson	**Default Value = true**
85444a6dfacSBruce Richardson	Used to optionally compile a library, based on its dependencies or
85544a6dfacSBruce Richardson	environment. A simple example of use would be:
85644a6dfacSBruce Richardson
85744a6dfacSBruce Richardson.. code-block:: python
85844a6dfacSBruce Richardson
85944a6dfacSBruce Richardson	if host_machine.system() != 'linux'
86044a6dfacSBruce Richardson	        build = false
86144a6dfacSBruce Richardson	endif
86244a6dfacSBruce Richardson
86344a6dfacSBruce Richardson
86444a6dfacSBruce Richardsoncflags
865b114af16SBruce Richardson	**Default Value = [<-march/-mcpu flags>]**.
86644a6dfacSBruce Richardson	Used to specify any additional cflags that need to be passed to compile
86744a6dfacSBruce Richardson	the sources in the library.
86844a6dfacSBruce Richardson
86944a6dfacSBruce Richardsondeps
87044a6dfacSBruce Richardson	**Default Value = ['eal']**.
87144a6dfacSBruce Richardson	Used to list the internal library dependencies of the library. It should
87244a6dfacSBruce Richardson	be assigned to using ``+=`` rather than overwriting using ``=``.  The
87344a6dfacSBruce Richardson	dependencies should be specified as strings, each one giving the name of
87444a6dfacSBruce Richardson	a DPDK library, without the ``librte_`` prefix. Dependencies are handled
87544a6dfacSBruce Richardson	recursively, so specifying e.g. ``mempool``, will automatically also
87644a6dfacSBruce Richardson	make the library depend upon the mempool library's dependencies too -
87744a6dfacSBruce Richardson	``ring`` and ``eal``. For libraries that only depend upon EAL, this
87844a6dfacSBruce Richardson	variable may be omitted from the ``meson.build`` file.  For example:
87944a6dfacSBruce Richardson
88044a6dfacSBruce Richardson.. code-block:: python
88144a6dfacSBruce Richardson
88244a6dfacSBruce Richardson	deps += ['ethdev']
88344a6dfacSBruce Richardson
88444a6dfacSBruce Richardson
88544a6dfacSBruce Richardsonext_deps
88644a6dfacSBruce Richardson	**Default Value = []**.
88744a6dfacSBruce Richardson	Used to specify external dependencies of this library. They should be
88844a6dfacSBruce Richardson	returned as dependency objects, as returned from the meson
88944a6dfacSBruce Richardson	``dependency()`` or ``find_library()`` functions. Before returning
89044a6dfacSBruce Richardson	these, they should be checked to ensure the dependencies have been
89144a6dfacSBruce Richardson	found, and, if not, the ``build`` variable should be set to ``false``.
89244a6dfacSBruce Richardson	For example:
89344a6dfacSBruce Richardson
89444a6dfacSBruce Richardson.. code-block:: python
89544a6dfacSBruce Richardson
89644a6dfacSBruce Richardson	my_dep = dependency('libX', required: 'false')
89744a6dfacSBruce Richardson	if my_dep.found()
89844a6dfacSBruce Richardson		ext_deps += my_dep
89944a6dfacSBruce Richardson	else
90044a6dfacSBruce Richardson		build = false
90144a6dfacSBruce Richardson	endif
90244a6dfacSBruce Richardson
90344a6dfacSBruce Richardson
90444a6dfacSBruce Richardsonheaders
90544a6dfacSBruce Richardson	**Default Value = []**.
90644a6dfacSBruce Richardson	Used to return the list of header files for the library that should be
90744a6dfacSBruce Richardson	installed to $PREFIX/include when ``ninja install`` is run. As with
90844a6dfacSBruce Richardson	source files, these should be specified using the meson ``files()``
90944a6dfacSBruce Richardson	function.
91044a6dfacSBruce Richardson
911610beca4SBruce Richardsonincludes:
912610beca4SBruce Richardson	**Default Value = []**.
913610beca4SBruce Richardson	Used to indicate any additional header file paths which should be
914610beca4SBruce Richardson	added to the header search path for other libs depending on this
915610beca4SBruce Richardson	library. EAL uses this so that other libraries building against it
916610beca4SBruce Richardson	can find the headers in subdirectories of the main EAL directory. The
917610beca4SBruce Richardson	base directory of each library is always given in the include path,
918610beca4SBruce Richardson	it does not need to be specified here.
919610beca4SBruce Richardson
92044a6dfacSBruce Richardsonname
92144a6dfacSBruce Richardson	**Default Value = library name derived from the directory name**.
92244a6dfacSBruce Richardson	If a library's .so or .a file differs from that given in the directory
92344a6dfacSBruce Richardson	name, the name should be specified using this variable. In practice,
92444a6dfacSBruce Richardson	since the convention is that for a library called ``librte_xyz.so``, the
92544a6dfacSBruce Richardson	sources are stored in a directory ``lib/librte_xyz``, this value should
92644a6dfacSBruce Richardson	never be needed for new libraries.
92744a6dfacSBruce Richardson
92844a6dfacSBruce Richardson.. note::
92944a6dfacSBruce Richardson
93044a6dfacSBruce Richardson	The name value also provides the name used to find the function version
93144a6dfacSBruce Richardson	map file, as part of the build process, so if the directory name and
93244a6dfacSBruce Richardson	library names differ, the ``version.map`` file should be named
93344a6dfacSBruce Richardson	consistently with the library, not the directory
93444a6dfacSBruce Richardson
93544a6dfacSBruce Richardsonobjs
93644a6dfacSBruce Richardson	**Default Value = []**.
93744a6dfacSBruce Richardson	This variable can be used to pass to the library build some pre-built
93844a6dfacSBruce Richardson	objects that were compiled up as part of another target given in the
93944a6dfacSBruce Richardson	included library ``meson.build`` file.
94044a6dfacSBruce Richardson
94144a6dfacSBruce Richardsonversion
94244a6dfacSBruce Richardson	**Default Value = 1**.
94344a6dfacSBruce Richardson	Specifies the ABI version of the library, and is used as the major
94444a6dfacSBruce Richardson	version number of the resulting ``.so`` library.
94544a6dfacSBruce Richardson
94644a6dfacSBruce RichardsonMeson Build File Contents - Drivers
94744a6dfacSBruce Richardson~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
94844a6dfacSBruce Richardson
94944a6dfacSBruce RichardsonFor drivers, the values are largely the same as for libraries. The variables
95044a6dfacSBruce Richardsonsupported are:
95144a6dfacSBruce Richardson
95244a6dfacSBruce Richardsonallow_experimental_apis
95344a6dfacSBruce Richardson	As above.
95444a6dfacSBruce Richardson
95544a6dfacSBruce Richardsonbuild
95644a6dfacSBruce Richardson	As above.
95744a6dfacSBruce Richardson
95844a6dfacSBruce Richardsoncflags
95944a6dfacSBruce Richardson	As above.
96044a6dfacSBruce Richardson
96144a6dfacSBruce Richardsondeps
96244a6dfacSBruce Richardson	As above.
96344a6dfacSBruce Richardson
96444a6dfacSBruce Richardsonext_deps
96544a6dfacSBruce Richardson	As above.
96644a6dfacSBruce Richardson
96744a6dfacSBruce Richardsonincludes
96844a6dfacSBruce Richardson	**Default Value = <driver directory>** Some drivers include a base
96944a6dfacSBruce Richardson	directory for additional source files and headers, so we have this
97044a6dfacSBruce Richardson	variable to allow the headers from that base directory to be found when
97144a6dfacSBruce Richardson	compiling driver sources. Should be appended to using ``+=`` rather than
97244a6dfacSBruce Richardson	overwritten using ``=``.  The values appended should be meson include
97344a6dfacSBruce Richardson	objects got using the ``include_directories()`` function. For example:
97444a6dfacSBruce Richardson
97544a6dfacSBruce Richardson.. code-block:: python
97644a6dfacSBruce Richardson
97744a6dfacSBruce Richardson	includes += include_directories('base')
97844a6dfacSBruce Richardson
97944a6dfacSBruce Richardsonname
98044a6dfacSBruce Richardson	As above, though note that each driver class can define it's own naming
98144a6dfacSBruce Richardson	scheme for the resulting ``.so`` files.
98244a6dfacSBruce Richardson
98344a6dfacSBruce Richardsonobjs
98444a6dfacSBruce Richardson	As above, generally used for the contents of the ``base`` directory.
98544a6dfacSBruce Richardson
98644a6dfacSBruce Richardsonpkgconfig_extra_libs
98744a6dfacSBruce Richardson	**Default Value = []**
98844a6dfacSBruce Richardson	This variable is used to pass additional library link flags through to
98944a6dfacSBruce Richardson	the DPDK pkgconfig file generated, for example, to track any additional
99044a6dfacSBruce Richardson	libraries that may need to be linked into the build - especially when
99144a6dfacSBruce Richardson	using static libraries. Anything added here will be appended to the end
99244a6dfacSBruce Richardson	of the ``pkgconfig --libs`` output.
99344a6dfacSBruce Richardson
99444a6dfacSBruce Richardsonsources [mandatory]
99544a6dfacSBruce Richardson	As above
99644a6dfacSBruce Richardson
99744a6dfacSBruce Richardsonversion
99844a6dfacSBruce Richardson	As above
999