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