netlink-types.h revision 6de17f3308cfd53ad922d144a1b28ddd962d6678
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * netlink-types.h	Netlink Types (Private)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	This library is free software; you can redistribute it and/or
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	modify it under the terms of the GNU Lesser General Public
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	License as published by the Free Software Foundation version 2.1
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	of the License.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NETLINK_LOCAL_TYPES_H_
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NETLINK_LOCAL_TYPES_H_
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <netlink/list.h>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <netlink/route/link.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <netlink/route/qdisc.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <netlink/route/rtnl.h>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <netlink/route/route.h>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NL_SOCK_BUFSIZE_SET	(1<<0)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NL_SOCK_PASSCRED	(1<<1)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NL_OWN_PORT		(1<<2)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NL_MSG_PEEK		(1<<3)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NL_MSG_CRED_PRESENT 1
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct nl_cache_ops;
29struct nl_handle;
30struct nl_object;
31
32struct nl_cb
33{
34	nl_recvmsg_msg_cb_t	cb_set[NL_CB_TYPE_MAX+1];
35	void *			cb_args[NL_CB_TYPE_MAX+1];
36
37	nl_recvmsg_err_cb_t	cb_err;
38	void *			cb_err_arg;
39
40	/** May be used to replace nl_recvmsgs with your own implementation
41	 * in all internal calls to nl_recvmsgs. */
42	int			(*cb_recvmsgs_ow)(struct nl_handle *,
43						  struct nl_cb *);
44
45	/** Overwrite internal calls to nl_recv, must return the number of
46	 * octets read and allocate a buffer for the received data. */
47	int			(*cb_recv_ow)(struct nl_handle *,
48					      struct sockaddr_nl *,
49					      unsigned char **,
50					      struct ucred **);
51
52	/** Overwrites internal calls to nl_send, must send the netlink
53	 * message. */
54	int			(*cb_send_ow)(struct nl_handle *,
55					      struct nl_msg *);
56
57	int			cb_refcnt;
58};
59
60struct nl_handle
61{
62	struct sockaddr_nl	h_local;
63	struct sockaddr_nl	h_peer;
64	int			h_fd;
65	int			h_proto;
66	unsigned int		h_seq_next;
67	unsigned int		h_seq_expect;
68	int			h_flags;
69	struct nl_cb *		h_cb;
70};
71
72struct nl_cache
73{
74	struct nl_list_head	c_items;
75	int			c_nitems;
76	int                     c_iarg1;
77	int                     c_iarg2;
78	struct nl_cache_ops *   c_ops;
79};
80
81struct nl_cache_assoc
82{
83	struct nl_cache *	ca_cache;
84	change_func_t		ca_change;
85};
86
87struct nl_cache_mngr
88{
89	int			cm_protocol;
90	int			cm_flags;
91	int			cm_nassocs;
92	struct nl_handle *	cm_handle;
93	struct nl_cache_assoc *	cm_assocs;
94};
95
96struct nl_parser_param;
97
98struct genl_info
99{
100	struct sockaddr_nl *	who;
101	struct nlmsghdr *	nlh;
102	struct genlmsghdr *	genlhdr;
103	void *			userhdr;
104	struct nlattr **	attrs;
105};
106
107#define LOOSE_FLAG_COMPARISON	1
108
109#define NL_OBJ_MARK		1
110
111struct nl_object
112{
113	NLHDR_COMMON
114};
115
116struct nl_data
117{
118	size_t			d_size;
119	void *			d_data;
120};
121
122struct nl_addr
123{
124	int			a_family;
125	unsigned int		a_maxsize;
126	unsigned int		a_len;
127	int			a_prefixlen;
128	int			a_refcnt;
129	char			a_addr[0];
130};
131
132struct nl_msg
133{
134	int			nm_protocol;
135	int			nm_flags;
136	struct sockaddr_nl	nm_src;
137	struct sockaddr_nl	nm_dst;
138	struct ucred		nm_creds;
139	struct nlmsghdr *	nm_nlh;
140	size_t			nm_size;
141};
142
143struct rtnl_link_map
144{
145	uint64_t lm_mem_start;
146	uint64_t lm_mem_end;
147	uint64_t lm_base_addr;
148	uint16_t lm_irq;
149	uint8_t  lm_dma;
150	uint8_t  lm_port;
151};
152
153#define IFQDISCSIZ	32
154
155struct rtnl_link
156{
157	NLHDR_COMMON
158
159	char		l_name[IFNAMSIZ];
160
161	uint32_t	l_family;
162	uint32_t	l_arptype;
163	uint32_t	l_index;
164	uint32_t	l_flags;
165	uint32_t	l_change;
166	uint32_t 	l_mtu;
167	uint32_t	l_link;
168	uint32_t	l_txqlen;
169	uint32_t	l_weight;
170	uint32_t	l_master;
171	struct nl_addr *l_addr;
172	struct nl_addr *l_bcast;
173	char		l_qdisc[IFQDISCSIZ];
174	struct rtnl_link_map l_map;
175	uint64_t	l_stats[RTNL_LINK_STATS_MAX+1];
176	uint32_t	l_flag_mask;
177	uint8_t		l_operstate;
178	uint8_t		l_linkmode;
179	/* 2 byte hole */
180	struct rtnl_link_info_ops *l_info_ops;
181	void *		l_info;
182};
183
184struct rtnl_ncacheinfo
185{
186	uint32_t nci_confirmed;	/**< Time since neighbour validty was last confirmed */
187	uint32_t nci_used;	/**< Time since neighbour entry was last ued */
188	uint32_t nci_updated;	/**< Time since last update */
189	uint32_t nci_refcnt;	/**< Reference counter */
190};
191
192
193struct rtnl_neigh
194{
195	NLHDR_COMMON
196	uint32_t	n_family;
197	uint32_t	n_ifindex;
198	uint16_t	n_state;
199	uint8_t		n_flags;
200	uint8_t		n_type;
201	struct nl_addr *n_lladdr;
202	struct nl_addr *n_dst;
203	uint32_t	n_probes;
204	struct rtnl_ncacheinfo n_cacheinfo;
205	uint32_t                n_state_mask;
206	uint32_t                n_flag_mask;
207};
208
209
210struct rtnl_addr_cacheinfo
211{
212	/* Preferred lifetime in seconds */
213	uint32_t aci_prefered;
214
215	/* Valid lifetime in seconds */
216	uint32_t aci_valid;
217
218	/* Timestamp of creation in 1/100s seince boottime */
219	uint32_t aci_cstamp;
220
221	/* Timestamp of last update in 1/100s since boottime */
222	uint32_t aci_tstamp;
223};
224
225struct rtnl_addr
226{
227	NLHDR_COMMON
228
229	uint8_t		a_family;
230	uint8_t		a_prefixlen;
231	uint8_t		a_flags;
232	uint8_t		a_scope;
233	uint32_t	a_ifindex;
234
235	struct nl_addr *a_peer;
236	struct nl_addr *a_local;
237	struct nl_addr *a_bcast;
238	struct nl_addr *a_anycast;
239	struct nl_addr *a_multicast;
240
241	struct rtnl_addr_cacheinfo a_cacheinfo;
242
243	char a_label[IFNAMSIZ];
244	uint32_t a_flag_mask;
245};
246
247#define NEXTHOP_HAS_FLAGS   0x000001
248#define NEXTHOP_HAS_WEIGHT  0x000002
249#define NEXTHOP_HAS_IFINDEX 0x000004
250#define NEXTHOP_HAS_GATEWAY 0x000008
251
252struct rtnl_nexthop
253{
254	uint8_t			rtnh_flags;
255	uint8_t			rtnh_flag_mask;
256	uint8_t			rtnh_weight;
257	/* 1 byte spare */
258	uint32_t		rtnh_ifindex;
259	struct nl_addr *	rtnh_gateway;
260	uint32_t		rtnh_mask;
261
262	struct nl_list_head	rtnh_list;
263};
264
265struct rtnl_route
266{
267	NLHDR_COMMON
268
269	uint8_t			rt_family;
270	uint8_t			rt_dst_len;
271	uint8_t			rt_src_len;
272	uint8_t			rt_tos;
273	uint8_t			rt_table;
274	uint8_t			rt_protocol;
275	uint8_t			rt_scope;
276	uint8_t			rt_type;
277	uint32_t		rt_flags;
278	struct nl_addr *	rt_dst;
279	struct nl_addr *	rt_src;
280	char			rt_iif[IFNAMSIZ];
281	uint32_t		rt_oif;
282	struct nl_addr *	rt_gateway;
283	uint32_t		rt_prio;
284	uint32_t		rt_metrics[RTAX_MAX];
285	uint32_t		rt_metrics_mask;
286	struct nl_addr *	rt_pref_src;
287	struct nl_list_head	rt_nexthops;
288	realm_t			rt_realms;
289	struct rtnl_rtcacheinfo	rt_cacheinfo;
290	uint32_t		rt_mp_algo;
291	uint32_t		rt_flag_mask;
292};
293
294struct rtnl_rule
295{
296	NLHDR_COMMON
297
298	uint64_t	r_mark;
299	uint32_t	r_prio;
300	uint32_t	r_realms;
301	uint32_t	r_table;
302	uint8_t		r_dsfield;
303	uint8_t		r_type;
304	uint8_t		r_family;
305	uint8_t		r_src_len;
306	uint8_t		r_dst_len;
307	char		r_iif[IFNAMSIZ];
308	struct nl_addr *r_src;
309	struct nl_addr *r_dst;
310	struct nl_addr *r_srcmap;
311};
312
313struct rtnl_neightbl_parms
314{
315	/**
316	 * Interface index of the device this parameter set is assigned
317	 * to or 0 for the default set.
318	 */
319	uint32_t		ntp_ifindex;
320
321	/**
322	 * Number of references to this parameter set.
323	 */
324	uint32_t		ntp_refcnt;
325
326	/**
327	 * Queue length for pending arp requests, i.e. the number of
328	 * packets which are accepted from other layers while the
329	 * neighbour address is still being resolved
330	 */
331	uint32_t		ntp_queue_len;
332
333	/**
334	 * Number of requests to send to the user level ARP daemon.
335	 * Specify 0 to disable.
336	 */
337	uint32_t		ntp_app_probes;
338
339	/**
340	 * Maximum number of retries for unicast solicitation.
341	 */
342	uint32_t		ntp_ucast_probes;
343
344	/**
345	 * Maximum number of retries for multicast solicitation.
346	 */
347	uint32_t		ntp_mcast_probes;
348
349	/**
350	 * Base value in milliseconds to ompute reachable time, see RFC2461.
351	 */
352	uint64_t		ntp_base_reachable_time;
353
354	/**
355	 * Actual reachable time (read-only)
356	 */
357	uint64_t		ntp_reachable_time;	/* secs */
358
359	/**
360	 * The time in milliseconds between retransmitted Neighbor
361	 * Solicitation messages.
362	 */
363	uint64_t		ntp_retrans_time;
364
365	/**
366	 * Interval in milliseconds to check for stale neighbour
367	 * entries.
368	 */
369	uint64_t		ntp_gc_stale_time;	/* secs */
370
371	/**
372	 * Delay in milliseconds for the first time probe if
373	 * the neighbour is reachable.
374	 */
375	uint64_t		ntp_probe_delay;	/* secs */
376
377	/**
378	 * Maximum delay in milliseconds of an answer to a neighbour
379	 * solicitation message.
380	 */
381	uint64_t		ntp_anycast_delay;
382
383	/**
384	 * Minimum age in milliseconds before a neighbour entry
385	 * may be replaced.
386	 */
387	uint64_t		ntp_locktime;
388
389	/**
390	 * Delay in milliseconds before answering to an ARP request
391	 * for which a proxy ARP entry exists.
392	 */
393	uint64_t		ntp_proxy_delay;
394
395	/**
396	 * Queue length for the delayed proxy arp requests.
397	 */
398	uint32_t		ntp_proxy_qlen;
399
400	/**
401	 * Mask of available parameter attributes
402	 */
403	uint32_t		ntp_mask;
404};
405
406#define NTBLNAMSIZ	32
407
408/**
409 * Neighbour table
410 * @ingroup neightbl
411 */
412struct rtnl_neightbl
413{
414	NLHDR_COMMON
415
416	char			nt_name[NTBLNAMSIZ];
417	uint32_t		nt_family;
418	uint32_t		nt_gc_thresh1;
419	uint32_t		nt_gc_thresh2;
420	uint32_t		nt_gc_thresh3;
421	uint64_t		nt_gc_interval;
422	struct ndt_config	nt_config;
423	struct rtnl_neightbl_parms nt_parms;
424	struct ndt_stats	nt_stats;
425};
426
427struct rtnl_ratespec
428{
429	uint8_t			rs_cell_log;
430	uint16_t		rs_feature;
431	uint16_t		rs_addend;
432	uint16_t		rs_mpu;
433	uint32_t		rs_rate;
434};
435
436struct rtnl_tstats
437{
438	struct {
439		uint64_t            bytes;
440		uint64_t            packets;
441	} tcs_basic;
442
443	struct {
444		uint32_t            bps;
445		uint32_t            pps;
446	} tcs_rate_est;
447
448	struct {
449		uint32_t            qlen;
450		uint32_t            backlog;
451		uint32_t            drops;
452		uint32_t            requeues;
453		uint32_t            overlimits;
454	} tcs_queue;
455};
456
457#define TCKINDSIZ	32
458
459#define NL_TCA_GENERIC(pre)				\
460	NLHDR_COMMON					\
461	uint32_t		pre ##_family;		\
462	uint32_t		pre ##_ifindex;		\
463	uint32_t		pre ##_handle;		\
464	uint32_t		pre ##_parent;		\
465	uint32_t		pre ##_info;		\
466	char			pre ##_kind[TCKINDSIZ];	\
467	struct nl_data *	pre ##_opts;		\
468	uint64_t		pre ##_stats[RTNL_TC_STATS_MAX+1]; \
469	struct nl_data *	pre ##_xstats;		\
470	void *			pre ##_subdata;		\
471
472
473struct rtnl_tca
474{
475	NL_TCA_GENERIC(tc);
476};
477
478struct rtnl_qdisc
479{
480	NL_TCA_GENERIC(q);
481	struct rtnl_qdisc_ops	*q_ops;
482};
483
484struct rtnl_class
485{
486	NL_TCA_GENERIC(c);
487	struct rtnl_class_ops	*c_ops;
488};
489
490struct rtnl_cls
491{
492	NL_TCA_GENERIC(c);
493	uint32_t	c_prio;
494	uint32_t	c_protocol;
495	struct rtnl_cls_ops	*c_ops;
496};
497
498struct rtnl_u32
499{
500	uint32_t		cu_divisor;
501	uint32_t		cu_hash;
502	uint32_t		cu_classid;
503	uint32_t		cu_link;
504	struct nl_data *	cu_pcnt;
505	struct nl_data *	cu_selector;
506	struct nl_data *	cu_act;
507	struct nl_data *	cu_police;
508	char			cu_indev[IFNAMSIZ];
509	int			cu_mask;
510};
511
512struct rtnl_fw
513{
514	uint32_t		cf_classid;
515	struct nl_data *	cf_act;
516	struct nl_data *	cf_police;
517	char			cf_indev[IFNAMSIZ];
518	int			cf_mask;
519};
520
521struct rtnl_dsmark_qdisc
522{
523	uint16_t	qdm_indices;
524	uint16_t	qdm_default_index;
525	uint32_t	qdm_set_tc_index;
526	uint32_t	qdm_mask;
527};
528
529struct rtnl_dsmark_class
530{
531	uint8_t		cdm_bmask;
532	uint8_t		cdm_value;
533	uint32_t	cdm_mask;
534};
535
536struct rtnl_fifo
537{
538	uint32_t	qf_limit;
539	uint32_t	qf_mask;
540};
541
542struct rtnl_prio
543{
544	uint32_t	qp_bands;
545	uint8_t		qp_priomap[TC_PRIO_MAX+1];
546	uint32_t	qp_mask;
547};
548
549struct rtnl_tbf
550{
551	uint32_t		qt_limit;
552	uint32_t		qt_mpu;
553	struct rtnl_ratespec	qt_rate;
554	uint32_t		qt_rate_bucket;
555	uint32_t		qt_rate_txtime;
556	struct rtnl_ratespec	qt_peakrate;
557	uint32_t		qt_peakrate_bucket;
558	uint32_t		qt_peakrate_txtime;
559	uint32_t		qt_mask;
560};
561
562struct rtnl_sfq
563{
564	uint32_t	qs_quantum;
565	uint32_t	qs_perturb;
566	uint32_t	qs_limit;
567	uint32_t	qs_divisor;
568	uint32_t	qs_flows;
569	uint32_t	qs_mask;
570};
571
572struct rtnl_netem_corr
573{
574	uint32_t	nmc_delay;
575	uint32_t	nmc_loss;
576	uint32_t	nmc_duplicate;
577};
578
579struct rtnl_netem_reo
580{
581	uint32_t	nmro_probability;
582	uint32_t	nmro_correlation;
583};
584
585struct rtnl_netem
586{
587	uint32_t		qnm_latency;
588	uint32_t		qnm_limit;
589	uint32_t		qnm_loss;
590	uint32_t		qnm_gap;
591	uint32_t		qnm_duplicate;
592	uint32_t		qnm_jitter;
593	uint32_t		qnm_mask;
594	struct rtnl_netem_corr	qnm_corr;
595	struct rtnl_netem_reo	qnm_ro;
596};
597
598struct rtnl_htb_qdisc
599{
600	uint32_t		qh_rate2quantum;
601	uint32_t		qh_defcls;
602	uint32_t		qh_mask;
603};
604
605struct rtnl_htb_class
606{
607	uint32_t		ch_prio;
608	uint32_t		ch_mtu;
609	struct rtnl_ratespec	ch_rate;
610	struct rtnl_ratespec	ch_ceil;
611	uint32_t		ch_rbuffer;
612	uint32_t		ch_cbuffer;
613	uint32_t		ch_quantum;
614	uint8_t			ch_overhead;
615	uint8_t			ch_mpu;
616	uint32_t		ch_mask;
617};
618
619struct rtnl_cbq
620{
621	struct tc_cbq_lssopt    cbq_lss;
622	struct tc_ratespec      cbq_rate;
623	struct tc_cbq_wrropt    cbq_wrr;
624	struct tc_cbq_ovl       cbq_ovl;
625	struct tc_cbq_fopt      cbq_fopt;
626	struct tc_cbq_police    cbq_police;
627};
628
629struct rtnl_red
630{
631	uint32_t	qr_limit;
632	uint32_t	qr_qth_min;
633	uint32_t	qr_qth_max;
634	uint8_t		qr_flags;
635	uint8_t		qr_wlog;
636	uint8_t		qr_plog;
637	uint8_t		qr_scell_log;
638	uint32_t	qr_mask;
639};
640
641struct flnl_request
642{
643	NLHDR_COMMON
644
645	struct nl_addr *	lr_addr;
646	uint32_t		lr_fwmark;
647	uint8_t			lr_tos;
648	uint8_t			lr_scope;
649	uint8_t			lr_table;
650};
651
652
653struct flnl_result
654{
655	NLHDR_COMMON
656
657	struct flnl_request *	fr_req;
658	uint8_t			fr_table_id;
659	uint8_t			fr_prefixlen;
660	uint8_t			fr_nh_sel;
661	uint8_t			fr_type;
662	uint8_t			fr_scope;
663	uint32_t		fr_error;
664};
665
666#define GENL_OP_HAS_POLICY	1
667#define GENL_OP_HAS_DOIT	2
668#define GENL_OP_HAS_DUMPIT	4
669
670struct genl_family_op
671{
672	uint32_t		o_id;
673	uint32_t		o_flags;
674
675	struct nl_list_head	o_list;
676};
677
678struct genl_family
679{
680	NLHDR_COMMON
681
682	uint16_t		gf_id;
683	char 			gf_name[GENL_NAMSIZ];
684	uint32_t		gf_version;
685	uint32_t		gf_hdrsize;
686	uint32_t		gf_maxattr;
687
688	struct nl_list_head	gf_ops;
689};
690
691union nfnl_ct_proto
692{
693	struct {
694		uint16_t	src;
695		uint16_t	dst;
696	} port;
697	struct {
698		uint16_t	id;
699		uint8_t		type;
700		uint8_t		code;
701	} icmp;
702};
703
704struct nfnl_ct_dir {
705	struct nl_addr *	src;
706	struct nl_addr *	dst;
707	union nfnl_ct_proto	proto;
708	uint64_t		packets;
709	uint64_t		bytes;
710};
711
712union nfnl_ct_protoinfo {
713	struct {
714		uint8_t		state;
715	} tcp;
716};
717
718struct nfnl_ct {
719	NLHDR_COMMON
720
721	uint8_t			ct_family;
722	uint8_t			ct_proto;
723	union nfnl_ct_protoinfo	ct_protoinfo;
724
725	uint32_t		ct_status;
726	uint32_t		ct_status_mask;
727	uint32_t		ct_timeout;
728	uint32_t		ct_mark;
729	uint32_t		ct_use;
730	uint32_t		ct_id;
731
732	struct nfnl_ct_dir	ct_orig;
733	struct nfnl_ct_dir	ct_repl;
734};
735
736struct nfnl_log {
737	NLHDR_COMMON
738
739	uint8_t			log_family;
740	uint8_t			log_hook;
741	uint16_t		log_hwproto;
742	uint32_t		log_mark;
743	struct timeval		log_timestamp;
744	uint32_t		log_indev;
745	uint32_t		log_outdev;
746	uint32_t		log_physindev;
747	uint32_t		log_physoutdev;
748	uint8_t			log_hwaddr[8];
749	int			log_hwaddr_len;
750	void *			log_payload;
751	int			log_payload_len;
752	char *			log_prefix;
753	uint32_t		log_uid;
754	uint32_t		log_seq;
755	uint32_t		log_seq_global;
756};
757
758#endif
759