[ovs-dev] [PATCH] datapath-windows: Update CodingStyle

Samuel Ghinet sghinet at cloudbasesolutions.com
Tue Aug 5 21:28:11 UTC 2014


Update the file CodingStyle: add more Windows-style rules.

Also, other rules will make code more clear.

Windows Kernel style rules:
o) Type names (structs, enums), constants, symbols, macros.
o) Braces
o) Code annotations
o) Function suffix: Unsafe
o) Switch Cases

Code clarity rules:
o) OVS_ prefixes for types, constants, symbols, macros.
o) "s_" and "g_" prefixes for static and global variables. Normally, Windows style uses "g" instead of
o) g_" and does not have a prefix for static variables.
o) "p" or "pp" prefixes for pointer and pointer-to-pointer variables. This style is used in Windows userspace
code style, but not in kernel. Either way, it is useful to distinguish pointer variables from other variable types.
o) "_" prefix for private functions.
o) Component-prefixed function names.

---
 datapath-windows/CodingStyle | 177 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 175 insertions(+), 2 deletions(-)

diff --git a/datapath-windows/CodingStyle b/datapath-windows/CodingStyle
index 006adfd..a8f020d 100644
--- a/datapath-windows/CodingStyle
+++ b/datapath-windows/CodingStyle
@@ -42,8 +42,35 @@ guidelines:

   Use upper case to begin the name of a function, enum, file name etc.

-  For types, use all upper case for all letters with words separated by '_'. If
-  camel casing is preferred, use  upper case for the first letter.
+  All types, all enum constants and all symbol definitions must be all upper case.
+If the name is made of multiple words, separate words by "_".
+
+  All macros, symbols, and custom types (i.e. typedef to enums, structs, unions) must
+be prefixed by "OVS_". Functions must not be prefixed by "Ovs".
+
+  Enum constants must follow the name style of the enum type.
+
+  Example:
+
+typedef enum _OVS_IPPROTO
+{
+    OVS_IPPROTO_ICMP = 1,
+    //constants here.
+};
+
+  This makes easier lookup of enum constants, knowing the enum type.
+
+  All types must be declared with typedef. Type typedef must always be used.
+
+  Example:
+
+typedef struct _OVS_DATAPATH
+{
+    //fields here
+}OVS_DATAPATH, *POVS_DATAPATH;
+
+  Always use OVS_DATAPATH or POVS_DATAPATH. Do not declare variable by
+  "struct _OVS_DATAPATH dp;"

   It is a common practice to define a pointer type by prefixing the letter
 'P' to a data type.  The same practice can be followed here as well.
@@ -72,6 +99,47 @@ OvsDetectTunnelRxPkt(POVS_FORWARDING_CONTEXT ovsFwdCtx,
     return FALSE;
 }

+  Builtin types: UINT, INT, UINT16, VOID etc. are preferred over unsigned int, int,
+unsigned short, void, etc. Do not use typedef-s for builtin types that are lowercase.
+For example, do not use uint32_t, uint16_t, etc.
+
+  In Visual Studio, ULONG is identical to UINT and with UINT32. The use of ULONG is
+preferred. Use unsigned types whenever the variable should only have positive values.
+Use typedef-s for UINT32: BE32, BE64, whenever it is known that the variable is Big Endian.
+Use UINT32 only when it is important to know that the value is 32 bit long. Otherwise, use
+ULONG.
+
+  Variables declared in a .c file that are used only within that .c file must be static and
+prefixed by "s_" (stands for "static"). Global variables, i.e. variables that are declared in
+a .h file and used in multiple .c files must be prefixed by "g_" (stands for "global").
+
+  Pointer data types should be prefixed by "p" or "pp".
+
+  Example:
+
+OVS_FLOW* pFlow;
+OVS_FLOW** ppFlow;
+
+  or
+
+POVS_FLOW pFlow;
+POVS_FLOW* ppFlow;
+
+Arrays should be named like this:
+OVS_FLOW* flows;
+OVS_FLOW** pFlows;
+
+  or
+
+POVS_FLOW flows;
+POVS_FLOW* pFlows;
+
+If "*" is preferred in a variable declaration, instead of using P-prefixed type,
+the "*" must be attached to the type, when possible.
+
+Example:
+
+OVS_FLOW* pFlow; //instead of OVS_FLOW *pFlow;

 COMMENTS

@@ -103,12 +171,41 @@ the name of the function or based on the workflow it is called from.
   In the interest of keeping comments describing functions similar in
 structure, use the following template.

+  Code annotations are preferred.
+
 /*
  *----------------------------------------------------------------------------
  * Any description of the function, arguments, return types, assumptions and
  * side effects.
  *----------------------------------------------------------------------------
  */
+
+  All private functions (i.e. functions that are to be used only in one .c file) should
+be defined as static, and be "_" prefixed.
+
+  Example:
+
+static BOOLEAN _FunctionName(VOID* p)
+{
+    //code
+}
+
+  This makes it clear when studying the code, and when seeing function calls weather
+the function is supposed to be private or public.
+
+  Public functions that operate on a specific component should have a component name prefix.
+
+  Example:
+
+OVS_FLOW* FlowCreate(VOID* p)
+{
+    //code
+}
+
+  Functions that operate on global data (such as, functions that add / remove flows), and expect the
+caller to hold a lock beforehand, should be suffixed with "Unsafe". If the component function (e.g. Flow)
+does not lock its specific lock (e.g. the flow's lock field), but locks any other component's lock or
+global lock, it should still be suffixed by "Unsafe".

 SOURCE FILES

@@ -137,3 +234,79 @@ quickly figure out where a given module fits into the larger system.

     4. Open vSwitch headers, in alphabetical order.  Use "", not <>,
        to specify Open vSwitch header names.
+
+BRACES
+
+  Use Windows-style braces:
+  The open brace must be on a separate line.
+
+  Example:
+
+if (condition)
+{
+    //code
+}
+
+typedef struct _OVS_DATAPATH
+{
+    //fields here
+}OVS_DATAPATH, *pOVS_DATAPATH;
+
+  All code executed for an if, else, while, do while, or for, must be
+  enclosed in braces, even if it's only one instruction to be executed.
+  The else part of an if must be on the very next line after the if's closed
+  brace (i.e. there should be no blank line in between)
+
+  Example:
+
+if (condition)
+{
+    //code
+}
+else
+{
+  //code
+}
+
+For all other cases than else, after "}", a blank line must follow
+
+SWITCH CASES
+
+  Each "case", if it is preceded by a "break" of a previous case, there must be
+  a blank line in between:
+switch (c)
+{
+    case v1:
+        //code
+        break;
+
+    case v2:
+        //code
+        break;
+}
+
+  Number of lines per file: try to limit to 1000 lines. Maximum allowed should be 1500.
+If a file is grown to large in number of lines, consider splitting it into files, based on
+the components the functions operate upon.
+
+SPACES WITHIN LINES
+
+  Use spaces between operands and operators.
+
+  Example:
+
+x + y * z
+
+instead of:
+
+x+y*z
+
+  Do not use space after "(" or before ")"
+
+  Example:
+
+(x * y * z) + a
+
+  instead of:
+
+( x * y * z ) + a
--
1.8.3.msysgit.0





More information about the dev mailing list