netlink-types.h revision 44d362409d5469aed47d19e7908d19bd194493a
144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * netlink-types.h	Netlink Types (Private)
344d362409d5469aed47d19e7908d19bd194493aThomas Graf *
444d362409d5469aed47d19e7908d19bd194493aThomas Graf *	This library is free software; you can redistribute it and/or
544d362409d5469aed47d19e7908d19bd194493aThomas Graf *	modify it under the terms of the GNU Lesser General Public
644d362409d5469aed47d19e7908d19bd194493aThomas Graf *	License as published by the Free Software Foundation version 2.1
744d362409d5469aed47d19e7908d19bd194493aThomas Graf *	of the License.
844d362409d5469aed47d19e7908d19bd194493aThomas Graf *
944d362409d5469aed47d19e7908d19bd194493aThomas Graf * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf
1244d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifndef NETLINK_LOCAL_TYPES_H_
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NETLINK_LOCAL_TYPES_H_
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf
1544d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/list.h>
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/link.h>
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/qdisc.h>
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/rtnl.h>
1944d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/route.h>
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf
2144d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NL_SOCK_BUFSIZE_SET	(1<<0)
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NL_SOCK_PASSCRED	(1<<1)
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NL_OWN_PORT		(1<<2)
2444d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NL_MSG_PEEK		(1<<3)
2544d362409d5469aed47d19e7908d19bd194493aThomas Graf
2644d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NL_MSG_CRED_PRESENT 1
2744d362409d5469aed47d19e7908d19bd194493aThomas Graf
2844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache_ops;
2944d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_handle;
3044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_object;
3144d362409d5469aed47d19e7908d19bd194493aThomas Graf
3244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cb
3344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
3444d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_recvmsg_msg_cb_t	cb_set[NL_CB_TYPE_MAX+1];
3544d362409d5469aed47d19e7908d19bd194493aThomas Graf	void *			cb_args[NL_CB_TYPE_MAX+1];
3644d362409d5469aed47d19e7908d19bd194493aThomas Graf
3744d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_recvmsg_err_cb_t	cb_err;
3844d362409d5469aed47d19e7908d19bd194493aThomas Graf	void *			cb_err_arg;
3944d362409d5469aed47d19e7908d19bd194493aThomas Graf
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf	/** May be used to replace nl_recvmsgs with your own implementation
4144d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * in all internal calls to nl_recvmsgs. */
4244d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			(*cb_recvmsgs_ow)(struct nl_handle *,
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf						  struct nl_cb *);
4444d362409d5469aed47d19e7908d19bd194493aThomas Graf
4544d362409d5469aed47d19e7908d19bd194493aThomas Graf	/** Overwrite internal calls to nl_recv, must return the number of
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * octets read and allocate a buffer for the received data. */
4744d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			(*cb_recv_ow)(struct nl_handle *,
4844d362409d5469aed47d19e7908d19bd194493aThomas Graf					      struct sockaddr_nl *,
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf					      unsigned char **,
5044d362409d5469aed47d19e7908d19bd194493aThomas Graf					      struct ucred **);
5144d362409d5469aed47d19e7908d19bd194493aThomas Graf
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf	/** Overwrites internal calls to nl_send, must send the netlink
5344d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * message. */
5444d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			(*cb_send_ow)(struct nl_handle *,
5544d362409d5469aed47d19e7908d19bd194493aThomas Graf					      struct nl_msg *);
5644d362409d5469aed47d19e7908d19bd194493aThomas Graf
5744d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			cb_refcnt;
5844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
5944d362409d5469aed47d19e7908d19bd194493aThomas Graf
6044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_handle
6144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
6244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct sockaddr_nl	h_local;
6344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct sockaddr_nl	h_peer;
6444d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			h_fd;
6544d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			h_proto;
6644d362409d5469aed47d19e7908d19bd194493aThomas Graf	unsigned int		h_seq_next;
6744d362409d5469aed47d19e7908d19bd194493aThomas Graf	unsigned int		h_seq_expect;
6844d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			h_flags;
6944d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cb *		h_cb;
7044d362409d5469aed47d19e7908d19bd194493aThomas Graf};
7144d362409d5469aed47d19e7908d19bd194493aThomas Graf
7244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache
7344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
7444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_list_head	c_items;
7544d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			c_nitems;
7644d362409d5469aed47d19e7908d19bd194493aThomas Graf	int                     c_iarg1;
7744d362409d5469aed47d19e7908d19bd194493aThomas Graf	int                     c_iarg2;
7844d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache_ops *   c_ops;
7944d362409d5469aed47d19e7908d19bd194493aThomas Graf};
8044d362409d5469aed47d19e7908d19bd194493aThomas Graf
8144d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache_assoc
8244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
8344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache *	ca_cache;
8444d362409d5469aed47d19e7908d19bd194493aThomas Graf	change_func_t		ca_change;
8544d362409d5469aed47d19e7908d19bd194493aThomas Graf};
8644d362409d5469aed47d19e7908d19bd194493aThomas Graf
8744d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache_mngr
8844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
8944d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			cm_protocol;
9044d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			cm_flags;
9144d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			cm_nassocs;
9244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_handle *	cm_handle;
9344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache_assoc *	cm_assocs;
9444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
9544d362409d5469aed47d19e7908d19bd194493aThomas Graf
9644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_parser_param;
9744d362409d5469aed47d19e7908d19bd194493aThomas Graf
9844d362409d5469aed47d19e7908d19bd194493aThomas Grafenum {
9944d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_ACT_UNSPEC,
10044d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_ACT_NEW,
10144d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_ACT_DEL,
10244d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_ACT_GET,
10344d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_ACT_SET,
10444d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_ACT_CHANGE,
10544d362409d5469aed47d19e7908d19bd194493aThomas Graf	__NL_ACT_MAX,
10644d362409d5469aed47d19e7908d19bd194493aThomas Graf};
10744d362409d5469aed47d19e7908d19bd194493aThomas Graf
10844d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NL_ACT_MAX (__NL_ACT_MAX - 1)
10944d362409d5469aed47d19e7908d19bd194493aThomas Graf
11044d362409d5469aed47d19e7908d19bd194493aThomas Graf#define END_OF_MSGTYPES_LIST	{ -1, -1, NULL }
11144d362409d5469aed47d19e7908d19bd194493aThomas Graf
11244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_msgtype
11344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
11444d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			mt_id;
11544d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			mt_act;
11644d362409d5469aed47d19e7908d19bd194493aThomas Graf	char *			mt_name;
11744d362409d5469aed47d19e7908d19bd194493aThomas Graf};
11844d362409d5469aed47d19e7908d19bd194493aThomas Graf
11944d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct genl_info
12044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
12144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct sockaddr_nl *	who;
12244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nlmsghdr *	nlh;
12344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct genlmsghdr *	genlhdr;
12444d362409d5469aed47d19e7908d19bd194493aThomas Graf	void *			userhdr;
12544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nlattr **	attrs;
12644d362409d5469aed47d19e7908d19bd194493aThomas Graf};
12744d362409d5469aed47d19e7908d19bd194493aThomas Graf
12844d362409d5469aed47d19e7908d19bd194493aThomas Graf#define LOOSE_FLAG_COMPARISON	1
12944d362409d5469aed47d19e7908d19bd194493aThomas Graf
13044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_object_ops
13144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
13244d362409d5469aed47d19e7908d19bd194493aThomas Graf	/* Name of object */
13344d362409d5469aed47d19e7908d19bd194493aThomas Graf	char *		oo_name;
13444d362409d5469aed47d19e7908d19bd194493aThomas Graf
13544d362409d5469aed47d19e7908d19bd194493aThomas Graf	/* Size of object structure */
13644d362409d5469aed47d19e7908d19bd194493aThomas Graf	size_t		oo_size;
13744d362409d5469aed47d19e7908d19bd194493aThomas Graf
13844d362409d5469aed47d19e7908d19bd194493aThomas Graf	/* List of attributes needed to uniquely identify the object */
13944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	oo_id_attrs;
14044d362409d5469aed47d19e7908d19bd194493aThomas Graf
14144d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
14244d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Called whenever a new object was allocated
14344d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
14444d362409d5469aed47d19e7908d19bd194493aThomas Graf	void  (*oo_constructor)(struct nl_object *);
14544d362409d5469aed47d19e7908d19bd194493aThomas Graf
14644d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
14744d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Called whenever a object in the cache gets destroyed, must
14844d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * free the type specific memory allocations
14944d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
15044d362409d5469aed47d19e7908d19bd194493aThomas Graf	void  (*oo_free_data)(struct nl_object *);
15144d362409d5469aed47d19e7908d19bd194493aThomas Graf
15244d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
15344d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Callened whenever an object needs to be cloned
15444d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
15544d362409d5469aed47d19e7908d19bd194493aThomas Graf	int  (*oo_clone)(struct nl_object *, struct nl_object *);
15644d362409d5469aed47d19e7908d19bd194493aThomas Graf
15744d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
15844d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Called whenever a dump of a cache object is requested. Must
15944d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * dump the specified object to the specified file descriptor
16044d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
16144d362409d5469aed47d19e7908d19bd194493aThomas Graf	int   (*oo_dump[NL_DUMP_MAX+1])(struct nl_object *,
16244d362409d5469aed47d19e7908d19bd194493aThomas Graf					struct nl_dump_params *);
16344d362409d5469aed47d19e7908d19bd194493aThomas Graf
16444d362409d5469aed47d19e7908d19bd194493aThomas Graf	int   (*oo_compare)(struct nl_object *, struct nl_object *,
16544d362409d5469aed47d19e7908d19bd194493aThomas Graf			    uint32_t, int);
16644d362409d5469aed47d19e7908d19bd194493aThomas Graf
16744d362409d5469aed47d19e7908d19bd194493aThomas Graf
16844d362409d5469aed47d19e7908d19bd194493aThomas Graf	char *(*oo_attrs2str)(int, char *, size_t);
16944d362409d5469aed47d19e7908d19bd194493aThomas Graf};
17044d362409d5469aed47d19e7908d19bd194493aThomas Graf
17144d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_af_group
17244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
17344d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			ag_family;
17444d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			ag_group;
17544d362409d5469aed47d19e7908d19bd194493aThomas Graf};
17644d362409d5469aed47d19e7908d19bd194493aThomas Graf
17744d362409d5469aed47d19e7908d19bd194493aThomas Graf#define END_OF_GROUP_LIST AF_UNSPEC, 0
17844d362409d5469aed47d19e7908d19bd194493aThomas Graf
17944d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache_ops
18044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
18144d362409d5469aed47d19e7908d19bd194493aThomas Graf	char  *			co_name;
18244d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			co_hdrsize;
18344d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			co_protocol;
18444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_af_group *	co_groups;
18544d362409d5469aed47d19e7908d19bd194493aThomas Graf
18644d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
18744d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Called whenever an update of the cache is required. Must send
18844d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * a request message to the kernel requesting a complete dump.
18944d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
19044d362409d5469aed47d19e7908d19bd194493aThomas Graf	int   (*co_request_update)(struct nl_cache *, struct nl_handle *);
19144d362409d5469aed47d19e7908d19bd194493aThomas Graf
19244d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
19344d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Called whenever a message was received that needs to be parsed.
19444d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Must parse the message and call the paser callback function
19544d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * (nl_parser_param) provided via the argument.
19644d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
19744d362409d5469aed47d19e7908d19bd194493aThomas Graf	int   (*co_msg_parser)(struct nl_cache_ops *, struct sockaddr_nl *,
19844d362409d5469aed47d19e7908d19bd194493aThomas Graf			       struct nlmsghdr *, void *);
19944d362409d5469aed47d19e7908d19bd194493aThomas Graf
20044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_object_ops *	co_obj_ops;
20144d362409d5469aed47d19e7908d19bd194493aThomas Graf
20244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache_ops *co_next;
20344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache *co_major_cache;
20444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct genl_ops *	co_genl;
20544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_msgtype	co_msgtypes[];
20644d362409d5469aed47d19e7908d19bd194493aThomas Graf};
20744d362409d5469aed47d19e7908d19bd194493aThomas Graf
20844d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NL_OBJ_MARK		1
20944d362409d5469aed47d19e7908d19bd194493aThomas Graf
21044d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NLHDR_COMMON				\
21144d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			ce_refcnt;	\
21244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_object_ops *	ce_ops;		\
21344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache *	ce_cache;	\
21444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_list_head	ce_list;	\
21544d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			ce_msgtype;	\
21644d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			ce_flags;	\
21744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ce_mask;
21844d362409d5469aed47d19e7908d19bd194493aThomas Graf
21944d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_object
22044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
22144d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
22244d362409d5469aed47d19e7908d19bd194493aThomas Graf};
22344d362409d5469aed47d19e7908d19bd194493aThomas Graf
22444d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_parser_param
22544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
22644d362409d5469aed47d19e7908d19bd194493aThomas Graf	int             (*pp_cb)(struct nl_object *, struct nl_parser_param *);
22744d362409d5469aed47d19e7908d19bd194493aThomas Graf	void *            pp_arg;
22844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
22944d362409d5469aed47d19e7908d19bd194493aThomas Graf
23044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_data
23144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
23244d362409d5469aed47d19e7908d19bd194493aThomas Graf	size_t			d_size;
23344d362409d5469aed47d19e7908d19bd194493aThomas Graf	void *			d_data;
23444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
23544d362409d5469aed47d19e7908d19bd194493aThomas Graf
23644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_addr
23744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
23844d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			a_family;
23944d362409d5469aed47d19e7908d19bd194493aThomas Graf	unsigned int		a_maxsize;
24044d362409d5469aed47d19e7908d19bd194493aThomas Graf	unsigned int		a_len;
24144d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			a_prefixlen;
24244d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			a_refcnt;
24344d362409d5469aed47d19e7908d19bd194493aThomas Graf	char			a_addr[0];
24444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
24544d362409d5469aed47d19e7908d19bd194493aThomas Graf
24644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_msg
24744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
24844d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			nm_protocol;
24944d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			nm_flags;
25044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct sockaddr_nl	nm_src;
25144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct sockaddr_nl	nm_dst;
25244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct ucred		nm_creds;
25344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nlmsghdr *	nm_nlh;
25444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
25544d362409d5469aed47d19e7908d19bd194493aThomas Graf
25644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_link_map
25744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
25844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t lm_mem_start;
25944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t lm_mem_end;
26044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t lm_base_addr;
26144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint16_t lm_irq;
26244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t  lm_dma;
26344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t  lm_port;
26444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
26544d362409d5469aed47d19e7908d19bd194493aThomas Graf
26644d362409d5469aed47d19e7908d19bd194493aThomas Graf#define IFQDISCSIZ	32
26744d362409d5469aed47d19e7908d19bd194493aThomas Graf
26844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_link
26944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
27044d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
27144d362409d5469aed47d19e7908d19bd194493aThomas Graf
27244d362409d5469aed47d19e7908d19bd194493aThomas Graf	char		l_name[IFNAMSIZ];
27344d362409d5469aed47d19e7908d19bd194493aThomas Graf
27444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_family;
27544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_arptype;
27644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_index;
27744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_flags;
27844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_change;
27944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t 	l_mtu;
28044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_link;
28144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_txqlen;
28244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_weight;
28344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_master;
28444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *l_addr;
28544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *l_bcast;
28644d362409d5469aed47d19e7908d19bd194493aThomas Graf	char		l_qdisc[IFQDISCSIZ];
28744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_link_map l_map;
28844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t	l_stats[RTNL_LINK_STATS_MAX+1];
28944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	l_flag_mask;
29044d362409d5469aed47d19e7908d19bd194493aThomas Graf};
29144d362409d5469aed47d19e7908d19bd194493aThomas Graf
29244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_ncacheinfo
29344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
29444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t nci_confirmed;	/**< Time since neighbour validty was last confirmed */
29544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t nci_used;	/**< Time since neighbour entry was last ued */
29644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t nci_updated;	/**< Time since last update */
29744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t nci_refcnt;	/**< Reference counter */
29844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
29944d362409d5469aed47d19e7908d19bd194493aThomas Graf
30044d362409d5469aed47d19e7908d19bd194493aThomas Graf
30144d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_neigh
30244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
30344d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
30444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	n_family;
30544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	n_ifindex;
30644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint16_t	n_state;
30744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		n_flags;
30844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		n_type;
30944d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *n_lladdr;
31044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *n_dst;
31144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	n_probes;
31244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_ncacheinfo n_cacheinfo;
31344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t                n_state_mask;
31444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t                n_flag_mask;
31544d362409d5469aed47d19e7908d19bd194493aThomas Graf};
31644d362409d5469aed47d19e7908d19bd194493aThomas Graf
31744d362409d5469aed47d19e7908d19bd194493aThomas Graf
31844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_addr_cacheinfo
31944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
32044d362409d5469aed47d19e7908d19bd194493aThomas Graf	/* Preferred lifetime in seconds */
32144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t aci_prefered;
32244d362409d5469aed47d19e7908d19bd194493aThomas Graf
32344d362409d5469aed47d19e7908d19bd194493aThomas Graf	/* Valid lifetime in seconds */
32444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t aci_valid;
32544d362409d5469aed47d19e7908d19bd194493aThomas Graf
32644d362409d5469aed47d19e7908d19bd194493aThomas Graf	/* Timestamp of creation in 1/100s seince boottime */
32744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t aci_cstamp;
32844d362409d5469aed47d19e7908d19bd194493aThomas Graf
32944d362409d5469aed47d19e7908d19bd194493aThomas Graf	/* Timestamp of last update in 1/100s since boottime */
33044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t aci_tstamp;
33144d362409d5469aed47d19e7908d19bd194493aThomas Graf};
33244d362409d5469aed47d19e7908d19bd194493aThomas Graf
33344d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_addr
33444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
33544d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
33644d362409d5469aed47d19e7908d19bd194493aThomas Graf
33744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		a_family;
33844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		a_prefixlen;
33944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		a_flags;
34044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		a_scope;
34144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	a_ifindex;
34244d362409d5469aed47d19e7908d19bd194493aThomas Graf
34344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *a_peer;
34444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *a_local;
34544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *a_bcast;
34644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *a_anycast;
34744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *a_multicast;
34844d362409d5469aed47d19e7908d19bd194493aThomas Graf
34944d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_addr_cacheinfo a_cacheinfo;
35044d362409d5469aed47d19e7908d19bd194493aThomas Graf
35144d362409d5469aed47d19e7908d19bd194493aThomas Graf	char a_label[IFNAMSIZ];
35244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t a_flag_mask;
35344d362409d5469aed47d19e7908d19bd194493aThomas Graf};
35444d362409d5469aed47d19e7908d19bd194493aThomas Graf
35544d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NEXTHOP_HAS_FLAGS   0x000001
35644d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NEXTHOP_HAS_WEIGHT  0x000002
35744d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NEXTHOP_HAS_IFINDEX 0x000004
35844d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NEXTHOP_HAS_GATEWAY 0x000008
35944d362409d5469aed47d19e7908d19bd194493aThomas Graf
36044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_nexthop
36144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
36244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rtnh_flags;
36344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rtnh_flag_mask;
36444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rtnh_weight;
36544d362409d5469aed47d19e7908d19bd194493aThomas Graf	/* 1 byte spare */
36644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rtnh_ifindex;
36744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *	rtnh_gateway;
36844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rtnh_mask;
36944d362409d5469aed47d19e7908d19bd194493aThomas Graf
37044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_list_head	rtnh_list;
37144d362409d5469aed47d19e7908d19bd194493aThomas Graf};
37244d362409d5469aed47d19e7908d19bd194493aThomas Graf
37344d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_route
37444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
37544d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
37644d362409d5469aed47d19e7908d19bd194493aThomas Graf
37744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rt_family;
37844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rt_dst_len;
37944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rt_src_len;
38044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rt_tos;
38144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rt_table;
38244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rt_protocol;
38344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rt_scope;
38444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rt_type;
38544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rt_flags;
38644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *	rt_dst;
38744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *	rt_src;
38844d362409d5469aed47d19e7908d19bd194493aThomas Graf	char			rt_iif[IFNAMSIZ];
38944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rt_oif;
39044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *	rt_gateway;
39144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rt_prio;
39244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rt_metrics[RTAX_MAX];
39344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rt_metrics_mask;
39444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *	rt_pref_src;
39544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_list_head	rt_nexthops;
39644d362409d5469aed47d19e7908d19bd194493aThomas Graf	realm_t			rt_realms;
39744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_rtcacheinfo	rt_cacheinfo;
39844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rt_mp_algo;
39944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rt_flag_mask;
40044d362409d5469aed47d19e7908d19bd194493aThomas Graf};
40144d362409d5469aed47d19e7908d19bd194493aThomas Graf
40244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_rule
40344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
40444d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
40544d362409d5469aed47d19e7908d19bd194493aThomas Graf
40644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t	r_mark;
40744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	r_prio;
40844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	r_realms;
40944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	r_table;
41044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		r_dsfield;
41144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		r_type;
41244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		r_family;
41344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		r_src_len;
41444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		r_dst_len;
41544d362409d5469aed47d19e7908d19bd194493aThomas Graf	char		r_iif[IFNAMSIZ];
41644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *r_src;
41744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *r_dst;
41844d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *r_srcmap;
41944d362409d5469aed47d19e7908d19bd194493aThomas Graf};
42044d362409d5469aed47d19e7908d19bd194493aThomas Graf
42144d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_neightbl_parms
42244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
42344d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
42444d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Interface index of the device this parameter set is assigned
42544d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * to or 0 for the default set.
42644d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
42744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ntp_ifindex;
42844d362409d5469aed47d19e7908d19bd194493aThomas Graf
42944d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
43044d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Number of references to this parameter set.
43144d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
43244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ntp_refcnt;
43344d362409d5469aed47d19e7908d19bd194493aThomas Graf
43444d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
43544d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Queue length for pending arp requests, i.e. the number of
43644d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * packets which are accepted from other layers while the
43744d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * neighbour address is still being resolved
43844d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
43944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ntp_queue_len;
44044d362409d5469aed47d19e7908d19bd194493aThomas Graf
44144d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
44244d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Number of requests to send to the user level ARP daemon.
44344d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Specify 0 to disable.
44444d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
44544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ntp_app_probes;
44644d362409d5469aed47d19e7908d19bd194493aThomas Graf
44744d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
44844d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Maximum number of retries for unicast solicitation.
44944d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
45044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ntp_ucast_probes;
45144d362409d5469aed47d19e7908d19bd194493aThomas Graf
45244d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
45344d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Maximum number of retries for multicast solicitation.
45444d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
45544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ntp_mcast_probes;
45644d362409d5469aed47d19e7908d19bd194493aThomas Graf
45744d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
45844d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Base value in milliseconds to ompute reachable time, see RFC2461.
45944d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
46044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		ntp_base_reachable_time;
46144d362409d5469aed47d19e7908d19bd194493aThomas Graf
46244d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
46344d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Actual reachable time (read-only)
46444d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
46544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		ntp_reachable_time;	/* secs */
46644d362409d5469aed47d19e7908d19bd194493aThomas Graf
46744d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
46844d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * The time in milliseconds between retransmitted Neighbor
46944d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Solicitation messages.
47044d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
47144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		ntp_retrans_time;
47244d362409d5469aed47d19e7908d19bd194493aThomas Graf
47344d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
47444d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Interval in milliseconds to check for stale neighbour
47544d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * entries.
47644d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
47744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		ntp_gc_stale_time;	/* secs */
47844d362409d5469aed47d19e7908d19bd194493aThomas Graf
47944d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
48044d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Delay in milliseconds for the first time probe if
48144d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * the neighbour is reachable.
48244d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
48344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		ntp_probe_delay;	/* secs */
48444d362409d5469aed47d19e7908d19bd194493aThomas Graf
48544d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
48644d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Maximum delay in milliseconds of an answer to a neighbour
48744d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * solicitation message.
48844d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
48944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		ntp_anycast_delay;
49044d362409d5469aed47d19e7908d19bd194493aThomas Graf
49144d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
49244d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Minimum age in milliseconds before a neighbour entry
49344d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * may be replaced.
49444d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
49544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		ntp_locktime;
49644d362409d5469aed47d19e7908d19bd194493aThomas Graf
49744d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
49844d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Delay in milliseconds before answering to an ARP request
49944d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * for which a proxy ARP entry exists.
50044d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
50144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		ntp_proxy_delay;
50244d362409d5469aed47d19e7908d19bd194493aThomas Graf
50344d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
50444d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Queue length for the delayed proxy arp requests.
50544d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
50644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ntp_proxy_qlen;
50744d362409d5469aed47d19e7908d19bd194493aThomas Graf
50844d362409d5469aed47d19e7908d19bd194493aThomas Graf	/**
50944d362409d5469aed47d19e7908d19bd194493aThomas Graf	 * Mask of available parameter attributes
51044d362409d5469aed47d19e7908d19bd194493aThomas Graf	 */
51144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ntp_mask;
51244d362409d5469aed47d19e7908d19bd194493aThomas Graf};
51344d362409d5469aed47d19e7908d19bd194493aThomas Graf
51444d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NTBLNAMSIZ	32
51544d362409d5469aed47d19e7908d19bd194493aThomas Graf
51644d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
51744d362409d5469aed47d19e7908d19bd194493aThomas Graf * Neighbour table
51844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @ingroup neightbl
51944d362409d5469aed47d19e7908d19bd194493aThomas Graf */
52044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_neightbl
52144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
52244d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
52344d362409d5469aed47d19e7908d19bd194493aThomas Graf
52444d362409d5469aed47d19e7908d19bd194493aThomas Graf	char			nt_name[NTBLNAMSIZ];
52544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		nt_family;
52644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		nt_gc_thresh1;
52744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		nt_gc_thresh2;
52844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		nt_gc_thresh3;
52944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		nt_gc_interval;
53044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct ndt_config	nt_config;
53144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_neightbl_parms nt_parms;
53244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct ndt_stats	nt_stats;
53344d362409d5469aed47d19e7908d19bd194493aThomas Graf};
53444d362409d5469aed47d19e7908d19bd194493aThomas Graf
53544d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_ratespec
53644d362409d5469aed47d19e7908d19bd194493aThomas Graf{
53744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			rs_cell_log;
53844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint16_t		rs_feature;
53944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint16_t		rs_addend;
54044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint16_t		rs_mpu;
54144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		rs_rate;
54244d362409d5469aed47d19e7908d19bd194493aThomas Graf};
54344d362409d5469aed47d19e7908d19bd194493aThomas Graf
54444d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_tstats
54544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
54644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct {
54744d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint64_t            bytes;
54844d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint64_t            packets;
54944d362409d5469aed47d19e7908d19bd194493aThomas Graf	} tcs_basic;
55044d362409d5469aed47d19e7908d19bd194493aThomas Graf
55144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct {
55244d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint32_t            bps;
55344d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint32_t            pps;
55444d362409d5469aed47d19e7908d19bd194493aThomas Graf	} tcs_rate_est;
55544d362409d5469aed47d19e7908d19bd194493aThomas Graf
55644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct {
55744d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint32_t            qlen;
55844d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint32_t            backlog;
55944d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint32_t            drops;
56044d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint32_t            requeues;
56144d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint32_t            overlimits;
56244d362409d5469aed47d19e7908d19bd194493aThomas Graf	} tcs_queue;
56344d362409d5469aed47d19e7908d19bd194493aThomas Graf};
56444d362409d5469aed47d19e7908d19bd194493aThomas Graf
56544d362409d5469aed47d19e7908d19bd194493aThomas Graf#define TCKINDSIZ	32
56644d362409d5469aed47d19e7908d19bd194493aThomas Graf
56744d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NL_TCA_GENERIC(pre)				\
56844d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON					\
56944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		pre ##_family;		\
57044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		pre ##_ifindex;		\
57144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		pre ##_handle;		\
57244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		pre ##_parent;		\
57344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		pre ##_info;		\
57444d362409d5469aed47d19e7908d19bd194493aThomas Graf	char			pre ##_kind[TCKINDSIZ];	\
57544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_data *	pre ##_opts;		\
57644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		pre ##_stats[RTNL_TC_STATS_MAX+1]; \
57744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_data *	pre ##_xstats;		\
57844d362409d5469aed47d19e7908d19bd194493aThomas Graf	void *			pre ##_subdata;		\
57944d362409d5469aed47d19e7908d19bd194493aThomas Graf
58044d362409d5469aed47d19e7908d19bd194493aThomas Graf
58144d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_tca
58244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
58344d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_TCA_GENERIC(tc);
58444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
58544d362409d5469aed47d19e7908d19bd194493aThomas Graf
58644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_qdisc
58744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
58844d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_TCA_GENERIC(q);
58944d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc_ops	*q_ops;
59044d362409d5469aed47d19e7908d19bd194493aThomas Graf};
59144d362409d5469aed47d19e7908d19bd194493aThomas Graf
59244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_class
59344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
59444d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_TCA_GENERIC(c);
59544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_class_ops	*c_ops;
59644d362409d5469aed47d19e7908d19bd194493aThomas Graf};
59744d362409d5469aed47d19e7908d19bd194493aThomas Graf
59844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_cls
59944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
60044d362409d5469aed47d19e7908d19bd194493aThomas Graf	NL_TCA_GENERIC(c);
60144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	c_prio;
60244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	c_protocol;
60344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_cls_ops	*c_ops;
60444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
60544d362409d5469aed47d19e7908d19bd194493aThomas Graf
60644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_u32
60744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
60844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		cu_divisor;
60944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		cu_hash;
61044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		cu_classid;
61144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		cu_link;
61244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_data *	cu_pcnt;
61344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_data *	cu_selector;
61444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_data *	cu_act;
61544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_data *	cu_police;
61644d362409d5469aed47d19e7908d19bd194493aThomas Graf	char			cu_indev[IFNAMSIZ];
61744d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			cu_mask;
61844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
61944d362409d5469aed47d19e7908d19bd194493aThomas Graf
62044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_fw
62144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
62244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		cf_classid;
62344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_data *	cf_act;
62444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_data *	cf_police;
62544d362409d5469aed47d19e7908d19bd194493aThomas Graf	char			cf_indev[IFNAMSIZ];
62644d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			cf_mask;
62744d362409d5469aed47d19e7908d19bd194493aThomas Graf};
62844d362409d5469aed47d19e7908d19bd194493aThomas Graf
62944d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_dsmark_qdisc
63044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
63144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint16_t	qdm_indices;
63244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint16_t	qdm_default_index;
63344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qdm_set_tc_index;
63444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qdm_mask;
63544d362409d5469aed47d19e7908d19bd194493aThomas Graf};
63644d362409d5469aed47d19e7908d19bd194493aThomas Graf
63744d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_dsmark_class
63844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
63944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		cdm_bmask;
64044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		cdm_value;
64144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	cdm_mask;
64244d362409d5469aed47d19e7908d19bd194493aThomas Graf};
64344d362409d5469aed47d19e7908d19bd194493aThomas Graf
64444d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_fifo
64544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
64644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qf_limit;
64744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qf_mask;
64844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
64944d362409d5469aed47d19e7908d19bd194493aThomas Graf
65044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_prio
65144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
65244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qp_bands;
65344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		qp_priomap[TC_PRIO_MAX+1];
65444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qp_mask;
65544d362409d5469aed47d19e7908d19bd194493aThomas Graf};
65644d362409d5469aed47d19e7908d19bd194493aThomas Graf
65744d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_tbf
65844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
65944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qt_limit;
66044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qt_mpu;
66144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_ratespec	qt_rate;
66244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qt_rate_bucket;
66344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qt_rate_txtime;
66444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_ratespec	qt_peakrate;
66544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qt_peakrate_bucket;
66644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qt_peakrate_txtime;
66744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qt_mask;
66844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
66944d362409d5469aed47d19e7908d19bd194493aThomas Graf
67044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_sfq
67144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
67244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qs_quantum;
67344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qs_perturb;
67444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qs_limit;
67544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qs_divisor;
67644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qs_flows;
67744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qs_mask;
67844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
67944d362409d5469aed47d19e7908d19bd194493aThomas Graf
68044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_netem_corr
68144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
68244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	nmc_delay;
68344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	nmc_loss;
68444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	nmc_duplicate;
68544d362409d5469aed47d19e7908d19bd194493aThomas Graf};
68644d362409d5469aed47d19e7908d19bd194493aThomas Graf
68744d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_netem_reo
68844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
68944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	nmro_probability;
69044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	nmro_correlation;
69144d362409d5469aed47d19e7908d19bd194493aThomas Graf};
69244d362409d5469aed47d19e7908d19bd194493aThomas Graf
69344d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_netem
69444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
69544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qnm_latency;
69644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qnm_limit;
69744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qnm_loss;
69844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qnm_gap;
69944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qnm_duplicate;
70044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qnm_jitter;
70144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qnm_mask;
70244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_netem_corr	qnm_corr;
70344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_netem_reo	qnm_ro;
70444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
70544d362409d5469aed47d19e7908d19bd194493aThomas Graf
70644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_htb_qdisc
70744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
70844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qh_rate2quantum;
70944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qh_defcls;
71044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		qh_mask;
71144d362409d5469aed47d19e7908d19bd194493aThomas Graf};
71244d362409d5469aed47d19e7908d19bd194493aThomas Graf
71344d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_htb_class
71444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
71544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ch_prio;
71644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ch_mtu;
71744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_ratespec	ch_rate;
71844d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_ratespec	ch_ceil;
71944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ch_rbuffer;
72044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ch_cbuffer;
72144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ch_quantum;
72244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			ch_overhead;
72344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			ch_mpu;
72444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ch_mask;
72544d362409d5469aed47d19e7908d19bd194493aThomas Graf};
72644d362409d5469aed47d19e7908d19bd194493aThomas Graf
72744d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_cbq
72844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
72944d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct tc_cbq_lssopt    cbq_lss;
73044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct tc_ratespec      cbq_rate;
73144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct tc_cbq_wrropt    cbq_wrr;
73244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct tc_cbq_ovl       cbq_ovl;
73344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct tc_cbq_fopt      cbq_fopt;
73444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct tc_cbq_police    cbq_police;
73544d362409d5469aed47d19e7908d19bd194493aThomas Graf};
73644d362409d5469aed47d19e7908d19bd194493aThomas Graf
73744d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_red
73844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
73944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qr_limit;
74044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qr_qth_min;
74144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qr_qth_max;
74244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		qr_flags;
74344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		qr_wlog;
74444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		qr_plog;
74544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t		qr_scell_log;
74644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t	qr_mask;
74744d362409d5469aed47d19e7908d19bd194493aThomas Graf};
74844d362409d5469aed47d19e7908d19bd194493aThomas Graf
74944d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct flnl_request
75044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
75144d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
75244d362409d5469aed47d19e7908d19bd194493aThomas Graf
75344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *	lr_addr;
75444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		lr_fwmark;
75544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			lr_tos;
75644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			lr_scope;
75744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			lr_table;
75844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
75944d362409d5469aed47d19e7908d19bd194493aThomas Graf
76044d362409d5469aed47d19e7908d19bd194493aThomas Graf
76144d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct flnl_result
76244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
76344d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
76444d362409d5469aed47d19e7908d19bd194493aThomas Graf
76544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct flnl_request *	fr_req;
76644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			fr_table_id;
76744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			fr_prefixlen;
76844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			fr_nh_sel;
76944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			fr_type;
77044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			fr_scope;
77144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		fr_error;
77244d362409d5469aed47d19e7908d19bd194493aThomas Graf};
77344d362409d5469aed47d19e7908d19bd194493aThomas Graf
77444d362409d5469aed47d19e7908d19bd194493aThomas Graf#define GENL_OP_HAS_POLICY	1
77544d362409d5469aed47d19e7908d19bd194493aThomas Graf#define GENL_OP_HAS_DOIT	2
77644d362409d5469aed47d19e7908d19bd194493aThomas Graf#define GENL_OP_HAS_DUMPIT	4
77744d362409d5469aed47d19e7908d19bd194493aThomas Graf
77844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct genl_family_op
77944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
78044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		o_id;
78144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		o_flags;
78244d362409d5469aed47d19e7908d19bd194493aThomas Graf
78344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_list_head	o_list;
78444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
78544d362409d5469aed47d19e7908d19bd194493aThomas Graf
78644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct genl_family
78744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
78844d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
78944d362409d5469aed47d19e7908d19bd194493aThomas Graf
79044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint16_t		gf_id;
79144d362409d5469aed47d19e7908d19bd194493aThomas Graf	char 			gf_name[GENL_NAMSIZ];
79244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		gf_version;
79344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		gf_hdrsize;
79444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		gf_maxattr;
79544d362409d5469aed47d19e7908d19bd194493aThomas Graf
79644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_list_head	gf_ops;
79744d362409d5469aed47d19e7908d19bd194493aThomas Graf};
79844d362409d5469aed47d19e7908d19bd194493aThomas Graf
79944d362409d5469aed47d19e7908d19bd194493aThomas Grafunion nfnl_ct_proto
80044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
80144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct {
80244d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint16_t	src;
80344d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint16_t	dst;
80444d362409d5469aed47d19e7908d19bd194493aThomas Graf	} port;
80544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct {
80644d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint16_t	id;
80744d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint8_t		type;
80844d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint8_t		code;
80944d362409d5469aed47d19e7908d19bd194493aThomas Graf	} icmp;
81044d362409d5469aed47d19e7908d19bd194493aThomas Graf};
81144d362409d5469aed47d19e7908d19bd194493aThomas Graf
81244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nfnl_ct_dir {
81344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *	src;
81444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *	dst;
81544d362409d5469aed47d19e7908d19bd194493aThomas Graf	union nfnl_ct_proto	proto;
81644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		packets;
81744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint64_t		bytes;
81844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
81944d362409d5469aed47d19e7908d19bd194493aThomas Graf
82044d362409d5469aed47d19e7908d19bd194493aThomas Grafunion nfnl_ct_protoinfo {
82144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct {
82244d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint8_t		state;
82344d362409d5469aed47d19e7908d19bd194493aThomas Graf	} tcp;
82444d362409d5469aed47d19e7908d19bd194493aThomas Graf};
82544d362409d5469aed47d19e7908d19bd194493aThomas Graf
82644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nfnl_ct {
82744d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
82844d362409d5469aed47d19e7908d19bd194493aThomas Graf
82944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			ct_family;
83044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			ct_proto;
83144d362409d5469aed47d19e7908d19bd194493aThomas Graf	union nfnl_ct_protoinfo	ct_protoinfo;
83244d362409d5469aed47d19e7908d19bd194493aThomas Graf
83344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ct_status;
83444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ct_timeout;
83544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ct_mark;
83644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ct_use;
83744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		ct_id;
83844d362409d5469aed47d19e7908d19bd194493aThomas Graf
83944d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nfnl_ct_dir	ct_orig;
84044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nfnl_ct_dir	ct_repl;
84144d362409d5469aed47d19e7908d19bd194493aThomas Graf};
84244d362409d5469aed47d19e7908d19bd194493aThomas Graf
84344d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nfnl_log {
84444d362409d5469aed47d19e7908d19bd194493aThomas Graf	NLHDR_COMMON
84544d362409d5469aed47d19e7908d19bd194493aThomas Graf
84644d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			log_family;
84744d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			log_hook;
84844d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint16_t		log_hwproto;
84944d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		log_mark;
85044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct timeval		log_timestamp;
85144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		log_indev;
85244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		log_outdev;
85344d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		log_physindev;
85444d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		log_physoutdev;
85544d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint8_t			log_hwaddr[8];
85644d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			log_hwaddr_len;
85744d362409d5469aed47d19e7908d19bd194493aThomas Graf	void *			log_payload;
85844d362409d5469aed47d19e7908d19bd194493aThomas Graf	int			log_payload_len;
85944d362409d5469aed47d19e7908d19bd194493aThomas Graf	char *			log_prefix;
86044d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		log_uid;
86144d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		log_seq;
86244d362409d5469aed47d19e7908d19bd194493aThomas Graf	uint32_t		log_seq_global;
86344d362409d5469aed47d19e7908d19bd194493aThomas Graf};
86444d362409d5469aed47d19e7908d19bd194493aThomas Graf
86544d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif
866