Netlink spec C code generation¶
This document describes how Netlink specifications are used to render
C code (uAPI, policies etc.). It also defines the additional properties
allowed in older families by the genetlink-c
protocol level,
to control the naming.
For brevity this document refers to name
properties of various
objects by the object type. For example $attr
is the value
of name
in an attribute, and $family
is the name of the
family (the global name
property).
The upper case is used to denote literal values, e.g. $family-CMD
means the concatenation of $family
, a dash character, and the literal
CMD
.
The names of #defines
and enum values are always converted to upper case,
and with dashes (-
) replaced by underscores (_
).
If the constructed name is a C keyword, an extra underscore is
appended (do
-> do_
).
Globals¶
c-family-name
controls the name of the #define
for the family
name, default is $family-FAMILY-NAME
.
c-version-name
controls the name of the #define
for the version
of the family, default is $family-FAMILY-VERSION
.
max-by-define
selects if max values for enums are defined as a
#define
rather than inside the enum.
Definitions¶
Constants¶
Every constant is rendered as a #define
.
The name of the constant is $family-$constant
and the value
is rendered as a string or integer according to its type in the spec.
Enums and flags¶
Enums are named $family-$enum
. The full name can be set directly
or suppressed by specifying the enum-name
property.
Default entry name is $family-$enum-$entry
.
If name-prefix
is specified it replaces the $family-$enum
portion of the entry name.
Boolean render-max
controls creation of the max values
(which are enabled by default for attribute enums). These max
values are named __$pfx-MAX
and $pfx-MAX
. The name
of the first value can be overridden via enum-cnt-name
property.
Attributes¶
Each attribute set (excluding fractional sets) is rendered as an enum.
Attribute enums are traditionally unnamed in netlink headers.
If naming is desired enum-name
can be used to specify the name.
The default attribute name prefix is $family-A
if the name of the set
is the same as the name of the family and $family-A-$set
if the names
differ. The prefix can be overridden by the name-prefix
property of a set.
The rest of the section will refer to the prefix as $pfx
.
Attributes are named $pfx-$attribute
.
Attribute enums end with two special values __$pfx-MAX
and $pfx-MAX
which are used for sizing attribute tables.
These two names can be specified directly with the attr-cnt-name
and attr-max-name
properties respectively.
If max-by-define
is set to true
at the global level attr-max-name
will be specified as a #define
rather than an enum value.
Operations¶
Operations are named $family-CMD-$operation
.
If name-prefix
is specified it replaces the $family-CMD
portion of the name.
Similarly to attribute enums operation enums end with special count and max
attributes. For operations those attributes can be renamed with
cmd-cnt-name
and cmd-max-name
. Max will be a define if max-by-define
is true
.
Multicast groups¶
Each multicast group gets a define rendered into the kernel uAPI header.
The name of the define is $family-MCGRP-$group
, and can be overwritten
with the c-define-name
property.
Code generation¶
uAPI header is assumed to come from <linux/$family.h>
in the default header
search path. It can be changed using the uapi-header
global property.