Home | History | Annotate | Download | only in netlink
      1 #ifndef __NETLINK_KERNEL_H_
      2 #define __NETLINK_KERNEL_H_
      3 
      4 #if 0
      5 
      6 /*
      7  * FIXME: Goal is to preseve the documentation but make it simple
      8  * to keep linux/netlink.h in sync. Maybe use named documentation
      9  * sections.
     10  */
     11 
     12 /**
     13  * Netlink socket address
     14  * @ingroup nl
     15  */
     16 struct sockaddr_nl
     17 {
     18 	/** socket family (AF_NETLINK) */
     19 	sa_family_t     nl_family;
     20 
     21 	/** Padding (unused) */
     22 	unsigned short  nl_pad;
     23 
     24 	/** Unique process ID  */
     25 	uint32_t        nl_pid;
     26 
     27 	/** Multicast group subscriptions */
     28 	uint32_t        nl_groups;
     29 };
     30 
     31 /**
     32  * @addtogroup msg
     33  * @{
     34  */
     35 
     36 
     37 /**
     38  * Netlink message header
     39  */
     40 struct nlmsghdr
     41 {
     42 	/** Length of message including header and padding. */
     43 	uint32_t	nlmsg_len;
     44 
     45 	/** Message type (content type) */
     46 	uint16_t	nlmsg_type;
     47 
     48 	/** Message flags */
     49 	uint16_t	nlmsg_flags;
     50 
     51 	/** Sequence number of message \see core_sk_seq_num. */
     52 	uint32_t	nlmsg_seq;
     53 
     54 	/** Netlink port */
     55 	uint32_t	nlmsg_pid;
     56 };
     57 
     58 /**
     59  * @name Standard message flags
     60  * @{
     61  */
     62 
     63 /**
     64  * Must be set on all request messages (typically from user space to
     65  * kernel space).
     66  */
     67 #define NLM_F_REQUEST		1
     68 
     69 /**
     70  * Indicates the message is part of a multipart message terminated
     71  * by NLMSG_DONE.
     72  */
     73 #define NLM_F_MULTI		2
     74 
     75 /**
     76  * Request for an acknowledgment on success.
     77  */
     78 #define NLM_F_ACK		4
     79 
     80 /**
     81  * Echo this request
     82  */
     83 #define NLM_F_ECHO		8
     84 
     85 /** @} */
     86 
     87 /**
     88  * @name Additional message flags for GET requests
     89  * @{
     90  */
     91 
     92 /**
     93  * Return the complete table instead of a single entry.
     94  */
     95 #define NLM_F_ROOT	0x100
     96 
     97 /**
     98  * Return all entries matching criteria passed in message content.
     99  */
    100 #define NLM_F_MATCH	0x200
    101 
    102 /**
    103  * Return an atomic snapshot of the table being referenced. This
    104  * may require special privileges because it has the potential to
    105  * interrupt service in the FE for a longer time.
    106  */
    107 #define NLM_F_ATOMIC	0x400
    108 
    109 /**
    110  * Dump all entries
    111  */
    112 #define NLM_F_DUMP	(NLM_F_ROOT|NLM_F_MATCH)
    113 
    114 /** @} */
    115 
    116 /**
    117  * @name Additional messsage flags for NEW requests
    118  * @{
    119  */
    120 
    121 /**
    122  * Replace existing matching config object with this request.
    123  */
    124 #define NLM_F_REPLACE	0x100
    125 
    126 /**
    127  * Don't replace the config object if it already exists.
    128  */
    129 #define NLM_F_EXCL	0x200
    130 
    131 /**
    132  * Create config object if it doesn't already exist.
    133  */
    134 #define NLM_F_CREATE	0x400
    135 
    136 /**
    137  * Add to the end of the object list.
    138  */
    139 #define NLM_F_APPEND	0x800
    140 
    141 /** @} */
    142 
    143 /**
    144  * @name Standard Message types
    145  * @{
    146  */
    147 
    148 /**
    149  * No operation, message must be ignored
    150  */
    151 #define NLMSG_NOOP		0x1
    152 
    153 /**
    154  * The message signals an error and the payload contains a nlmsgerr
    155  * structure. This can be looked at as a NACK and typically it is
    156  * from FEC to CPC.
    157  */
    158 #define NLMSG_ERROR		0x2
    159 
    160 /**
    161  * Message terminates a multipart message.
    162  */
    163 #define NLMSG_DONE		0x3
    164 
    165 /**
    166  * The message signals that data got lost
    167  */
    168 #define NLMSG_OVERRUN		0x4
    169 
    170 /**
    171  * Lower limit of reserved message types
    172  */
    173 #define NLMSG_MIN_TYPE		0x10
    174 
    175 /** @} */
    176 
    177 /**
    178  * Netlink error message header
    179  */
    180 struct nlmsgerr
    181 {
    182 	/** Error code (errno number) */
    183 	int		error;
    184 
    185 	/** Original netlink message causing the error */
    186 	struct nlmsghdr	msg;
    187 };
    188 
    189 struct nl_pktinfo
    190 {
    191 	__u32	group;
    192 };
    193 
    194 /**
    195  * Netlink alignment constant, all boundries within messages must be align to this.
    196  *
    197  * See \ref core_msg_fmt_align for more information on message alignment.
    198  */
    199 #define NLMSG_ALIGNTO	4
    200 
    201 /**
    202  * Returns \p len properly aligned to NLMSG_ALIGNTO.
    203  *
    204  * See \ref core_msg_fmt_align for more information on message alignment.
    205  */
    206 #define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
    207 
    208 /**
    209  * Length of a netlink message header including padding.
    210  *
    211  * See \ref core_msg_fmt_align for more information on message alignment.
    212  */
    213 #define NLMSG_HDRLEN	 ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
    214 
    215 /** @} */
    216 
    217 /**
    218  * @addtogroup attr
    219  * @{
    220  */
    221 
    222 /*
    223  */
    224 
    225 /**
    226  * Netlink attribute structure
    227  *
    228  * @code
    229  *  <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)-->
    230  * +---------------------+- - -+- - - - - - - - - -+- - -+
    231  * |        Header       | Pad |     Payload       | Pad |
    232  * |   (struct nlattr)   | ing |                   | ing |
    233  * +---------------------+- - -+- - - - - - - - - -+- - -+
    234  *  <-------------- nlattr->nla_len -------------->
    235  * @endcode
    236  */
    237 struct nlattr {
    238 	/**
    239 	 * Attribute length in bytes including header
    240 	 */
    241 	__u16           nla_len;
    242 
    243 	/**
    244 	 * Netlink attribute type
    245 	 */
    246 	__u16           nla_type;
    247 };
    248 
    249 /**
    250  * @name Attribute Type Flags
    251  *
    252  * @code
    253  * nla_type (16 bits)
    254  * +---+---+-------------------------------+
    255  * | N | O | Attribute Type                |
    256  * +---+---+-------------------------------+
    257  * N := Carries nested attributes
    258  * O := Payload stored in network byte order
    259  * @endcode
    260  *
    261  * @note The N and O flag are mutually exclusive.
    262  *
    263  * @{
    264  */
    265 
    266 /*
    267  */
    268 #define NLA_F_NESTED		(1 << 15)
    269 #define NLA_F_NET_BYTEORDER	(1 << 14)
    270 #define NLA_TYPE_MASK		~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)
    271 
    272 /** @} */
    273 
    274 #define NLA_ALIGNTO		4
    275 
    276 /**
    277  * Returns \p len properly aligned to NLA_ALIGNTO.
    278  *
    279  * See \ref core_msg_fmt_align for more information on message alignment.
    280  */
    281 #define NLA_ALIGN(len)		(((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
    282 
    283 /**
    284  * Length of a netlink attribute header including padding.
    285  *
    286  * See \ref core_msg_fmt_align for more information on message alignment.
    287  */
    288 #define NLA_HDRLEN		((int) NLA_ALIGN(sizeof(struct nlattr)))
    289 
    290 /** @} */
    291 
    292 #endif
    293 #endif	/* __LINUX_NETLINK_H */
    294