#ifndef __NETLINK_KERNEL_H_ #define __NETLINK_KERNEL_H_ #if 0 /* * FIXME: Goal is to preseve the documentation but make it simple * to keep linux/netlink.h in sync. Maybe use named documentation * sections. */ /** * Netlink socket address * @ingroup nl */ struct sockaddr_nl { /** socket family (AF_NETLINK) */ sa_family_t nl_family; /** Padding (unused) */ unsigned short nl_pad; /** Unique process ID */ uint32_t nl_pid; /** Multicast group subscriptions */ uint32_t nl_groups; }; /** * @addtogroup msg * @{ */ /** * Netlink message header */ struct nlmsghdr { /** Length of message including header and padding. */ uint32_t nlmsg_len; /** Message type (content type) */ uint16_t nlmsg_type; /** Message flags */ uint16_t nlmsg_flags; /** Sequence number of message \see core_sk_seq_num. */ uint32_t nlmsg_seq; /** Netlink port */ uint32_t nlmsg_pid; }; /** * @name Standard message flags * @{ */ /** * Must be set on all request messages (typically from user space to * kernel space). */ #define NLM_F_REQUEST 1 /** * Indicates the message is part of a multipart message terminated * by NLMSG_DONE. */ #define NLM_F_MULTI 2 /** * Request for an acknowledgment on success. */ #define NLM_F_ACK 4 /** * Echo this request */ #define NLM_F_ECHO 8 /** @} */ /** * @name Additional message flags for GET requests * @{ */ /** * Return the complete table instead of a single entry. */ #define NLM_F_ROOT 0x100 /** * Return all entries matching criteria passed in message content. */ #define NLM_F_MATCH 0x200 /** * Return an atomic snapshot of the table being referenced. This * may require special privileges because it has the potential to * interrupt service in the FE for a longer time. */ #define NLM_F_ATOMIC 0x400 /** * Dump all entries */ #define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) /** @} */ /** * @name Additional messsage flags for NEW requests * @{ */ /** * Replace existing matching config object with this request. */ #define NLM_F_REPLACE 0x100 /** * Don't replace the config object if it already exists. */ #define NLM_F_EXCL 0x200 /** * Create config object if it doesn't already exist. */ #define NLM_F_CREATE 0x400 /** * Add to the end of the object list. */ #define NLM_F_APPEND 0x800 /** @} */ /** * @name Standard Message types * @{ */ /** * No operation, message must be ignored */ #define NLMSG_NOOP 0x1 /** * The message signals an error and the payload contains a nlmsgerr * structure. This can be looked at as a NACK and typically it is * from FEC to CPC. */ #define NLMSG_ERROR 0x2 /** * Message terminates a multipart message. */ #define NLMSG_DONE 0x3 /** * The message signals that data got lost */ #define NLMSG_OVERRUN 0x4 /** * Lower limit of reserved message types */ #define NLMSG_MIN_TYPE 0x10 /** @} */ /** * Netlink error message header */ struct nlmsgerr { /** Error code (errno number) */ int error; /** Original netlink message causing the error */ struct nlmsghdr msg; }; struct nl_pktinfo { __u32 group; }; /** * Netlink alignment constant, all boundries within messages must be align to this. * * See \ref core_msg_fmt_align for more information on message alignment. */ #define NLMSG_ALIGNTO 4 /** * Returns \p len properly aligned to NLMSG_ALIGNTO. * * See \ref core_msg_fmt_align for more information on message alignment. */ #define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) /** * Length of a netlink message header including padding. * * See \ref core_msg_fmt_align for more information on message alignment. */ #define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) /** @} */ /** * @addtogroup attr * @{ */ /* */ /** * Netlink attribute structure * * @code * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> * +---------------------+- - -+- - - - - - - - - -+- - -+ * | Header | Pad | Payload | Pad | * | (struct nlattr) | ing | | ing | * +---------------------+- - -+- - - - - - - - - -+- - -+ * <-------------- nlattr->nla_len --------------> * @endcode */ struct nlattr { /** * Attribute length in bytes including header */ __u16 nla_len; /** * Netlink attribute type */ __u16 nla_type; }; /** * @name Attribute Type Flags * * @code * nla_type (16 bits) * +---+---+-------------------------------+ * | N | O | Attribute Type | * +---+---+-------------------------------+ * N := Carries nested attributes * O := Payload stored in network byte order * @endcode * * @note The N and O flag are mutually exclusive. * * @{ */ /* */ #define NLA_F_NESTED (1 << 15) #define NLA_F_NET_BYTEORDER (1 << 14) #define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) /** @} */ #define NLA_ALIGNTO 4 /** * Returns \p len properly aligned to NLA_ALIGNTO. * * See \ref core_msg_fmt_align for more information on message alignment. */ #define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) /** * Length of a netlink attribute header including padding. * * See \ref core_msg_fmt_align for more information on message alignment. */ #define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) /** @} */ #endif #endif /* __LINUX_NETLINK_H */