xref: /aosp_15_r20/external/libnl/lib/route/link/link-api.h (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker  * Copyright (c) 2003-2013 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker #ifndef NETLINK_LINK_API_H_
7*4dc78e53SAndroid Build Coastguard Worker #define NETLINK_LINK_API_H_
8*4dc78e53SAndroid Build Coastguard Worker 
9*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link.h>
11*4dc78e53SAndroid Build Coastguard Worker 
12*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/nl-core.h"
13*4dc78e53SAndroid Build Coastguard Worker 
14*4dc78e53SAndroid Build Coastguard Worker /**
15*4dc78e53SAndroid Build Coastguard Worker  * @ingroup link_api
16*4dc78e53SAndroid Build Coastguard Worker  *
17*4dc78e53SAndroid Build Coastguard Worker  * Available operations to modules implementing a link info type.
18*4dc78e53SAndroid Build Coastguard Worker  */
19*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link_info_ops
20*4dc78e53SAndroid Build Coastguard Worker {
21*4dc78e53SAndroid Build Coastguard Worker 	/** Name of link info type, must match name on kernel side */
22*4dc78e53SAndroid Build Coastguard Worker 	char *		io_name;
23*4dc78e53SAndroid Build Coastguard Worker 
24*4dc78e53SAndroid Build Coastguard Worker 	/** Reference count, DO NOT MODIFY */
25*4dc78e53SAndroid Build Coastguard Worker 	int		io_refcnt;
26*4dc78e53SAndroid Build Coastguard Worker 
27*4dc78e53SAndroid Build Coastguard Worker 	/** Called to assign an info type to a link.
28*4dc78e53SAndroid Build Coastguard Worker 	 * Has to allocate enough resources to hold attributes. Can
29*4dc78e53SAndroid Build Coastguard Worker 	 * use link->l_info to store a pointer. */
30*4dc78e53SAndroid Build Coastguard Worker 	int	      (*io_alloc)(struct rtnl_link *);
31*4dc78e53SAndroid Build Coastguard Worker 
32*4dc78e53SAndroid Build Coastguard Worker 	/** Called to parse the link info attribute.
33*4dc78e53SAndroid Build Coastguard Worker 	 * Must parse the attribute and assign all values to the link.
34*4dc78e53SAndroid Build Coastguard Worker 	 */
35*4dc78e53SAndroid Build Coastguard Worker 	int	      (*io_parse)(struct rtnl_link *,
36*4dc78e53SAndroid Build Coastguard Worker 				  struct nlattr *,
37*4dc78e53SAndroid Build Coastguard Worker 				  struct nlattr *);
38*4dc78e53SAndroid Build Coastguard Worker 
39*4dc78e53SAndroid Build Coastguard Worker 	/** Called when the link object is dumped.
40*4dc78e53SAndroid Build Coastguard Worker 	 * Must dump the info type specific attributes. */
41*4dc78e53SAndroid Build Coastguard Worker 	void	      (*io_dump[NL_DUMP_MAX+1])(struct rtnl_link *,
42*4dc78e53SAndroid Build Coastguard Worker 						struct nl_dump_params *);
43*4dc78e53SAndroid Build Coastguard Worker 
44*4dc78e53SAndroid Build Coastguard Worker 	/** Called when a link object is cloned.
45*4dc78e53SAndroid Build Coastguard Worker 	 * Must clone all info type specific attributes. */
46*4dc78e53SAndroid Build Coastguard Worker 	int	      (*io_clone)(struct rtnl_link *, struct rtnl_link *);
47*4dc78e53SAndroid Build Coastguard Worker 
48*4dc78e53SAndroid Build Coastguard Worker 	/** Called when construction a link netlink message.
49*4dc78e53SAndroid Build Coastguard Worker 	 * Must append all info type specific attributes to the message. */
50*4dc78e53SAndroid Build Coastguard Worker 	int	      (*io_put_attrs)(struct nl_msg *, struct rtnl_link *);
51*4dc78e53SAndroid Build Coastguard Worker 
52*4dc78e53SAndroid Build Coastguard Worker 	/** Called to release all resources previously allocated
53*4dc78e53SAndroid Build Coastguard Worker 	 * in either io_alloc() or io_parse(). */
54*4dc78e53SAndroid Build Coastguard Worker 	void	      (*io_free)(struct rtnl_link *);
55*4dc78e53SAndroid Build Coastguard Worker 
56*4dc78e53SAndroid Build Coastguard Worker 	/** Called to compare link info parameters between two links. */
57*4dc78e53SAndroid Build Coastguard Worker 	int	      (*io_compare)(struct rtnl_link *, struct rtnl_link *,
58*4dc78e53SAndroid Build Coastguard Worker 				    int flags);
59*4dc78e53SAndroid Build Coastguard Worker 
60*4dc78e53SAndroid Build Coastguard Worker 	struct nl_list_head		io_list;
61*4dc78e53SAndroid Build Coastguard Worker };
62*4dc78e53SAndroid Build Coastguard Worker 
63*4dc78e53SAndroid Build Coastguard Worker extern struct rtnl_link_info_ops *rtnl_link_info_ops_lookup(const char *);
64*4dc78e53SAndroid Build Coastguard Worker extern void			rtnl_link_info_ops_get(struct rtnl_link_info_ops *);
65*4dc78e53SAndroid Build Coastguard Worker extern void			rtnl_link_info_ops_put(struct rtnl_link_info_ops *);
66*4dc78e53SAndroid Build Coastguard Worker extern int			rtnl_link_register_info(struct rtnl_link_info_ops *);
67*4dc78e53SAndroid Build Coastguard Worker extern int			rtnl_link_unregister_info(struct rtnl_link_info_ops *);
68*4dc78e53SAndroid Build Coastguard Worker 
69*4dc78e53SAndroid Build Coastguard Worker 
70*4dc78e53SAndroid Build Coastguard Worker /**
71*4dc78e53SAndroid Build Coastguard Worker  * @ingroup link_api
72*4dc78e53SAndroid Build Coastguard Worker  *
73*4dc78e53SAndroid Build Coastguard Worker  * Available operations to modules implementing a link address family.
74*4dc78e53SAndroid Build Coastguard Worker  */
75*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link_af_ops
76*4dc78e53SAndroid Build Coastguard Worker {
77*4dc78e53SAndroid Build Coastguard Worker 	/** The address family this operations set implements */
78*4dc78e53SAndroid Build Coastguard Worker 	const unsigned int	ao_family;
79*4dc78e53SAndroid Build Coastguard Worker 
80*4dc78e53SAndroid Build Coastguard Worker 	/** Number of users of this operations, DO NOT MODIFY. */
81*4dc78e53SAndroid Build Coastguard Worker 	int			ao_refcnt;
82*4dc78e53SAndroid Build Coastguard Worker 
83*4dc78e53SAndroid Build Coastguard Worker 	/** Validation policy for IFLA_PROTINFO attribute. This pointer
84*4dc78e53SAndroid Build Coastguard Worker 	 * can be set to a nla_policy structure describing the minimal
85*4dc78e53SAndroid Build Coastguard Worker 	 * requirements the attribute must meet. Failure of meeting these
86*4dc78e53SAndroid Build Coastguard Worker 	 * requirements will result in a parsing error. */
87*4dc78e53SAndroid Build Coastguard Worker 	const struct nla_policy *ao_protinfo_policy;
88*4dc78e53SAndroid Build Coastguard Worker 
89*4dc78e53SAndroid Build Coastguard Worker 	/** Called after address family has been assigned to link. Must
90*4dc78e53SAndroid Build Coastguard Worker 	 * allocate data buffer to hold address family specific data and
91*4dc78e53SAndroid Build Coastguard Worker 	 * store it in link->l_af_data. */
92*4dc78e53SAndroid Build Coastguard Worker 	void *		      (*ao_alloc)(struct rtnl_link *);
93*4dc78e53SAndroid Build Coastguard Worker 
94*4dc78e53SAndroid Build Coastguard Worker 	/** Called when the link is cloned, must allocate a clone of the
95*4dc78e53SAndroid Build Coastguard Worker 	 * address family specific buffer and return it. */
96*4dc78e53SAndroid Build Coastguard Worker 	void *		      (*ao_clone)(struct rtnl_link *, void *);
97*4dc78e53SAndroid Build Coastguard Worker 
98*4dc78e53SAndroid Build Coastguard Worker 	/** Called when the link gets freed. Must free all allocated data */
99*4dc78e53SAndroid Build Coastguard Worker 	void		      (*ao_free)(struct rtnl_link *, void *);
100*4dc78e53SAndroid Build Coastguard Worker 
101*4dc78e53SAndroid Build Coastguard Worker 	/** Called if a IFLA_PROTINFO attribute needs to be parsed. Typically
102*4dc78e53SAndroid Build Coastguard Worker 	 * stores the parsed data in the address family specific buffer. */
103*4dc78e53SAndroid Build Coastguard Worker 	int		      (*ao_parse_protinfo)(struct rtnl_link *,
104*4dc78e53SAndroid Build Coastguard Worker 						   struct nlattr *, void *);
105*4dc78e53SAndroid Build Coastguard Worker 
106*4dc78e53SAndroid Build Coastguard Worker 	/** Called if a IFLA_AF_SPEC attribute needs to be parsed. Typically
107*4dc78e53SAndroid Build Coastguard Worker 	 * stores the parsed data in the address family specific buffer. */
108*4dc78e53SAndroid Build Coastguard Worker 	int		      (*ao_parse_af)(struct rtnl_link *,
109*4dc78e53SAndroid Build Coastguard Worker 					     struct nlattr *, void *);
110*4dc78e53SAndroid Build Coastguard Worker 
111*4dc78e53SAndroid Build Coastguard Worker 	/** Called if a link message is sent to the kernel. Must append the
112*4dc78e53SAndroid Build Coastguard Worker 	 * link address family specific attributes to the message. */
113*4dc78e53SAndroid Build Coastguard Worker 	int		      (*ao_fill_af)(struct rtnl_link *,
114*4dc78e53SAndroid Build Coastguard Worker 					    struct nl_msg *msg, void *);
115*4dc78e53SAndroid Build Coastguard Worker 
116*4dc78e53SAndroid Build Coastguard Worker 	/** Called if the full IFLA_AF_SPEC data needs to be parsed. Typically
117*4dc78e53SAndroid Build Coastguard Worker 	 * stores the parsed data in the address family specific buffer. */
118*4dc78e53SAndroid Build Coastguard Worker 	int                   (*ao_parse_af_full)(struct rtnl_link *,
119*4dc78e53SAndroid Build Coastguard Worker 	                                          struct nlattr *, void *);
120*4dc78e53SAndroid Build Coastguard Worker 
121*4dc78e53SAndroid Build Coastguard Worker 	/** Called for GETLINK message to the kernel. Used to append
122*4dc78e53SAndroid Build Coastguard Worker 	 * link address family specific attributes to the request message. */
123*4dc78e53SAndroid Build Coastguard Worker 	int		      (*ao_get_af)(struct nl_msg *msg,
124*4dc78e53SAndroid Build Coastguard Worker 					   uint32_t *ext_filter_mask);
125*4dc78e53SAndroid Build Coastguard Worker 
126*4dc78e53SAndroid Build Coastguard Worker 	/** Dump address family specific link attributes */
127*4dc78e53SAndroid Build Coastguard Worker 	void		      (*ao_dump[NL_DUMP_MAX+1])(struct rtnl_link *,
128*4dc78e53SAndroid Build Coastguard Worker 							struct nl_dump_params *,
129*4dc78e53SAndroid Build Coastguard Worker 							void *);
130*4dc78e53SAndroid Build Coastguard Worker 
131*4dc78e53SAndroid Build Coastguard Worker 	/** Comparison function
132*4dc78e53SAndroid Build Coastguard Worker 	 *
133*4dc78e53SAndroid Build Coastguard Worker 	 * Will be called when two links are compared for their af data. It
134*4dc78e53SAndroid Build Coastguard Worker 	 * takes two link objects in question, an object specific bitmask
135*4dc78e53SAndroid Build Coastguard Worker 	 * defining which attributes should be compared and flags to control
136*4dc78e53SAndroid Build Coastguard Worker 	 * the behaviour
137*4dc78e53SAndroid Build Coastguard Worker 	 *
138*4dc78e53SAndroid Build Coastguard Worker 	 * The function must return a bitmask with the relevant bit set for
139*4dc78e53SAndroid Build Coastguard Worker 	 * each attribute that mismatches
140*4dc78e53SAndroid Build Coastguard Worker 	 */
141*4dc78e53SAndroid Build Coastguard Worker 	int		      (*ao_compare)(struct rtnl_link *,
142*4dc78e53SAndroid Build Coastguard Worker 					    struct rtnl_link *, int, uint32_t, int);
143*4dc78e53SAndroid Build Coastguard Worker 
144*4dc78e53SAndroid Build Coastguard Worker 	/* RTM_NEWLINK override
145*4dc78e53SAndroid Build Coastguard Worker 	 *
146*4dc78e53SAndroid Build Coastguard Worker 	 * Called if a change link request is set to the kernel. If this returns
147*4dc78e53SAndroid Build Coastguard Worker 	 * anything other than zero, RTM_NEWLINK will be overriden with
148*4dc78e53SAndroid Build Coastguard Worker 	 * RTM_SETLINK when rtnl_link_build_change_request() is called.
149*4dc78e53SAndroid Build Coastguard Worker 	 */
150*4dc78e53SAndroid Build Coastguard Worker 	int		      (*ao_override_rtm)(struct rtnl_link *);
151*4dc78e53SAndroid Build Coastguard Worker 
152*4dc78e53SAndroid Build Coastguard Worker 	/** Called if a link message is sent to the kernel. Must append the
153*4dc78e53SAndroid Build Coastguard Worker 	 * link protocol specific attributes to the message. (IFLA_PROTINFO) */
154*4dc78e53SAndroid Build Coastguard Worker 	int		      (*ao_fill_pi)(struct rtnl_link *,
155*4dc78e53SAndroid Build Coastguard Worker 								struct nl_msg *msg, void *);
156*4dc78e53SAndroid Build Coastguard Worker 
157*4dc78e53SAndroid Build Coastguard Worker 	/** PROTINFO type
158*4dc78e53SAndroid Build Coastguard Worker 	 *
159*4dc78e53SAndroid Build Coastguard Worker 	 * Called if a link message is sent to the kernel. If this is set,
160*4dc78e53SAndroid Build Coastguard Worker 	 * the default IFLA_PROTINFO is bitmasked with what is specified
161*4dc78e53SAndroid Build Coastguard Worker 	 * here. (eg. NLA_F_NESTED)
162*4dc78e53SAndroid Build Coastguard Worker 	 */
163*4dc78e53SAndroid Build Coastguard Worker 	const int ao_fill_pi_flags;
164*4dc78e53SAndroid Build Coastguard Worker 
165*4dc78e53SAndroid Build Coastguard Worker 	/** IFLA_AF_SPEC nesting override
166*4dc78e53SAndroid Build Coastguard Worker 	 *
167*4dc78e53SAndroid Build Coastguard Worker 	 * Called if a link message is sent to the kernel. If this is set,
168*4dc78e53SAndroid Build Coastguard Worker 	 * the AF specific nest is not created. Instead, AF specific attributes
169*4dc78e53SAndroid Build Coastguard Worker 	 * are nested directly in the IFLA_AF_SPEC attribute.
170*4dc78e53SAndroid Build Coastguard Worker 	 */
171*4dc78e53SAndroid Build Coastguard Worker 	 const int ao_fill_af_no_nest;
172*4dc78e53SAndroid Build Coastguard Worker };
173*4dc78e53SAndroid Build Coastguard Worker 
174*4dc78e53SAndroid Build Coastguard Worker extern struct rtnl_link_af_ops *rtnl_link_af_ops_lookup(unsigned int);
175*4dc78e53SAndroid Build Coastguard Worker extern void			rtnl_link_af_ops_put(struct rtnl_link_af_ops *);
176*4dc78e53SAndroid Build Coastguard Worker extern void *			rtnl_link_af_alloc(struct rtnl_link *,
177*4dc78e53SAndroid Build Coastguard Worker 						const struct rtnl_link_af_ops *);
178*4dc78e53SAndroid Build Coastguard Worker extern void *			rtnl_link_af_data(const struct rtnl_link *,
179*4dc78e53SAndroid Build Coastguard Worker 						const struct rtnl_link_af_ops *);
180*4dc78e53SAndroid Build Coastguard Worker extern int			rtnl_link_af_register(struct rtnl_link_af_ops *);
181*4dc78e53SAndroid Build Coastguard Worker extern int			rtnl_link_af_unregister(struct rtnl_link_af_ops *);
182*4dc78e53SAndroid Build Coastguard Worker extern int			rtnl_link_af_data_compare(struct rtnl_link *a,
183*4dc78e53SAndroid Build Coastguard Worker 							  struct rtnl_link *b,
184*4dc78e53SAndroid Build Coastguard Worker 							  int family);
185*4dc78e53SAndroid Build Coastguard Worker extern int			rtnl_link_info_data_compare(struct rtnl_link *a,
186*4dc78e53SAndroid Build Coastguard Worker 							    struct rtnl_link *b,
187*4dc78e53SAndroid Build Coastguard Worker 							    int flags);
188*4dc78e53SAndroid Build Coastguard Worker 
189*4dc78e53SAndroid Build Coastguard Worker extern struct rtnl_link *link_lookup(struct nl_cache *cache, int ifindex);
190*4dc78e53SAndroid Build Coastguard Worker 
191*4dc78e53SAndroid Build Coastguard Worker #endif
192