xref: /aosp_15_r20/external/libnl/doc/route.txt (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker////
2*4dc78e53SAndroid Build Coastguard Worker	vim.syntax: asciidoc
3*4dc78e53SAndroid Build Coastguard Worker
4*4dc78e53SAndroid Build Coastguard Worker	Copyright (c) 2011 Thomas Graf <[email protected]>
5*4dc78e53SAndroid Build Coastguard Worker////
6*4dc78e53SAndroid Build Coastguard Worker
7*4dc78e53SAndroid Build Coastguard WorkerRouting Family Netlink Library (libnl-route)
8*4dc78e53SAndroid Build Coastguard Worker============================================
9*4dc78e53SAndroid Build Coastguard WorkerThomas Graf <[email protected]>
10*4dc78e53SAndroid Build Coastguard Worker3.1, Aug 11 2011:
11*4dc78e53SAndroid Build Coastguard Worker
12*4dc78e53SAndroid Build Coastguard Worker== Introduction
13*4dc78e53SAndroid Build Coastguard Worker
14*4dc78e53SAndroid Build Coastguard WorkerThis library provides APIs to the kernel interfaces of the routing family.
15*4dc78e53SAndroid Build Coastguard Worker
16*4dc78e53SAndroid Build Coastguard Worker
17*4dc78e53SAndroid Build Coastguard WorkerNOTE: Work in progress.
18*4dc78e53SAndroid Build Coastguard Worker
19*4dc78e53SAndroid Build Coastguard Worker== Addresses
20*4dc78e53SAndroid Build Coastguard Worker
21*4dc78e53SAndroid Build Coastguard Worker[[route_link]]
22*4dc78e53SAndroid Build Coastguard Worker== Links (Network Devices)
23*4dc78e53SAndroid Build Coastguard Worker
24*4dc78e53SAndroid Build Coastguard WorkerThe link configuration interface is part of the +NETLINK_ROUTE+ protocol
25*4dc78e53SAndroid Build Coastguard Workerfamily and implements the following netlink message types:
26*4dc78e53SAndroid Build Coastguard Worker
27*4dc78e53SAndroid Build Coastguard Worker- View and modify the configuration of physical and virtual network devices.
28*4dc78e53SAndroid Build Coastguard Worker- Create and delete virtual network devices (e.g. dummy devices, VLAN devices,
29*4dc78e53SAndroid Build Coastguard Worker  tun devices, bridging devices, ...)
30*4dc78e53SAndroid Build Coastguard Worker- View and modify per link network configuration settings (e.g.
31*4dc78e53SAndroid Build Coastguard Worker  +net.ipv6.conf.eth0.accept_ra+, +net.ipv4.conf.eth1.forwarding+, ...)
32*4dc78e53SAndroid Build Coastguard Worker
33*4dc78e53SAndroid Build Coastguard Worker.Naming Convention (network device, link, interface)
34*4dc78e53SAndroid Build Coastguard Worker
35*4dc78e53SAndroid Build Coastguard WorkerIn networking several terms are commonly used to refer to network devices.
36*4dc78e53SAndroid Build Coastguard WorkerWhile they have distinct meanings they have been used interchangeably in
37*4dc78e53SAndroid Build Coastguard Workerthe past. Within the Linux kernel, the term _network device_ or _netdev_ is
38*4dc78e53SAndroid Build Coastguard Workercommonly used In user space the term _network interface_ is very common.
39*4dc78e53SAndroid Build Coastguard WorkerThe routing netlink protocol uses the term _link_ and so does the _iproute2_
40*4dc78e53SAndroid Build Coastguard Workerutility and most routing daemons.
41*4dc78e53SAndroid Build Coastguard Worker
42*4dc78e53SAndroid Build Coastguard Worker=== Netlink Protocol
43*4dc78e53SAndroid Build Coastguard Worker
44*4dc78e53SAndroid Build Coastguard WorkerThis section describes the protocol semantics of the netlink based link
45*4dc78e53SAndroid Build Coastguard Workerconfiguration interface. The following messages are defined:
46*4dc78e53SAndroid Build Coastguard Worker
47*4dc78e53SAndroid Build Coastguard Worker[options="header", cols="1,2,2"]
48*4dc78e53SAndroid Build Coastguard Worker|==============================================================================
49*4dc78e53SAndroid Build Coastguard Worker| Message Type   | User -> Kernel                    | Kernel -> User
50*4dc78e53SAndroid Build Coastguard Worker| +RTM_NEWLINK+  | Create or update virtual network device
51*4dc78e53SAndroid Build Coastguard Worker| Reply to +RTM_GETLINK+ request or notification of link added or updated
52*4dc78e53SAndroid Build Coastguard Worker| +RTM_DELLINK+  | Delete virtual network device
53*4dc78e53SAndroid Build Coastguard Worker| Notification of link deleted or disappeared
54*4dc78e53SAndroid Build Coastguard Worker| +RTM_GETLINK+  | Retrieve link configuration and statistics |
55*4dc78e53SAndroid Build Coastguard Worker| +RTM_SETLINK+  | Modify link configuration |
56*4dc78e53SAndroid Build Coastguard Worker|==============================================================================
57*4dc78e53SAndroid Build Coastguard Worker
58*4dc78e53SAndroid Build Coastguard WorkerSee link:core.html#core_msg_types[Netlink Library - Message Types] for more
59*4dc78e53SAndroid Build Coastguard Workerinformation on common semantics of these message types.
60*4dc78e53SAndroid Build Coastguard Worker
61*4dc78e53SAndroid Build Coastguard Worker==== Link Message Format
62*4dc78e53SAndroid Build Coastguard Worker
63*4dc78e53SAndroid Build Coastguard WorkerAll netlink link messages share a common header (+struct ifinfomsg+) which
64*4dc78e53SAndroid Build Coastguard Workeris appended after the netlink header (+struct nlmsghdr+).
65*4dc78e53SAndroid Build Coastguard Worker
66*4dc78e53SAndroid Build Coastguard Workerimage:ifinfomsg.png["Link Message Header"]
67*4dc78e53SAndroid Build Coastguard Worker
68*4dc78e53SAndroid Build Coastguard WorkerThe meaning of each field may differ depending on the message type. A
69*4dc78e53SAndroid Build Coastguard Worker+struct ifinfomsg+ is defined in +<linux/rtnetlink.h>+ to represent the
70*4dc78e53SAndroid Build Coastguard Workerheader.
71*4dc78e53SAndroid Build Coastguard Worker
72*4dc78e53SAndroid Build Coastguard WorkerAddress Family (8bit)::
73*4dc78e53SAndroid Build Coastguard WorkerThe address family is usually set to +AF_UNSPEC+ but may be specified in
74*4dc78e53SAndroid Build Coastguard Worker+RTM_GETLINK+ requests to limit the returned links to a specific address
75*4dc78e53SAndroid Build Coastguard Workerfamily.
76*4dc78e53SAndroid Build Coastguard Worker
77*4dc78e53SAndroid Build Coastguard WorkerLink Layer Type (16bit)::
78*4dc78e53SAndroid Build Coastguard WorkerCurrently only used in kernel->user messages to report the link layer type
79*4dc78e53SAndroid Build Coastguard Workerof a link. The value corresponds to the +ARPHRD_*+ defines found in
80*4dc78e53SAndroid Build Coastguard Worker+<linux/if_arp.h>+. Translation from/to strings can be done using the
81*4dc78e53SAndroid Build Coastguard Workerfunctions nl_llproto2str()/nl_str2llproto().
82*4dc78e53SAndroid Build Coastguard Worker
83*4dc78e53SAndroid Build Coastguard WorkerLink Index (32bit)::
84*4dc78e53SAndroid Build Coastguard WorkerCarries the interface index and is used to identify existing links.
85*4dc78e53SAndroid Build Coastguard Worker
86*4dc78e53SAndroid Build Coastguard WorkerFlags (32bit)::
87*4dc78e53SAndroid Build Coastguard WorkerIn kernel->user messages the value of this field represents the current
88*4dc78e53SAndroid Build Coastguard Workerstate of the link flags. In user->kernel messages this field is used to
89*4dc78e53SAndroid Build Coastguard Workerchange flags or set the initial flag state of new links. Note that in order
90*4dc78e53SAndroid Build Coastguard Workerto change a flag, the flag must also be set in the _Flags Change Mask_ field.
91*4dc78e53SAndroid Build Coastguard Worker
92*4dc78e53SAndroid Build Coastguard WorkerFlags Change Mask (32bit)::
93*4dc78e53SAndroid Build Coastguard WorkerThe primary use of this field is to specify a mask of flags that should be
94*4dc78e53SAndroid Build Coastguard Workerchanged based on the value of the _Flags_ field. A special meaning is given
95*4dc78e53SAndroid Build Coastguard Workerto this field when present in link notifications, see TODO.
96*4dc78e53SAndroid Build Coastguard Worker
97*4dc78e53SAndroid Build Coastguard WorkerAttributes (variable)::
98*4dc78e53SAndroid Build Coastguard WorkerAll link message types may carry netlink attributes. They are defined in the
99*4dc78e53SAndroid Build Coastguard Workerheader file <linux/if_link.h> and share the prefix +IFLA_+.
100*4dc78e53SAndroid Build Coastguard Worker
101*4dc78e53SAndroid Build Coastguard Worker==== Link Message Types
102*4dc78e53SAndroid Build Coastguard Worker
103*4dc78e53SAndroid Build Coastguard Worker.RTM_GETLINK (user->kernel)
104*4dc78e53SAndroid Build Coastguard Worker
105*4dc78e53SAndroid Build Coastguard WorkerLookup link by 1. interface index or 2. link name (+IFLA_IFNAME+) and return
106*4dc78e53SAndroid Build Coastguard Workera single +RTM_NEWLINK+ message containing the link configuration and statistics
107*4dc78e53SAndroid Build Coastguard Workeror a netlink error message if no such link was found.
108*4dc78e53SAndroid Build Coastguard Worker
109*4dc78e53SAndroid Build Coastguard Worker*Parameters:*
110*4dc78e53SAndroid Build Coastguard Worker
111*4dc78e53SAndroid Build Coastguard Worker* *Address family*
112*4dc78e53SAndroid Build Coastguard Worker** If the address family is set to +PF_BRIDGE+, only bridging devices will be
113*4dc78e53SAndroid Build Coastguard Worker   returned.
114*4dc78e53SAndroid Build Coastguard Worker** If the address family is set to +PF_INET6+, only ipv6 enabled devices will
115*4dc78e53SAndroid Build Coastguard Worker   be returned.
116*4dc78e53SAndroid Build Coastguard Worker
117*4dc78e53SAndroid Build Coastguard Worker*Flags:*
118*4dc78e53SAndroid Build Coastguard Worker
119*4dc78e53SAndroid Build Coastguard Worker* +NLM_F_DUMP+ If set, all links will be returned in form of a multipart
120*4dc78e53SAndroid Build Coastguard Worker  message.
121*4dc78e53SAndroid Build Coastguard Worker
122*4dc78e53SAndroid Build Coastguard Worker*Returns:*
123*4dc78e53SAndroid Build Coastguard Worker
124*4dc78e53SAndroid Build Coastguard Worker* +EINVAL+ if neither interface nor link name are set
125*4dc78e53SAndroid Build Coastguard Worker* +ENODEV+ if no link was found
126*4dc78e53SAndroid Build Coastguard Worker* +ENOBUFS+ if allocation failed
127*4dc78e53SAndroid Build Coastguard Worker
128*4dc78e53SAndroid Build Coastguard Worker.RTM_NEWLINK (user->kernel)
129*4dc78e53SAndroid Build Coastguard Worker
130*4dc78e53SAndroid Build Coastguard WorkerCreates a new or updates an existing link. Only virtual links may be created
131*4dc78e53SAndroid Build Coastguard Workerbut all links may be updated.
132*4dc78e53SAndroid Build Coastguard Worker
133*4dc78e53SAndroid Build Coastguard Worker*Flags:*
134*4dc78e53SAndroid Build Coastguard Worker
135*4dc78e53SAndroid Build Coastguard Worker- +NLM_F_CREATE+ Create link if it does not exist
136*4dc78e53SAndroid Build Coastguard Worker- +NLM_F_EXCL+ Return +EEXIST+ if link already exists
137*4dc78e53SAndroid Build Coastguard Worker
138*4dc78e53SAndroid Build Coastguard Worker*Returns:*
139*4dc78e53SAndroid Build Coastguard Worker
140*4dc78e53SAndroid Build Coastguard Worker- +EINVAL+ malformed message or invalid configuration parameters
141*4dc78e53SAndroid Build Coastguard Worker- +EAFNOSUPPORT+ if an address family specific configuration (+IFLA_AF_SPEC+)
142*4dc78e53SAndroid Build Coastguard Worker  is not supported.
143*4dc78e53SAndroid Build Coastguard Worker- +EOPNOTSUPP+ if the link does not support modification of parameters
144*4dc78e53SAndroid Build Coastguard Worker- +EEXIST+ if +NLM_F_EXCL+ was set and the link exists alraedy
145*4dc78e53SAndroid Build Coastguard Worker- +ENODEV+ if the link does not exist and +NLM_F_CREATE+ is not set
146*4dc78e53SAndroid Build Coastguard Worker
147*4dc78e53SAndroid Build Coastguard Worker.RTM_NEWLINK (kernel->user)
148*4dc78e53SAndroid Build Coastguard Worker
149*4dc78e53SAndroid Build Coastguard WorkerThis message type is used in reply to a +RTM_GETLINK+ request and carries
150*4dc78e53SAndroid Build Coastguard Workerthe configuration and statistics of a link. If multiple links need to
151*4dc78e53SAndroid Build Coastguard Workerbe sent, the messages will be sent in form of a multipart message.
152*4dc78e53SAndroid Build Coastguard Worker
153*4dc78e53SAndroid Build Coastguard WorkerThe message type is also used for notifications sent by the kernel to the
154*4dc78e53SAndroid Build Coastguard Workermulticast group +RTNLGRP_LINK+ to inform about various link events. It is
155*4dc78e53SAndroid Build Coastguard Workertherefore recommended to always use a separate link socket for link
156*4dc78e53SAndroid Build Coastguard Workernotifications in order to separate between the two message types.
157*4dc78e53SAndroid Build Coastguard Worker
158*4dc78e53SAndroid Build Coastguard WorkerTODO: document how to detect different notifications
159*4dc78e53SAndroid Build Coastguard Worker
160*4dc78e53SAndroid Build Coastguard Worker.RTM_DELLINK (user->kernel)
161*4dc78e53SAndroid Build Coastguard Worker
162*4dc78e53SAndroid Build Coastguard WorkerLookup link by 1. interface index or 2. link name (+IFLA_IFNAME+) and delete
163*4dc78e53SAndroid Build Coastguard Workerthe virtual link.
164*4dc78e53SAndroid Build Coastguard Worker
165*4dc78e53SAndroid Build Coastguard Worker*Returns:*
166*4dc78e53SAndroid Build Coastguard Worker
167*4dc78e53SAndroid Build Coastguard Worker* +EINVAL+ if neither interface nor link name are set
168*4dc78e53SAndroid Build Coastguard Worker* +ENODEV+ if no link was found
169*4dc78e53SAndroid Build Coastguard Worker* +ENOTSUPP+ if the operation is not supported (not a virtual link)
170*4dc78e53SAndroid Build Coastguard Worker
171*4dc78e53SAndroid Build Coastguard Worker.RTM_DELLINK (kernel->user)
172*4dc78e53SAndroid Build Coastguard Worker
173*4dc78e53SAndroid Build Coastguard WorkerNotification sent by the kernel to the multicast group +RTNLGRP_LINK+ when
174*4dc78e53SAndroid Build Coastguard Worker
175*4dc78e53SAndroid Build Coastguard Workera. a network device was unregistered (change == ~0)
176*4dc78e53SAndroid Build Coastguard Workerb. a bridging device was deleted (address family will be +PF_BRIDGE+)
177*4dc78e53SAndroid Build Coastguard Worker
178*4dc78e53SAndroid Build Coastguard Worker=== Get / List
179*4dc78e53SAndroid Build Coastguard Worker
180*4dc78e53SAndroid Build Coastguard Worker[[link_list]]
181*4dc78e53SAndroid Build Coastguard Worker==== Get list of links
182*4dc78e53SAndroid Build Coastguard Worker
183*4dc78e53SAndroid Build Coastguard WorkerTo retrieve the list of links in the kernel, allocate a new link cache
184*4dc78e53SAndroid Build Coastguard Workerusing +rtnl_link_alloc_cache()+ to hold the links. It will automatically
185*4dc78e53SAndroid Build Coastguard Workerconstruct and send a +RTM_GETLINK+ message requesting a dump of all links
186*4dc78e53SAndroid Build Coastguard Workerfrom the kernel and feed the returned +RTM_NEWLINK+ to the internal link
187*4dc78e53SAndroid Build Coastguard Workermessage parser which adds the returned links to the cache.
188*4dc78e53SAndroid Build Coastguard Worker
189*4dc78e53SAndroid Build Coastguard Worker[source,c]
190*4dc78e53SAndroid Build Coastguard Worker-----
191*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
192*4dc78e53SAndroid Build Coastguard Worker
193*4dc78e53SAndroid Build Coastguard Workerint rtnl_link_alloc_cache(struct nl_sock *sk, int family, struct nl_cache **result)
194*4dc78e53SAndroid Build Coastguard Worker-----
195*4dc78e53SAndroid Build Coastguard Worker
196*4dc78e53SAndroid Build Coastguard WorkerThe cache will contain link objects (+struct rtnl_link+, see <<link_object>>)
197*4dc78e53SAndroid Build Coastguard Workerand can be accessed using the standard cache functions. By setting the
198*4dc78e53SAndroid Build Coastguard Worker+family+ parameter to an address family other than +AF_UNSPEC+, the resulting
199*4dc78e53SAndroid Build Coastguard Workercache will only contain links supporting the specified address family.
200*4dc78e53SAndroid Build Coastguard Worker
201*4dc78e53SAndroid Build Coastguard WorkerThe following direct search functions are provided to search by interface
202*4dc78e53SAndroid Build Coastguard Workerindex and by link name:
203*4dc78e53SAndroid Build Coastguard Worker
204*4dc78e53SAndroid Build Coastguard Worker[source,c]
205*4dc78e53SAndroid Build Coastguard Worker-----
206*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
207*4dc78e53SAndroid Build Coastguard Worker
208*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *rtnl_link_get(struct nl_cache *cache, int ifindex);
209*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *rtnl_link_get_by_name(struct nl_cache *cache, const char *name);
210*4dc78e53SAndroid Build Coastguard Worker-----
211*4dc78e53SAndroid Build Coastguard Worker
212*4dc78e53SAndroid Build Coastguard Worker.Example: Link Cache
213*4dc78e53SAndroid Build Coastguard Worker
214*4dc78e53SAndroid Build Coastguard Worker[source,c]
215*4dc78e53SAndroid Build Coastguard Worker-----
216*4dc78e53SAndroid Build Coastguard Workerstruct nl_cache *cache;
217*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link;
218*4dc78e53SAndroid Build Coastguard Worker
219*4dc78e53SAndroid Build Coastguard Workerif (rtnl_link_alloc_cache(sock, AF_UNSPEC, &cache)) < 0)
220*4dc78e53SAndroid Build Coastguard Worker	/* error */
221*4dc78e53SAndroid Build Coastguard Worker
222*4dc78e53SAndroid Build Coastguard Workerif (!(link = rtnl_link_get_by_name(cache, "eth1")))
223*4dc78e53SAndroid Build Coastguard Worker	/* link does not exist */
224*4dc78e53SAndroid Build Coastguard Worker
225*4dc78e53SAndroid Build Coastguard Worker/* do something with link */
226*4dc78e53SAndroid Build Coastguard Worker
227*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
228*4dc78e53SAndroid Build Coastguard Workernl_cache_put(cache);
229*4dc78e53SAndroid Build Coastguard Worker-----
230*4dc78e53SAndroid Build Coastguard Worker
231*4dc78e53SAndroid Build Coastguard Worker[[link_direct_lookup]]
232*4dc78e53SAndroid Build Coastguard Worker==== Lookup Single Link (Direct Lookup)
233*4dc78e53SAndroid Build Coastguard Worker
234*4dc78e53SAndroid Build Coastguard WorkerIf only a single link is of interest, the link can be looked up directly
235*4dc78e53SAndroid Build Coastguard Workerwithout the use of a link cache using the function +rtnl_link_get_kernel()+.
236*4dc78e53SAndroid Build Coastguard Worker
237*4dc78e53SAndroid Build Coastguard Worker[source,c]
238*4dc78e53SAndroid Build Coastguard Worker-----
239*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
240*4dc78e53SAndroid Build Coastguard Worker
241*4dc78e53SAndroid Build Coastguard Workerint rtnl_link_get_kernel(struct nl_sock *sk, int ifindex, const char *name, struct rtnl_link **result);
242*4dc78e53SAndroid Build Coastguard Worker-----
243*4dc78e53SAndroid Build Coastguard Worker
244*4dc78e53SAndroid Build Coastguard WorkerIt will construct and send a +RTM_GETLINK+ request using the parameters
245*4dc78e53SAndroid Build Coastguard Workerprovided and wait for a +RTM_NEWLINK+ or netlink error message sent in
246*4dc78e53SAndroid Build Coastguard Workerreturn. If the link exists, the link is returned as link object
247*4dc78e53SAndroid Build Coastguard Worker(see <<link_object>>).
248*4dc78e53SAndroid Build Coastguard Worker
249*4dc78e53SAndroid Build Coastguard Worker.Example: Direct link lookup
250*4dc78e53SAndroid Build Coastguard Worker[source,c]
251*4dc78e53SAndroid Build Coastguard Worker-----
252*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link;
253*4dc78e53SAndroid Build Coastguard Worker
254*4dc78e53SAndroid Build Coastguard Workerif (rtnl_link_get_kernel(sock, 0, "eth1", &link) < 0)
255*4dc78e53SAndroid Build Coastguard Worker	/* error */
256*4dc78e53SAndroid Build Coastguard Worker
257*4dc78e53SAndroid Build Coastguard Worker/* do something with link */
258*4dc78e53SAndroid Build Coastguard Worker
259*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
260*4dc78e53SAndroid Build Coastguard Worker-----
261*4dc78e53SAndroid Build Coastguard Worker
262*4dc78e53SAndroid Build Coastguard WorkerNOTE: While using this function can save a substantial amount of bandwidth
263*4dc78e53SAndroid Build Coastguard Worker      on the netlink socket, the result will not be cached, subsequent calls
264*4dc78e53SAndroid Build Coastguard Worker      to rtnl_link_get_kernel() will always trigger sending a +RTM_GETLINK+
265*4dc78e53SAndroid Build Coastguard Worker      request.
266*4dc78e53SAndroid Build Coastguard Worker
267*4dc78e53SAndroid Build Coastguard Worker[[link_translate_ifindex]]
268*4dc78e53SAndroid Build Coastguard Worker==== Translating interface index to link name
269*4dc78e53SAndroid Build Coastguard Worker
270*4dc78e53SAndroid Build Coastguard WorkerApplications which require to translate interface index to a link name or
271*4dc78e53SAndroid Build Coastguard Workervice versa may use the following functions to do so. Both functions require
272*4dc78e53SAndroid Build Coastguard Workera filled link cache to work with.
273*4dc78e53SAndroid Build Coastguard Worker
274*4dc78e53SAndroid Build Coastguard Worker[source,c]
275*4dc78e53SAndroid Build Coastguard Worker-----
276*4dc78e53SAndroid Build Coastguard Workerchar *rtnl_link_i2name (struct nl_cache *cache, int ifindex, char *dst, size_t len);
277*4dc78e53SAndroid Build Coastguard Workerint rtnl_link_name2i (struct nl_cache *cache, const char *name);
278*4dc78e53SAndroid Build Coastguard Worker-----
279*4dc78e53SAndroid Build Coastguard Worker
280*4dc78e53SAndroid Build Coastguard Worker=== Add / Modify
281*4dc78e53SAndroid Build Coastguard Worker
282*4dc78e53SAndroid Build Coastguard WorkerSeveral types of virtual link can be added on the fly using the function
283*4dc78e53SAndroid Build Coastguard Worker+rtnl_link_add()+.
284*4dc78e53SAndroid Build Coastguard Worker
285*4dc78e53SAndroid Build Coastguard Worker[source,c]
286*4dc78e53SAndroid Build Coastguard Worker-----
287*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
288*4dc78e53SAndroid Build Coastguard Worker
289*4dc78e53SAndroid Build Coastguard Workerint rtnl_link_add(struct nl_sock *sk, struct rtnl_link *link, int flags);
290*4dc78e53SAndroid Build Coastguard Worker-----
291*4dc78e53SAndroid Build Coastguard Worker
292*4dc78e53SAndroid Build Coastguard Worker=== Delete
293*4dc78e53SAndroid Build Coastguard Worker
294*4dc78e53SAndroid Build Coastguard WorkerThe deletion of virtual links such as VLAN devices or dummy devices is done
295*4dc78e53SAndroid Build Coastguard Workerusing the function +rtnl_link_delete()+. The link passed on to the function
296*4dc78e53SAndroid Build Coastguard Workercan be a link from a link cache or it can be construct with the minimal
297*4dc78e53SAndroid Build Coastguard Workerattributes needed to identify the link.
298*4dc78e53SAndroid Build Coastguard Worker
299*4dc78e53SAndroid Build Coastguard Worker[source,c]
300*4dc78e53SAndroid Build Coastguard Worker-----
301*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
302*4dc78e53SAndroid Build Coastguard Worker
303*4dc78e53SAndroid Build Coastguard Workerint rtnl_link_delete(struct nl_sock *sk, const struct rtnl_link *link);
304*4dc78e53SAndroid Build Coastguard Worker-----
305*4dc78e53SAndroid Build Coastguard Worker
306*4dc78e53SAndroid Build Coastguard WorkerThe function will construct and send a +RTM_DELLINK+ request message and
307*4dc78e53SAndroid Build Coastguard Workerreturns any errors returned by the kernel.
308*4dc78e53SAndroid Build Coastguard Worker
309*4dc78e53SAndroid Build Coastguard Worker.Example: Delete link by name
310*4dc78e53SAndroid Build Coastguard Worker[source,c]
311*4dc78e53SAndroid Build Coastguard Worker-----
312*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link;
313*4dc78e53SAndroid Build Coastguard Worker
314*4dc78e53SAndroid Build Coastguard Workerif (!(link = rtnl_link_alloc()))
315*4dc78e53SAndroid Build Coastguard Worker	/* error */
316*4dc78e53SAndroid Build Coastguard Worker
317*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_name(link, "my_vlan");
318*4dc78e53SAndroid Build Coastguard Worker
319*4dc78e53SAndroid Build Coastguard Workerif (rtnl_link_delete(sock, link) < 0)
320*4dc78e53SAndroid Build Coastguard Worker	/* error */
321*4dc78e53SAndroid Build Coastguard Worker
322*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
323*4dc78e53SAndroid Build Coastguard Worker-----
324*4dc78e53SAndroid Build Coastguard Worker
325*4dc78e53SAndroid Build Coastguard Worker[[link_object]]
326*4dc78e53SAndroid Build Coastguard Worker=== Link Object
327*4dc78e53SAndroid Build Coastguard Worker
328*4dc78e53SAndroid Build Coastguard WorkerA link is represented by the structure +struct rtnl_link+. Instances may be
329*4dc78e53SAndroid Build Coastguard Workercreated with the function +rtnl_link_alloc()+ or via a link cache (see
330*4dc78e53SAndroid Build Coastguard Worker<<link_list>>) and are freed again using the function +rtnl_link_put()+.
331*4dc78e53SAndroid Build Coastguard Worker
332*4dc78e53SAndroid Build Coastguard Worker[source,c]
333*4dc78e53SAndroid Build Coastguard Worker-----
334*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
335*4dc78e53SAndroid Build Coastguard Worker
336*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *rtnl_link_alloc(void);
337*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_put(struct rtnl_link *link);
338*4dc78e53SAndroid Build Coastguard Worker-----
339*4dc78e53SAndroid Build Coastguard Worker
340*4dc78e53SAndroid Build Coastguard Worker[[link_attr_name]]
341*4dc78e53SAndroid Build Coastguard Worker==== Name
342*4dc78e53SAndroid Build Coastguard WorkerThe name serves as unique, human readable description of the link. By
343*4dc78e53SAndroid Build Coastguard Workerdefault, links are named based on their type and then enumerated, e.g.
344*4dc78e53SAndroid Build Coastguard Workereth0, eth1, ethn but they may be renamed at any time.
345*4dc78e53SAndroid Build Coastguard Worker
346*4dc78e53SAndroid Build Coastguard WorkerKernels >= 2.6.11 support identification by link name.
347*4dc78e53SAndroid Build Coastguard Worker
348*4dc78e53SAndroid Build Coastguard Worker[source,c]
349*4dc78e53SAndroid Build Coastguard Worker-----
350*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
351*4dc78e53SAndroid Build Coastguard Worker
352*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_name(struct rtnl_link *link, const char *name);
353*4dc78e53SAndroid Build Coastguard Workerchar *rtnl_link_get_name(struct rtnl_link *link);
354*4dc78e53SAndroid Build Coastguard Worker-----
355*4dc78e53SAndroid Build Coastguard Worker
356*4dc78e53SAndroid Build Coastguard Worker*Accepted link name format:* +[^ /]*+ (maximum length: 15 characters)
357*4dc78e53SAndroid Build Coastguard Worker
358*4dc78e53SAndroid Build Coastguard Worker[[link_attr_ifindex]]
359*4dc78e53SAndroid Build Coastguard Worker==== Interface Index (Identifier)
360*4dc78e53SAndroid Build Coastguard WorkerThe interface index is an integer uniquely identifying a link. If present
361*4dc78e53SAndroid Build Coastguard Workerin any link message, it will be used to identify an existing link.
362*4dc78e53SAndroid Build Coastguard Worker
363*4dc78e53SAndroid Build Coastguard Worker[source,c]
364*4dc78e53SAndroid Build Coastguard Worker-----
365*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
366*4dc78e53SAndroid Build Coastguard Worker
367*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_ifindex(struct rtnl_link *link, int ifindex);
368*4dc78e53SAndroid Build Coastguard Workerint rtnl_link_get_ifindex(struct rtnl_link *link);
369*4dc78e53SAndroid Build Coastguard Worker-----
370*4dc78e53SAndroid Build Coastguard Worker
371*4dc78e53SAndroid Build Coastguard Worker[[link_attr_group]]
372*4dc78e53SAndroid Build Coastguard Worker==== Group
373*4dc78e53SAndroid Build Coastguard WorkerEach link can be assigned a numeric group identifier to group a bunch of links
374*4dc78e53SAndroid Build Coastguard Workertogether and apply a set of changes to a group instead of just a single link.
375*4dc78e53SAndroid Build Coastguard Worker
376*4dc78e53SAndroid Build Coastguard Worker
377*4dc78e53SAndroid Build Coastguard Worker[source,c]
378*4dc78e53SAndroid Build Coastguard Worker-----
379*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
380*4dc78e53SAndroid Build Coastguard Worker
381*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_group(struct rtnl_link *link, uint32_t group);
382*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_link_get_group(struct rtnl_link *link);
383*4dc78e53SAndroid Build Coastguard Worker-----
384*4dc78e53SAndroid Build Coastguard Worker
385*4dc78e53SAndroid Build Coastguard Worker[[link_attr_address]]
386*4dc78e53SAndroid Build Coastguard Worker==== Link Layer Address
387*4dc78e53SAndroid Build Coastguard WorkerThe link layer address (e.g. MAC address).
388*4dc78e53SAndroid Build Coastguard Worker
389*4dc78e53SAndroid Build Coastguard Worker[source,c]
390*4dc78e53SAndroid Build Coastguard Worker-----
391*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
392*4dc78e53SAndroid Build Coastguard Worker
393*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_addr(struct rtnl_link *link, struct nl_addr *addr);
394*4dc78e53SAndroid Build Coastguard Workerstruct nl_addr *rtnl_link_get_addr(struct rtnl_link *link);
395*4dc78e53SAndroid Build Coastguard Worker-----
396*4dc78e53SAndroid Build Coastguard Worker
397*4dc78e53SAndroid Build Coastguard Worker[[link_attr_broadcast]]
398*4dc78e53SAndroid Build Coastguard Worker==== Broadcast Address
399*4dc78e53SAndroid Build Coastguard WorkerThe link layer broadcast address
400*4dc78e53SAndroid Build Coastguard Worker
401*4dc78e53SAndroid Build Coastguard Worker[source,c]
402*4dc78e53SAndroid Build Coastguard Worker-----
403*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
404*4dc78e53SAndroid Build Coastguard Worker
405*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_broadcast(struct rtnl_link *link, struct nl_addr *addr);
406*4dc78e53SAndroid Build Coastguard Workerstruct nl_addr *rtnl_link_get_broadcast(struct rtnl_link *link);
407*4dc78e53SAndroid Build Coastguard Worker-----
408*4dc78e53SAndroid Build Coastguard Worker
409*4dc78e53SAndroid Build Coastguard Worker[[link_attr_mtu]]
410*4dc78e53SAndroid Build Coastguard Worker==== MTU (Maximum Transmission Unit)
411*4dc78e53SAndroid Build Coastguard WorkerThe maximum transmission unit specifies the maximum packet size a network
412*4dc78e53SAndroid Build Coastguard Workerdevice can transmit or receive. This value may be lower than the capability
413*4dc78e53SAndroid Build Coastguard Workerof the physical network device.
414*4dc78e53SAndroid Build Coastguard Worker
415*4dc78e53SAndroid Build Coastguard Worker[source,c]
416*4dc78e53SAndroid Build Coastguard Worker-----
417*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
418*4dc78e53SAndroid Build Coastguard Worker
419*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_mtu(struct rtnl_link *link, unsigned int mtu);
420*4dc78e53SAndroid Build Coastguard Workerunsigned int rtnl_link_get_mtu(struct rtnl_link *link);
421*4dc78e53SAndroid Build Coastguard Worker-----
422*4dc78e53SAndroid Build Coastguard Worker
423*4dc78e53SAndroid Build Coastguard Worker[[link_attr_flags]]
424*4dc78e53SAndroid Build Coastguard Worker==== Flags
425*4dc78e53SAndroid Build Coastguard WorkerThe flags of a link enable or disable various link features or inform about
426*4dc78e53SAndroid Build Coastguard Workerthe state of the link.
427*4dc78e53SAndroid Build Coastguard Worker
428*4dc78e53SAndroid Build Coastguard Worker[source,c]
429*4dc78e53SAndroid Build Coastguard Worker-----
430*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
431*4dc78e53SAndroid Build Coastguard Worker
432*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_flags(struct rtnl_link *link, unsigned int flags);
433*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_unset_flags(struct rtnl_link *link, unsigned int flags);
434*4dc78e53SAndroid Build Coastguard Workerunsigned int rtnl_link_get_flags(struct rtnl_link *link);
435*4dc78e53SAndroid Build Coastguard Worker-----
436*4dc78e53SAndroid Build Coastguard Worker
437*4dc78e53SAndroid Build Coastguard Worker[options="compact"]
438*4dc78e53SAndroid Build Coastguard Worker[horizontal]
439*4dc78e53SAndroid Build Coastguard WorkerIFF_UP::           Link is up (administratively)
440*4dc78e53SAndroid Build Coastguard WorkerIFF_RUNNING::      Link is up and carrier is OK (RFC2863 OPER_UP)
441*4dc78e53SAndroid Build Coastguard WorkerIFF_LOWER_UP::     Link layer is operational
442*4dc78e53SAndroid Build Coastguard WorkerIFF_DORMANT::      Driver signals dormant
443*4dc78e53SAndroid Build Coastguard WorkerIFF_BROADCAST::    Link supports broadcasting
444*4dc78e53SAndroid Build Coastguard WorkerIFF_MULTICAST::    Link supports multicasting
445*4dc78e53SAndroid Build Coastguard WorkerIFF_ALLMULTI::     Link supports multicast routing
446*4dc78e53SAndroid Build Coastguard WorkerIFF_DEBUG::        Tell driver to do debugging (currently unused)
447*4dc78e53SAndroid Build Coastguard WorkerIFF_LOOPBACK::     Link loopback network
448*4dc78e53SAndroid Build Coastguard WorkerIFF_POINTOPOINT::  Point-to-point link
449*4dc78e53SAndroid Build Coastguard WorkerIFF_NOARP::        ARP is not supported
450*4dc78e53SAndroid Build Coastguard WorkerIFF_PROMISC::      Status of promiscuous mode
451*4dc78e53SAndroid Build Coastguard WorkerIFF_MASTER::       Master of a load balancer (bonding)
452*4dc78e53SAndroid Build Coastguard WorkerIFF_SLAVE::        Slave to a master link
453*4dc78e53SAndroid Build Coastguard WorkerIFF_PORTSEL::      Driver supports setting media type (only used by ARM ethernet)
454*4dc78e53SAndroid Build Coastguard WorkerIFF_AUTOMEDIA::    Link selects port automatically (only used by ARM ethernet)
455*4dc78e53SAndroid Build Coastguard WorkerIFF_ECHO::         Echo sent packets (testing feature, CAN only)
456*4dc78e53SAndroid Build Coastguard WorkerIFF_DYNAMIC::      Unused (BSD compatibility)
457*4dc78e53SAndroid Build Coastguard WorkerIFF_NOTRAILERS::   Unused (BSD compatibility)
458*4dc78e53SAndroid Build Coastguard Worker
459*4dc78e53SAndroid Build Coastguard WorkerTo translate a link flag to a link flag name or vice versa:
460*4dc78e53SAndroid Build Coastguard Worker
461*4dc78e53SAndroid Build Coastguard Worker[source,c]
462*4dc78e53SAndroid Build Coastguard Worker-----
463*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
464*4dc78e53SAndroid Build Coastguard Worker
465*4dc78e53SAndroid Build Coastguard Workerchar *rtnl_link_flags2str(int flags, char *buf, size_t size);
466*4dc78e53SAndroid Build Coastguard Workerint rtnl_link_str2flags(const char *flag_name);
467*4dc78e53SAndroid Build Coastguard Worker-----
468*4dc78e53SAndroid Build Coastguard Worker
469*4dc78e53SAndroid Build Coastguard Worker[[link_attr_txqlen]]
470*4dc78e53SAndroid Build Coastguard Worker==== Transmission Queue Length
471*4dc78e53SAndroid Build Coastguard Worker
472*4dc78e53SAndroid Build Coastguard WorkerThe transmission queue holds packets before packets are delivered to
473*4dc78e53SAndroid Build Coastguard Workerthe driver for transmission. It is usually specified in number of
474*4dc78e53SAndroid Build Coastguard Workerpackets but the unit may be specific to the link type.
475*4dc78e53SAndroid Build Coastguard Worker
476*4dc78e53SAndroid Build Coastguard Worker[source,c]
477*4dc78e53SAndroid Build Coastguard Worker-----
478*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
479*4dc78e53SAndroid Build Coastguard Worker
480*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_txqlen(struct rtnl_link *link, unsigned int txqlen);
481*4dc78e53SAndroid Build Coastguard Workerunsigned int rtnl_link_get_txqlen(struct rtnl_link *link);
482*4dc78e53SAndroid Build Coastguard Worker-----
483*4dc78e53SAndroid Build Coastguard Worker
484*4dc78e53SAndroid Build Coastguard Worker[[link_attr_operstate]]
485*4dc78e53SAndroid Build Coastguard Worker==== Operational Status
486*4dc78e53SAndroid Build Coastguard WorkerThe operational status has been introduced to provide extended information
487*4dc78e53SAndroid Build Coastguard Workeron the link status. Traditionally the link state has been described using
488*4dc78e53SAndroid Build Coastguard Workerthe link flags +IFF_UP, IFF_RUNNING, IFF_LOWER_UP+, and +IFF_DORMANT+ which
489*4dc78e53SAndroid Build Coastguard Workerwas no longer sufficient for some link types.
490*4dc78e53SAndroid Build Coastguard Worker
491*4dc78e53SAndroid Build Coastguard Worker[source,c]
492*4dc78e53SAndroid Build Coastguard Worker-----
493*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
494*4dc78e53SAndroid Build Coastguard Worker
495*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_operstate(struct rtnl_link *link, uint8_t state);
496*4dc78e53SAndroid Build Coastguard Workeruint8_t rtnl_link_get_operstate(struct rtnl_link *link);
497*4dc78e53SAndroid Build Coastguard Worker-----
498*4dc78e53SAndroid Build Coastguard Worker
499*4dc78e53SAndroid Build Coastguard Worker[options="compact"]
500*4dc78e53SAndroid Build Coastguard Worker[horizontal]
501*4dc78e53SAndroid Build Coastguard WorkerIF_OPER_UNKNOWN::          Unknown state
502*4dc78e53SAndroid Build Coastguard WorkerIF_OPER_NOTPRESENT::       Link not present
503*4dc78e53SAndroid Build Coastguard WorkerIF_OPER_DOWN::             Link down
504*4dc78e53SAndroid Build Coastguard WorkerIF_OPER_LOWERLAYERDOWN::   L1 down
505*4dc78e53SAndroid Build Coastguard WorkerIF_OPER_TESTING::          Testing
506*4dc78e53SAndroid Build Coastguard WorkerIF_OPER_DORMANT::          Dormant
507*4dc78e53SAndroid Build Coastguard WorkerIF_OPER_UP::               Link up
508*4dc78e53SAndroid Build Coastguard Worker
509*4dc78e53SAndroid Build Coastguard WorkerTranslation of operational status code to string and vice versa:
510*4dc78e53SAndroid Build Coastguard Worker
511*4dc78e53SAndroid Build Coastguard Worker[source,c]
512*4dc78e53SAndroid Build Coastguard Worker-----
513*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
514*4dc78e53SAndroid Build Coastguard Worker
515*4dc78e53SAndroid Build Coastguard Workerchar *rtnl_link_operstate2str(uint8_t state, char *buf, size_t size);
516*4dc78e53SAndroid Build Coastguard Workerint rtnl_link_str2operstate(const char *name);
517*4dc78e53SAndroid Build Coastguard Worker-----
518*4dc78e53SAndroid Build Coastguard Worker
519*4dc78e53SAndroid Build Coastguard Worker[[link_attr_mode]]
520*4dc78e53SAndroid Build Coastguard Worker==== Mode
521*4dc78e53SAndroid Build Coastguard WorkerCurrently known link modes are:
522*4dc78e53SAndroid Build Coastguard Worker
523*4dc78e53SAndroid Build Coastguard Worker[options="compact"]
524*4dc78e53SAndroid Build Coastguard Worker[horizontal]
525*4dc78e53SAndroid Build Coastguard WorkerIF_LINK_MODE_DEFAULT::   Default link mode
526*4dc78e53SAndroid Build Coastguard WorkerIF_LINK_MODE_DORMANT::   Limit upward transition to dormant
527*4dc78e53SAndroid Build Coastguard Worker
528*4dc78e53SAndroid Build Coastguard Worker[source,c]
529*4dc78e53SAndroid Build Coastguard Worker-----
530*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
531*4dc78e53SAndroid Build Coastguard Worker
532*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_linkmode(struct rtnl_link *link, uint8_t mode);
533*4dc78e53SAndroid Build Coastguard Workeruint8_t rtnl_link_get_linkmode(struct rtnl_link *link);
534*4dc78e53SAndroid Build Coastguard Worker-----
535*4dc78e53SAndroid Build Coastguard Worker
536*4dc78e53SAndroid Build Coastguard WorkerTranslation of link mode to string and vice versa:
537*4dc78e53SAndroid Build Coastguard Worker
538*4dc78e53SAndroid Build Coastguard Worker[source,c]
539*4dc78e53SAndroid Build Coastguard Worker-----
540*4dc78e53SAndroid Build Coastguard Workerchar *rtnl_link_mode2str(uint8_t mode, char *buf, size_t len);
541*4dc78e53SAndroid Build Coastguard Workeruint8_t rtnl_link_str2mode(const char *name);
542*4dc78e53SAndroid Build Coastguard Worker-----
543*4dc78e53SAndroid Build Coastguard Worker
544*4dc78e53SAndroid Build Coastguard Worker[[link_attr_alias]]
545*4dc78e53SAndroid Build Coastguard Worker==== IfAlias
546*4dc78e53SAndroid Build Coastguard WorkerAlternative name for the link, primarly used for SNMP IfAlias.
547*4dc78e53SAndroid Build Coastguard Worker
548*4dc78e53SAndroid Build Coastguard Worker[source,c]
549*4dc78e53SAndroid Build Coastguard Worker-----
550*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
551*4dc78e53SAndroid Build Coastguard Worker
552*4dc78e53SAndroid Build Coastguard Workerconst char *rtnl_link_get_ifalias(struct rtnl_link *link);
553*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_ifalias(struct rtnl_link *link, const char *alias);
554*4dc78e53SAndroid Build Coastguard Worker-----
555*4dc78e53SAndroid Build Coastguard Worker
556*4dc78e53SAndroid Build Coastguard Worker*Length limit:* 256
557*4dc78e53SAndroid Build Coastguard Worker
558*4dc78e53SAndroid Build Coastguard Worker[[link_attr_arptype]]
559*4dc78e53SAndroid Build Coastguard Worker==== Hardware Type
560*4dc78e53SAndroid Build Coastguard Worker
561*4dc78e53SAndroid Build Coastguard Worker[source,c]
562*4dc78e53SAndroid Build Coastguard Worker-----
563*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
564*4dc78e53SAndroid Build Coastguard Worker#include <linux/if_arp.h>
565*4dc78e53SAndroid Build Coastguard Worker
566*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_arptype(struct rtnl_link *link, unsigned int arptype);
567*4dc78e53SAndroid Build Coastguard Workerunsigned int rtnl_link_get_arptype(struct rtnl_link *link);
568*4dc78e53SAndroid Build Coastguard Worker----
569*4dc78e53SAndroid Build Coastguard Worker
570*4dc78e53SAndroid Build Coastguard WorkerTranslation of hardware type to character string and vice versa:
571*4dc78e53SAndroid Build Coastguard Worker
572*4dc78e53SAndroid Build Coastguard Worker[source,c]
573*4dc78e53SAndroid Build Coastguard Worker-----
574*4dc78e53SAndroid Build Coastguard Worker#include <netlink/utils.h>
575*4dc78e53SAndroid Build Coastguard Worker
576*4dc78e53SAndroid Build Coastguard Workerchar *nl_llproto2str(int arptype, char *buf, size_t len);
577*4dc78e53SAndroid Build Coastguard Workerint nl_str2llproto(const char *name);
578*4dc78e53SAndroid Build Coastguard Worker-----
579*4dc78e53SAndroid Build Coastguard Worker
580*4dc78e53SAndroid Build Coastguard Worker[[link_attr_qdisc]]
581*4dc78e53SAndroid Build Coastguard Worker==== Qdisc
582*4dc78e53SAndroid Build Coastguard WorkerThe name of the queueing discipline used by the link is of informational
583*4dc78e53SAndroid Build Coastguard Workernature only. It is a read-only attribute provided by the kernel and cannot
584*4dc78e53SAndroid Build Coastguard Workerbe modified. The set function is provided solely for the purpose of creating
585*4dc78e53SAndroid Build Coastguard Workerlink objects to be used for comparison.
586*4dc78e53SAndroid Build Coastguard Worker
587*4dc78e53SAndroid Build Coastguard WorkerFor more information on how to modify the qdisc of a link, see section
588*4dc78e53SAndroid Build Coastguard Worker<<route_tc>>.
589*4dc78e53SAndroid Build Coastguard Worker
590*4dc78e53SAndroid Build Coastguard Worker[source,c]
591*4dc78e53SAndroid Build Coastguard Worker-----
592*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
593*4dc78e53SAndroid Build Coastguard Worker
594*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_qdisc(struct rtnl_link *link, const char *name);
595*4dc78e53SAndroid Build Coastguard Workerchar *rtnl_link_get_qdisc(struct rtnl_link *link);
596*4dc78e53SAndroid Build Coastguard Worker-----
597*4dc78e53SAndroid Build Coastguard Worker
598*4dc78e53SAndroid Build Coastguard Worker[[link_attr_promiscuity]]
599*4dc78e53SAndroid Build Coastguard Worker==== Promiscuity
600*4dc78e53SAndroid Build Coastguard WorkerThe number of subsystem currently depending on the link being promiscuous mode.
601*4dc78e53SAndroid Build Coastguard WorkerA value of 0 indicates that the link is not in promiscuous mode. It is a
602*4dc78e53SAndroid Build Coastguard Workerread-only attribute provided by the kernel and cannot be modified. The set
603*4dc78e53SAndroid Build Coastguard Workerfunction is provided solely for the purpose of creating link objects to be
604*4dc78e53SAndroid Build Coastguard Workerused for comparison.
605*4dc78e53SAndroid Build Coastguard Worker
606*4dc78e53SAndroid Build Coastguard Worker[source,c]
607*4dc78e53SAndroid Build Coastguard Worker-----
608*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
609*4dc78e53SAndroid Build Coastguard Worker
610*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_promiscuity(struct rtnl_link *link, uint32_t count);
611*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_link_get_promiscuity(struct rtnl_link *link);
612*4dc78e53SAndroid Build Coastguard Worker-----
613*4dc78e53SAndroid Build Coastguard Worker
614*4dc78e53SAndroid Build Coastguard Worker[[link_num_rxtx_queues]]
615*4dc78e53SAndroid Build Coastguard Worker==== RX/TX Queues
616*4dc78e53SAndroid Build Coastguard WorkerThe number of RX/TX queues the link provides. The attribute is writable but
617*4dc78e53SAndroid Build Coastguard Workerwill only be considered when creating a new network device via netlink.
618*4dc78e53SAndroid Build Coastguard Worker
619*4dc78e53SAndroid Build Coastguard Worker[source,c]
620*4dc78e53SAndroid Build Coastguard Worker-----
621*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
622*4dc78e53SAndroid Build Coastguard Worker
623*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_num_tx_queues(struct rtnl_link *link, uint32_t nqueues);
624*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_link_get_num_tx_queues(struct rtnl_link *link);
625*4dc78e53SAndroid Build Coastguard Worker
626*4dc78e53SAndroid Build Coastguard Workervoid rtnl_link_set_num_rx_queues(struct rtnl_link *link, uint32_t nqueues);
627*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_link_get_num_rx_queues(struct rtnl_link *link);
628*4dc78e53SAndroid Build Coastguard Worker-----
629*4dc78e53SAndroid Build Coastguard Worker
630*4dc78e53SAndroid Build Coastguard Worker[[link_attr_weight]]
631*4dc78e53SAndroid Build Coastguard Worker==== Weight
632*4dc78e53SAndroid Build Coastguard WorkerThis attribute is unused and obsoleted in all recent kernels.
633*4dc78e53SAndroid Build Coastguard Worker
634*4dc78e53SAndroid Build Coastguard Worker
635*4dc78e53SAndroid Build Coastguard Worker[[link_modules]]
636*4dc78e53SAndroid Build Coastguard Worker=== Modules
637*4dc78e53SAndroid Build Coastguard Worker
638*4dc78e53SAndroid Build Coastguard Worker[[link_bonding]]
639*4dc78e53SAndroid Build Coastguard Worker==== Bonding
640*4dc78e53SAndroid Build Coastguard Worker
641*4dc78e53SAndroid Build Coastguard Worker.Example: Add bonding link
642*4dc78e53SAndroid Build Coastguard Worker[source,c]
643*4dc78e53SAndroid Build Coastguard Worker-----
644*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/link.h>
645*4dc78e53SAndroid Build Coastguard Worker
646*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link;
647*4dc78e53SAndroid Build Coastguard Worker
648*4dc78e53SAndroid Build Coastguard Workerlink = rtnl_link_bond_alloc();
649*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_name(link, "my_bond");
650*4dc78e53SAndroid Build Coastguard Worker
651*4dc78e53SAndroid Build Coastguard Worker/* requires admin privileges */
652*4dc78e53SAndroid Build Coastguard Workerif (rtnl_link_add(sk, link, NLM_F_CREATE) < 0)
653*4dc78e53SAndroid Build Coastguard Worker	/* error */
654*4dc78e53SAndroid Build Coastguard Worker
655*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
656*4dc78e53SAndroid Build Coastguard Worker-----
657*4dc78e53SAndroid Build Coastguard Worker
658*4dc78e53SAndroid Build Coastguard Worker[[link_vlan]]
659*4dc78e53SAndroid Build Coastguard Worker==== VLAN
660*4dc78e53SAndroid Build Coastguard Worker
661*4dc78e53SAndroid Build Coastguard Worker[source,c]
662*4dc78e53SAndroid Build Coastguard Worker-----
663*4dc78e53SAndroid Build Coastguard Workerextern char *		rtnl_link_vlan_flags2str(int, char *, size_t);
664*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_vlan_str2flags(const char *);
665*4dc78e53SAndroid Build Coastguard Worker
666*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_vlan_set_id(struct rtnl_link *, int);
667*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_vlan_get_id(struct rtnl_link *);
668*4dc78e53SAndroid Build Coastguard Worker
669*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_vlan_set_flags(struct rtnl_link *,
670*4dc78e53SAndroid Build Coastguard Worker						 unsigned int);
671*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_vlan_unset_flags(struct rtnl_link *,
672*4dc78e53SAndroid Build Coastguard Worker						   unsigned int);
673*4dc78e53SAndroid Build Coastguard Workerextern unsigned int	rtnl_link_vlan_get_flags(struct rtnl_link *);
674*4dc78e53SAndroid Build Coastguard Worker
675*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_vlan_set_ingress_map(struct rtnl_link *,
676*4dc78e53SAndroid Build Coastguard Worker						       int, uint32_t);
677*4dc78e53SAndroid Build Coastguard Workerextern uint32_t *	rtnl_link_vlan_get_ingress_map(struct rtnl_link *);
678*4dc78e53SAndroid Build Coastguard Worker
679*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_vlan_set_egress_map(struct rtnl_link *,
680*4dc78e53SAndroid Build Coastguard Worker						      uint32_t, int);
681*4dc78e53SAndroid Build Coastguard Workerextern struct vlan_map *rtnl_link_vlan_get_egress_map(struct rtnl_link *,
682*4dc78e53SAndroid Build Coastguard Worker						      int *);
683*4dc78e53SAndroid Build Coastguard Worker-----
684*4dc78e53SAndroid Build Coastguard Worker
685*4dc78e53SAndroid Build Coastguard Worker.Example: Add a VLAN device
686*4dc78e53SAndroid Build Coastguard Worker[source,c]
687*4dc78e53SAndroid Build Coastguard Worker-----
688*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link;
689*4dc78e53SAndroid Build Coastguard Workerint master_index;
690*4dc78e53SAndroid Build Coastguard Worker
691*4dc78e53SAndroid Build Coastguard Worker/* lookup interface index of eth0 */
692*4dc78e53SAndroid Build Coastguard Workerif (!(master_index = rtnl_link_name2i(link_cache, "eth0")))
693*4dc78e53SAndroid Build Coastguard Worker	/* error */
694*4dc78e53SAndroid Build Coastguard Worker
695*4dc78e53SAndroid Build Coastguard Worker/* allocate new link object of type vlan */
696*4dc78e53SAndroid Build Coastguard Workerlink = rtnl_link_vlan_alloc();
697*4dc78e53SAndroid Build Coastguard Worker
698*4dc78e53SAndroid Build Coastguard Worker/* set eth0 to be our master device */
699*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_link(link, master_index);
700*4dc78e53SAndroid Build Coastguard Worker
701*4dc78e53SAndroid Build Coastguard Workerrtnl_link_vlan_set_id(link, 10);
702*4dc78e53SAndroid Build Coastguard Worker
703*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
704*4dc78e53SAndroid Build Coastguard Worker	/* error */
705*4dc78e53SAndroid Build Coastguard Worker
706*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
707*4dc78e53SAndroid Build Coastguard Worker-----
708*4dc78e53SAndroid Build Coastguard Worker
709*4dc78e53SAndroid Build Coastguard Worker[[link_macvlan]]
710*4dc78e53SAndroid Build Coastguard Worker==== MACVLAN
711*4dc78e53SAndroid Build Coastguard Worker
712*4dc78e53SAndroid Build Coastguard Worker[source,c]
713*4dc78e53SAndroid Build Coastguard Worker-----
714*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_macvlan_alloc(void);
715*4dc78e53SAndroid Build Coastguard Worker
716*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_is_macvlan(struct rtnl_link *);
717*4dc78e53SAndroid Build Coastguard Worker
718*4dc78e53SAndroid Build Coastguard Workerextern char *		rtnl_link_macvlan_mode2str(int, char *, size_t);
719*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvlan_str2mode(const char *);
720*4dc78e53SAndroid Build Coastguard Worker
721*4dc78e53SAndroid Build Coastguard Workerextern char *		rtnl_link_macvlan_flags2str(int, char *, size_t);
722*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvlan_str2flags(const char *);
723*4dc78e53SAndroid Build Coastguard Worker
724*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvlan_set_mode(struct rtnl_link *,
725*4dc78e53SAndroid Build Coastguard Worker			                           uint32_t);
726*4dc78e53SAndroid Build Coastguard Workerextern uint32_t		rtnl_link_macvlan_get_mode(struct rtnl_link *);
727*4dc78e53SAndroid Build Coastguard Worker
728*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvlan_set_flags(struct rtnl_link *,
729*4dc78e53SAndroid Build Coastguard Worker						 uint16_t);
730*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvlan_unset_flags(struct rtnl_link *,
731*4dc78e53SAndroid Build Coastguard Worker						   uint16_t);
732*4dc78e53SAndroid Build Coastguard Workerextern uint16_t		rtnl_link_macvlan_get_flags(struct rtnl_link *);
733*4dc78e53SAndroid Build Coastguard Worker-----
734*4dc78e53SAndroid Build Coastguard Worker
735*4dc78e53SAndroid Build Coastguard Worker.Example: Add a MACVLAN device
736*4dc78e53SAndroid Build Coastguard Worker[source,c]
737*4dc78e53SAndroid Build Coastguard Worker-----
738*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link;
739*4dc78e53SAndroid Build Coastguard Workerint master_index;
740*4dc78e53SAndroid Build Coastguard Workerstruct nl_addr* addr;
741*4dc78e53SAndroid Build Coastguard Worker
742*4dc78e53SAndroid Build Coastguard Worker/* lookup interface index of eth0 */
743*4dc78e53SAndroid Build Coastguard Workerif (!(master_index = rtnl_link_name2i(link_cache, "eth0")))
744*4dc78e53SAndroid Build Coastguard Worker	/* error */
745*4dc78e53SAndroid Build Coastguard Worker
746*4dc78e53SAndroid Build Coastguard Worker/* allocate new link object of type macvlan */
747*4dc78e53SAndroid Build Coastguard Workerlink = rtnl_link_macvlan_alloc();
748*4dc78e53SAndroid Build Coastguard Worker
749*4dc78e53SAndroid Build Coastguard Worker/* set eth0 to be our master device */
750*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_link(link, master_index);
751*4dc78e53SAndroid Build Coastguard Worker
752*4dc78e53SAndroid Build Coastguard Worker/* set address of virtual interface */
753*4dc78e53SAndroid Build Coastguard Workeraddr = nl_addr_build(AF_LLC, ether_aton("00:11:22:33:44:55"), ETH_ALEN);
754*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_addr(link, addr);
755*4dc78e53SAndroid Build Coastguard Workernl_addr_put(addr);
756*4dc78e53SAndroid Build Coastguard Worker
757*4dc78e53SAndroid Build Coastguard Worker/* set mode of virtual interface */
758*4dc78e53SAndroid Build Coastguard Workerrtnl_link_macvlan_set_mode(link, rtnl_link_macvlan_str2mode("bridge"));
759*4dc78e53SAndroid Build Coastguard Worker
760*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
761*4dc78e53SAndroid Build Coastguard Worker	/* error */
762*4dc78e53SAndroid Build Coastguard Worker
763*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
764*4dc78e53SAndroid Build Coastguard Worker-----
765*4dc78e53SAndroid Build Coastguard Worker
766*4dc78e53SAndroid Build Coastguard Worker[[link_macvtap]]
767*4dc78e53SAndroid Build Coastguard Worker==== MACVTAP
768*4dc78e53SAndroid Build Coastguard Worker
769*4dc78e53SAndroid Build Coastguard Worker[source,c]
770*4dc78e53SAndroid Build Coastguard Worker-----
771*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_macvtap_alloc(void);
772*4dc78e53SAndroid Build Coastguard Worker
773*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_is_macvtap(struct rtnl_link *);
774*4dc78e53SAndroid Build Coastguard Worker
775*4dc78e53SAndroid Build Coastguard Workerextern char *		rtnl_link_macvtap_mode2str(int, char *, size_t);
776*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvtap_str2mode(const char *);
777*4dc78e53SAndroid Build Coastguard Worker
778*4dc78e53SAndroid Build Coastguard Workerextern char *		rtnl_link_macvtap_flags2str(int, char *, size_t);
779*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvtap_str2flags(const char *);
780*4dc78e53SAndroid Build Coastguard Worker
781*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvtap_set_mode(struct rtnl_link *,
782*4dc78e53SAndroid Build Coastguard Worker			                           uint32_t);
783*4dc78e53SAndroid Build Coastguard Workerextern uint32_t		rtnl_link_macvtap_get_mode(struct rtnl_link *);
784*4dc78e53SAndroid Build Coastguard Worker
785*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvtap_set_flags(struct rtnl_link *,
786*4dc78e53SAndroid Build Coastguard Worker			                            uint16_t);
787*4dc78e53SAndroid Build Coastguard Workerextern int		rtnl_link_macvtap_unset_flags(struct rtnl_link *,
788*4dc78e53SAndroid Build Coastguard Worker			                              uint16_t);
789*4dc78e53SAndroid Build Coastguard Workerextern uint16_t		rtnl_link_macvtap_get_flags(struct rtnl_link *);
790*4dc78e53SAndroid Build Coastguard Worker-----
791*4dc78e53SAndroid Build Coastguard Worker
792*4dc78e53SAndroid Build Coastguard Worker.Example: Add a MACVTAP device
793*4dc78e53SAndroid Build Coastguard Worker[source,c]
794*4dc78e53SAndroid Build Coastguard Worker-----
795*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link;
796*4dc78e53SAndroid Build Coastguard Workerint master_index;
797*4dc78e53SAndroid Build Coastguard Workerstruct nl_addr* addr;
798*4dc78e53SAndroid Build Coastguard Worker
799*4dc78e53SAndroid Build Coastguard Worker/* lookup interface index of eth0 */
800*4dc78e53SAndroid Build Coastguard Workerif (!(master_index = rtnl_link_name2i(link_cache, "eth0")))
801*4dc78e53SAndroid Build Coastguard Worker	/* error */
802*4dc78e53SAndroid Build Coastguard Worker
803*4dc78e53SAndroid Build Coastguard Worker/* allocate new link object of type macvtap */
804*4dc78e53SAndroid Build Coastguard Workerlink = rtnl_link_macvtap_alloc();
805*4dc78e53SAndroid Build Coastguard Worker
806*4dc78e53SAndroid Build Coastguard Worker/* set eth0 to be our master device */
807*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_link(link, master_index);
808*4dc78e53SAndroid Build Coastguard Worker
809*4dc78e53SAndroid Build Coastguard Worker/* set address of virtual interface */
810*4dc78e53SAndroid Build Coastguard Workeraddr = nl_addr_build(AF_LLC, ether_aton("00:11:22:33:44:55"), ETH_ALEN);
811*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_addr(link, addr);
812*4dc78e53SAndroid Build Coastguard Workernl_addr_put(addr);
813*4dc78e53SAndroid Build Coastguard Worker
814*4dc78e53SAndroid Build Coastguard Worker/* set mode of virtual interface */
815*4dc78e53SAndroid Build Coastguard Workerrtnl_link_macvtap_set_mode(link, rtnl_link_macvtap_str2mode("bridge"));
816*4dc78e53SAndroid Build Coastguard Worker
817*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
818*4dc78e53SAndroid Build Coastguard Worker	/* error */
819*4dc78e53SAndroid Build Coastguard Worker
820*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
821*4dc78e53SAndroid Build Coastguard Worker-----
822*4dc78e53SAndroid Build Coastguard Worker
823*4dc78e53SAndroid Build Coastguard Worker[[link_vxlan]]
824*4dc78e53SAndroid Build Coastguard Worker==== VXLAN
825*4dc78e53SAndroid Build Coastguard Worker
826*4dc78e53SAndroid Build Coastguard Worker[source,c]
827*4dc78e53SAndroid Build Coastguard Worker-----
828*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_vxlan_alloc(void);
829*4dc78e53SAndroid Build Coastguard Worker
830*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_is_vxlan(struct rtnl_link *);
831*4dc78e53SAndroid Build Coastguard Worker
832*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_id(struct rtnl_link *, uint32_t);
833*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_id(struct rtnl_link *, uint32_t *);
834*4dc78e53SAndroid Build Coastguard Worker
835*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_group(struct rtnl_link *, struct nl_addr *);
836*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_group(struct rtnl_link *, struct nl_addr **);
837*4dc78e53SAndroid Build Coastguard Worker
838*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_link(struct rtnl_link *, uint32_t);
839*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_link(struct rtnl_link *, uint32_t *);
840*4dc78e53SAndroid Build Coastguard Worker
841*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_local(struct rtnl_link *, struct nl_addr *);
842*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_local(struct rtnl_link *, struct nl_addr **);
843*4dc78e53SAndroid Build Coastguard Worker
844*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_ttl(struct rtnl_link *, uint8_t);
845*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_ttl(struct rtnl_link *);
846*4dc78e53SAndroid Build Coastguard Worker
847*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_tos(struct rtnl_link *, uint8_t);
848*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_tos(struct rtnl_link *);
849*4dc78e53SAndroid Build Coastguard Worker
850*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_learning(struct rtnl_link *, uint8_t);
851*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_learning(struct rtnl_link *);
852*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_enable_learning(struct rtnl_link *);
853*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_disable_learning(struct rtnl_link *);
854*4dc78e53SAndroid Build Coastguard Worker
855*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_ageing(struct rtnl_link *, uint32_t);
856*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_ageing(struct rtnl_link *, uint32_t *);
857*4dc78e53SAndroid Build Coastguard Worker
858*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_limit(struct rtnl_link *, uint32_t);
859*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_limit(struct rtnl_link *, uint32_t *);
860*4dc78e53SAndroid Build Coastguard Worker
861*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_port_range(struct rtnl_link *,
862*4dc78e53SAndroid Build Coastguard Worker					       struct ifla_vxlan_port_range *);
863*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_port_range(struct rtnl_link *,
864*4dc78e53SAndroid Build Coastguard Worker					       struct ifla_vxlan_port_range *);
865*4dc78e53SAndroid Build Coastguard Worker
866*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_proxy(struct rtnl_link *, uint8_t);
867*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_proxy(struct rtnl_link *);
868*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_enable_proxy(struct rtnl_link *);
869*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_disable_proxy(struct rtnl_link *);
870*4dc78e53SAndroid Build Coastguard Worker
871*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_rsc(struct rtnl_link *, uint8_t);
872*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_rsc(struct rtnl_link *);
873*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_enable_rsc(struct rtnl_link *);
874*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_disable_rsc(struct rtnl_link *);
875*4dc78e53SAndroid Build Coastguard Worker
876*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_l2miss(struct rtnl_link *, uint8_t);
877*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_l2miss(struct rtnl_link *);
878*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_enable_l2miss(struct rtnl_link *);
879*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_disable_l2miss(struct rtnl_link *);
880*4dc78e53SAndroid Build Coastguard Worker
881*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_set_l3miss(struct rtnl_link *, uint8_t);
882*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_get_l3miss(struct rtnl_link *);
883*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_enable_l3miss(struct rtnl_link *);
884*4dc78e53SAndroid Build Coastguard Workerextern int	rtnl_link_vxlan_disable_l3miss(struct rtnl_link *);
885*4dc78e53SAndroid Build Coastguard Worker-----
886*4dc78e53SAndroid Build Coastguard Worker
887*4dc78e53SAndroid Build Coastguard Worker.Example: Add a VXLAN device
888*4dc78e53SAndroid Build Coastguard Worker[source,c]
889*4dc78e53SAndroid Build Coastguard Worker-----
890*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link;
891*4dc78e53SAndroid Build Coastguard Workerstruct nl_addr* addr;
892*4dc78e53SAndroid Build Coastguard Worker
893*4dc78e53SAndroid Build Coastguard Worker/* allocate new link object of type vxlan */
894*4dc78e53SAndroid Build Coastguard Workerlink = rtnl_link_vxlan_alloc();
895*4dc78e53SAndroid Build Coastguard Worker
896*4dc78e53SAndroid Build Coastguard Worker/* set interface name */
897*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_name(link, "vxlan128");
898*4dc78e53SAndroid Build Coastguard Worker
899*4dc78e53SAndroid Build Coastguard Worker/* set VXLAN network identifier */
900*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_vxlan_set_id(link, 128)) < 0)
901*4dc78e53SAndroid Build Coastguard Worker	/* error */
902*4dc78e53SAndroid Build Coastguard Worker
903*4dc78e53SAndroid Build Coastguard Worker/* set multicast address to join */
904*4dc78e53SAndroid Build Coastguard Workerif ((err = nl_addr_parse("239.0.0.1", AF_INET, &addr)) < 0)
905*4dc78e53SAndroid Build Coastguard Worker	/* error */
906*4dc78e53SAndroid Build Coastguard Worker
907*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_set_group(link, addr)) < 0)
908*4dc78e53SAndroid Build Coastguard Worker	/* error */
909*4dc78e53SAndroid Build Coastguard Worker
910*4dc78e53SAndroid Build Coastguard Workernl_addr_put(addr);
911*4dc78e53SAndroid Build Coastguard Worker
912*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
913*4dc78e53SAndroid Build Coastguard Worker	/* error */
914*4dc78e53SAndroid Build Coastguard Worker
915*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
916*4dc78e53SAndroid Build Coastguard Worker-----
917*4dc78e53SAndroid Build Coastguard Worker
918*4dc78e53SAndroid Build Coastguard Worker[[link_ipip]]
919*4dc78e53SAndroid Build Coastguard Worker==== IPIP
920*4dc78e53SAndroid Build Coastguard Worker
921*4dc78e53SAndroid Build Coastguard Worker[source,c]
922*4dc78e53SAndroid Build Coastguard Worker-----
923*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_ipip_alloc(void);
924*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipip_add(struct nl_sock *sk, const char *name);
925*4dc78e53SAndroid Build Coastguard Worker
926*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipip_set_link(struct rtnl_link *link,  uint32_t index);
927*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipip_get_link(struct rtnl_link *link);
928*4dc78e53SAndroid Build Coastguard Worker
929*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipip_set_local(struct rtnl_link *link, uint32_t addr);
930*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipip_get_local(struct rtnl_link *link);
931*4dc78e53SAndroid Build Coastguard Worker
932*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipip_set_remote(struct rtnl_link *link, uint32_t addr);
933*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipip_get_remote(struct rtnl_link *link);
934*4dc78e53SAndroid Build Coastguard Worker
935*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipip_set_ttl(struct rtnl_link *link, uint8_t ttl);
936*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ipip_get_ttl(struct rtnl_link *link);
937*4dc78e53SAndroid Build Coastguard Worker
938*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipip_set_tos(struct rtnl_link *link, uint8_t tos);
939*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ipip_get_tos(struct rtnl_link *link);
940*4dc78e53SAndroid Build Coastguard Worker
941*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipip_set_pmtudisc(struct rtnl_link *link, uint8_t pmtudisc);
942*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ipip_get_pmtudisc(struct rtnl_link *link);
943*4dc78e53SAndroid Build Coastguard Worker
944*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipip_set_fwmark(struct rtnl_link *link, uint32_t fwmark);
945*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipip_get_fwmark(struct rtnl_link *link, uint32_t *fwmark);
946*4dc78e53SAndroid Build Coastguard Worker
947*4dc78e53SAndroid Build Coastguard Worker-----
948*4dc78e53SAndroid Build Coastguard Worker
949*4dc78e53SAndroid Build Coastguard Worker.Example: Add an ipip tunnel device
950*4dc78e53SAndroid Build Coastguard Worker[source,c]
951*4dc78e53SAndroid Build Coastguard Worker-----
952*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link
953*4dc78e53SAndroid Build Coastguard Workerstruct in_addr addr
954*4dc78e53SAndroid Build Coastguard Worker
955*4dc78e53SAndroid Build Coastguard Worker/* allocate new link object of type ipip */
956*4dc78e53SAndroid Build Coastguard Workerif(!(link = rtnl_link_ipip_alloc()))
957*4dc78e53SAndroid Build Coastguard Worker        /* error */
958*4dc78e53SAndroid Build Coastguard Worker
959*4dc78e53SAndroid Build Coastguard Worker/* set ipip tunnel name */
960*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_set_name(link, "ipip-tun")) < 0)
961*4dc78e53SAndroid Build Coastguard Worker         /* error */
962*4dc78e53SAndroid Build Coastguard Worker
963*4dc78e53SAndroid Build Coastguard Worker/* set link index  */
964*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipip_set_link(link, if_index)) < 0)
965*4dc78e53SAndroid Build Coastguard Worker        /* error */
966*4dc78e53SAndroid Build Coastguard Worker
967*4dc78e53SAndroid Build Coastguard Worker/* set local address */
968*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET, "192.168.254.12", &addr.s_addr);
969*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipip_set_local(link, addr.s_addr)) < 0)
970*4dc78e53SAndroid Build Coastguard Worker        /* error */
971*4dc78e53SAndroid Build Coastguard Worker
972*4dc78e53SAndroid Build Coastguard Worker/* set remote address */
973*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET, "192.168.254.13", &addr.s_addr
974*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipip_set_remote(link, addr.s_addr)) < 0)
975*4dc78e53SAndroid Build Coastguard Worker        /* error */
976*4dc78e53SAndroid Build Coastguard Worker
977*4dc78e53SAndroid Build Coastguard Worker/* set tunnel ttl  */
978*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipip_set_ttl(link, 64)) < 0)
979*4dc78e53SAndroid Build Coastguard Worker        /* error */
980*4dc78e53SAndroid Build Coastguard Worker
981*4dc78e53SAndroid Build Coastguard Workerif((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
982*4dc78e53SAndroid Build Coastguard Worker        /* error */
983*4dc78e53SAndroid Build Coastguard Worker
984*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
985*4dc78e53SAndroid Build Coastguard Worker-----
986*4dc78e53SAndroid Build Coastguard Worker
987*4dc78e53SAndroid Build Coastguard Worker[[link_ipgre]]
988*4dc78e53SAndroid Build Coastguard Worker==== IPGRE
989*4dc78e53SAndroid Build Coastguard Worker
990*4dc78e53SAndroid Build Coastguard Worker[source,c]
991*4dc78e53SAndroid Build Coastguard Worker-----
992*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_ipgre_alloc(void);
993*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_add(struct nl_sock *sk, const char *name);
994*4dc78e53SAndroid Build Coastguard Worker
995*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_link(struct rtnl_link *link,  uint32_t index);
996*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipgre_get_link(struct rtnl_link *link);
997*4dc78e53SAndroid Build Coastguard Worker
998*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_iflags(struct rtnl_link *link, uint16_t iflags);
999*4dc78e53SAndroid Build Coastguard Workerextern uint16_t rtnl_link_get_iflags(struct rtnl_link *link);
1000*4dc78e53SAndroid Build Coastguard Worker
1001*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_oflags(struct rtnl_link *link, uint16_t oflags);
1002*4dc78e53SAndroid Build Coastguard Workerextern uint16_t rtnl_link_get_oflags(struct rtnl_link *link);
1003*4dc78e53SAndroid Build Coastguard Worker
1004*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_ikey(struct rtnl_link *link, uint32_t ikey);
1005*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_get_ikey(struct rtnl_link *link);
1006*4dc78e53SAndroid Build Coastguard Worker
1007*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_okey(struct rtnl_link *link, uint32_t okey);
1008*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_get_okey(struct rtnl_link *link)
1009*4dc78e53SAndroid Build Coastguard Worker
1010*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_local(struct rtnl_link *link, uint32_t addr);
1011*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipgre_get_local(struct rtnl_link *link);
1012*4dc78e53SAndroid Build Coastguard Worker
1013*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_remote(struct rtnl_link *link, uint32_t addr);
1014*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipgre_get_remote(struct rtnl_link *link);
1015*4dc78e53SAndroid Build Coastguard Worker
1016*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_ttl(struct rtnl_link *link, uint8_t ttl);
1017*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ipgre_get_ttl(struct rtnl_link *link);
1018*4dc78e53SAndroid Build Coastguard Worker
1019*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_tos(struct rtnl_link *link, uint8_t tos);
1020*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ipgre_get_tos(struct rtnl_link *link);
1021*4dc78e53SAndroid Build Coastguard Worker
1022*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_pmtudisc(struct rtnl_link *link, uint8_t pmtudisc);
1023*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ipgre_get_pmtudisc(struct rtnl_link *link);
1024*4dc78e53SAndroid Build Coastguard Worker
1025*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_set_fwmark(struct rtnl_link *link, uint32_t fwmark);
1026*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipgre_get_fwmark(struct rtnl_link *link, uint32_t *fwmark);
1027*4dc78e53SAndroid Build Coastguard Worker
1028*4dc78e53SAndroid Build Coastguard Worker-----
1029*4dc78e53SAndroid Build Coastguard Worker
1030*4dc78e53SAndroid Build Coastguard Worker.Example: Add an ipgre tunnel device
1031*4dc78e53SAndroid Build Coastguard Worker[source,c]
1032*4dc78e53SAndroid Build Coastguard Worker-----
1033*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link
1034*4dc78e53SAndroid Build Coastguard Workerstruct in_addr addr
1035*4dc78e53SAndroid Build Coastguard Worker
1036*4dc78e53SAndroid Build Coastguard Worker/* allocate new link object of type ipgre */
1037*4dc78e53SAndroid Build Coastguard Workerif(!(link = rtnl_link_ipgre_alloc()))
1038*4dc78e53SAndroid Build Coastguard Worker	/* error */
1039*4dc78e53SAndroid Build Coastguard Worker
1040*4dc78e53SAndroid Build Coastguard Worker/* set ipgre tunnel name */
1041*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_set_name(link, "ipgre-tun")) < 0)
1042*4dc78e53SAndroid Build Coastguard Worker	/* error */
1043*4dc78e53SAndroid Build Coastguard Worker
1044*4dc78e53SAndroid Build Coastguard Worker/* set link index  */
1045*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipgre_set_link(link, if_index)) < 0)
1046*4dc78e53SAndroid Build Coastguard Worker	/* error */
1047*4dc78e53SAndroid Build Coastguard Worker
1048*4dc78e53SAndroid Build Coastguard Worker/* set local address */
1049*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET, "192.168.254.12", &addr.s_addr);
1050*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipgre_set_local(link, addr.s_addr)) < 0)
1051*4dc78e53SAndroid Build Coastguard Worker	/* error */
1052*4dc78e53SAndroid Build Coastguard Worker
1053*4dc78e53SAndroid Build Coastguard Worker/* set remote address */
1054*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET, "192.168.254.13", &addr.s_addr
1055*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipgre_set_remote(link, addr.s_addr)) < 0)
1056*4dc78e53SAndroid Build Coastguard Worker	/* error */
1057*4dc78e53SAndroid Build Coastguard Worker
1058*4dc78e53SAndroid Build Coastguard Worker/* set tunnel ttl  */
1059*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipgre_set_ttl(link, 64)) < 0)
1060*4dc78e53SAndroid Build Coastguard Worker	/* error */
1061*4dc78e53SAndroid Build Coastguard Worker
1062*4dc78e53SAndroid Build Coastguard Workerif((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
1063*4dc78e53SAndroid Build Coastguard Worker	/* error */
1064*4dc78e53SAndroid Build Coastguard Worker
1065*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
1066*4dc78e53SAndroid Build Coastguard Worker-----
1067*4dc78e53SAndroid Build Coastguard Worker
1068*4dc78e53SAndroid Build Coastguard Worker[[link_sit]]
1069*4dc78e53SAndroid Build Coastguard Worker==== SIT
1070*4dc78e53SAndroid Build Coastguard Worker
1071*4dc78e53SAndroid Build Coastguard Worker[source,c]
1072*4dc78e53SAndroid Build Coastguard Worker-----
1073*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_sit_alloc(void);
1074*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_add(struct nl_sock *sk, const char *name);
1075*4dc78e53SAndroid Build Coastguard Worker
1076*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_link(struct rtnl_link *link,  uint32_t index);
1077*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_sit_get_link(struct rtnl_link *link);
1078*4dc78e53SAndroid Build Coastguard Worker
1079*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_iflags(struct rtnl_link *link, uint16_t iflags);
1080*4dc78e53SAndroid Build Coastguard Workerextern uint16_t rtnl_link_get_iflags(struct rtnl_link *link);
1081*4dc78e53SAndroid Build Coastguard Worker
1082*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_oflags(struct rtnl_link *link, uint16_t oflags);
1083*4dc78e53SAndroid Build Coastguard Workerextern uint16_t rtnl_link_get_oflags(struct rtnl_link *link);
1084*4dc78e53SAndroid Build Coastguard Worker
1085*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_ikey(struct rtnl_link *link, uint32_t ikey);
1086*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_get_ikey(struct rtnl_link *link);
1087*4dc78e53SAndroid Build Coastguard Worker
1088*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_okey(struct rtnl_link *link, uint32_t okey);
1089*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_get_okey(struct rtnl_link *link)
1090*4dc78e53SAndroid Build Coastguard Worker
1091*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_local(struct rtnl_link *link, uint32_t addr);
1092*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_sit_get_local(struct rtnl_link *link);
1093*4dc78e53SAndroid Build Coastguard Worker
1094*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_remote(struct rtnl_link *link, uint32_t addr);
1095*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_sit_get_remote(struct rtnl_link *link);
1096*4dc78e53SAndroid Build Coastguard Worker
1097*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_ttl(struct rtnl_link *link, uint8_t ttl);
1098*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_sit_get_ttl(struct rtnl_link *link);
1099*4dc78e53SAndroid Build Coastguard Worker
1100*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_tos(struct rtnl_link *link, uint8_t tos);
1101*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_sit_get_tos(struct rtnl_link *link);
1102*4dc78e53SAndroid Build Coastguard Worker
1103*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_pmtudisc(struct rtnl_link *link, uint8_t pmtudisc);
1104*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_sit_get_pmtudisc(struct rtnl_link *link);
1105*4dc78e53SAndroid Build Coastguard Worker
1106*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_set_fwmark(struct rtnl_link *link, uint32_t fwmark);
1107*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_sit_get_fwmark(struct rtnl_link *link, uint32_t *fwmark);
1108*4dc78e53SAndroid Build Coastguard Worker
1109*4dc78e53SAndroid Build Coastguard Worker-----
1110*4dc78e53SAndroid Build Coastguard Worker
1111*4dc78e53SAndroid Build Coastguard Worker.Example: Add a sit tunnel device
1112*4dc78e53SAndroid Build Coastguard Worker[source,c]
1113*4dc78e53SAndroid Build Coastguard Worker-----
1114*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link
1115*4dc78e53SAndroid Build Coastguard Workerstruct in_addr addr
1116*4dc78e53SAndroid Build Coastguard Worker
1117*4dc78e53SAndroid Build Coastguard Worker/* allocate new link object of type sit */
1118*4dc78e53SAndroid Build Coastguard Workerif(!(link = rtnl_link_sit_alloc()))
1119*4dc78e53SAndroid Build Coastguard Worker	/* error */
1120*4dc78e53SAndroid Build Coastguard Worker
1121*4dc78e53SAndroid Build Coastguard Worker/* set sit tunnel name */
1122*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_set_name(link, "sit-tun")) < 0)
1123*4dc78e53SAndroid Build Coastguard Worker	/* error */
1124*4dc78e53SAndroid Build Coastguard Worker
1125*4dc78e53SAndroid Build Coastguard Worker/* set link index  */
1126*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_sit_set_link(link, if_index)) < 0)
1127*4dc78e53SAndroid Build Coastguard Worker	/* error */
1128*4dc78e53SAndroid Build Coastguard Worker
1129*4dc78e53SAndroid Build Coastguard Worker/* set local address */
1130*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET, "192.168.254.12", &addr.s_addr);
1131*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_sit_set_local(link, addr.s_addr)) < 0)
1132*4dc78e53SAndroid Build Coastguard Worker	/* error */
1133*4dc78e53SAndroid Build Coastguard Worker
1134*4dc78e53SAndroid Build Coastguard Worker/* set remote address */
1135*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET, "192.168.254.13", &addr.s_addr
1136*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_sit_set_remote(link, addr.s_addr)) < 0)
1137*4dc78e53SAndroid Build Coastguard Worker	/* error */
1138*4dc78e53SAndroid Build Coastguard Worker
1139*4dc78e53SAndroid Build Coastguard Worker/* set tunnel ttl  */
1140*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_sit_set_ttl(link, 64)) < 0)
1141*4dc78e53SAndroid Build Coastguard Worker	/* error */
1142*4dc78e53SAndroid Build Coastguard Worker
1143*4dc78e53SAndroid Build Coastguard Workerif((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
1144*4dc78e53SAndroid Build Coastguard Worker        /* error */
1145*4dc78e53SAndroid Build Coastguard Worker
1146*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
1147*4dc78e53SAndroid Build Coastguard Worker-----
1148*4dc78e53SAndroid Build Coastguard Worker
1149*4dc78e53SAndroid Build Coastguard Worker
1150*4dc78e53SAndroid Build Coastguard Worker[[link_ipvti]]
1151*4dc78e53SAndroid Build Coastguard Worker==== IPVTI
1152*4dc78e53SAndroid Build Coastguard Worker
1153*4dc78e53SAndroid Build Coastguard Worker[source,c]
1154*4dc78e53SAndroid Build Coastguard Worker-----
1155*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_ipvti_alloc(void);
1156*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipvti_add(struct nl_sock *sk, const char *name);
1157*4dc78e53SAndroid Build Coastguard Worker
1158*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipvti_set_link(struct rtnl_link *link,  uint32_t index);
1159*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipvti_get_link(struct rtnl_link *link);
1160*4dc78e53SAndroid Build Coastguard Worker
1161*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipvti_set_ikey(struct rtnl_link *link, uint32_t ikey);
1162*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipvti_get_ikey(struct rtnl_link *link);
1163*4dc78e53SAndroid Build Coastguard Worker
1164*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipvti_set_okey(struct rtnl_link *link, uint32_t okey);
1165*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipvti_get_okey(struct rtnl_link *link)
1166*4dc78e53SAndroid Build Coastguard Worker
1167*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipvti_set_local(struct rtnl_link *link, uint32_t addr);
1168*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipvti_get_local(struct rtnl_link *link);
1169*4dc78e53SAndroid Build Coastguard Worker
1170*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipvti_set_remote(struct rtnl_link *link, uint32_t addr);
1171*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ipvti_get_remote(struct rtnl_link *link);
1172*4dc78e53SAndroid Build Coastguard Worker
1173*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipvti_set_fwmark(struct rtnl_link *link, uint32_t fwmark);
1174*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ipvti_get_fwmark(struct rtnl_link *link, uint32_t *fwmark);
1175*4dc78e53SAndroid Build Coastguard Worker
1176*4dc78e53SAndroid Build Coastguard Worker-----
1177*4dc78e53SAndroid Build Coastguard Worker
1178*4dc78e53SAndroid Build Coastguard Worker.Example: Add an ipvti tunnel device
1179*4dc78e53SAndroid Build Coastguard Worker[source,c]
1180*4dc78e53SAndroid Build Coastguard Worker-----
1181*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link
1182*4dc78e53SAndroid Build Coastguard Workerstruct in_addr addr
1183*4dc78e53SAndroid Build Coastguard Worker
1184*4dc78e53SAndroid Build Coastguard Worker/* allocate new link object of type ipvti */
1185*4dc78e53SAndroid Build Coastguard Workerif(!(link = rtnl_link_ipvti_alloc()))
1186*4dc78e53SAndroid Build Coastguard Worker	/* error */
1187*4dc78e53SAndroid Build Coastguard Worker
1188*4dc78e53SAndroid Build Coastguard Worker/* set ipvti tunnel name */
1189*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_set_name(link, "ipvti-tun")) < 0)
1190*4dc78e53SAndroid Build Coastguard Worker	/* error */
1191*4dc78e53SAndroid Build Coastguard Worker
1192*4dc78e53SAndroid Build Coastguard Worker/* set link index  */
1193*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipvti_set_link(link, if_index)) < 0)
1194*4dc78e53SAndroid Build Coastguard Worker	/* error */
1195*4dc78e53SAndroid Build Coastguard Worker
1196*4dc78e53SAndroid Build Coastguard Worker/* set local address */
1197*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET, "192.168.254.12", &addr.s_addr);
1198*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipvti_set_local(link, addr.s_addr)) < 0)
1199*4dc78e53SAndroid Build Coastguard Worker	/* error */
1200*4dc78e53SAndroid Build Coastguard Worker
1201*4dc78e53SAndroid Build Coastguard Worker/* set remote address */
1202*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET, "192.168.254.13", &addr.s_addr
1203*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_ipvti_set_remote(link, addr.s_addr)) < 0)
1204*4dc78e53SAndroid Build Coastguard Worker	/* error */
1205*4dc78e53SAndroid Build Coastguard Worker
1206*4dc78e53SAndroid Build Coastguard Workerif((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
1207*4dc78e53SAndroid Build Coastguard Worker	/* error */
1208*4dc78e53SAndroid Build Coastguard Worker
1209*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
1210*4dc78e53SAndroid Build Coastguard Worker-----
1211*4dc78e53SAndroid Build Coastguard Worker
1212*4dc78e53SAndroid Build Coastguard Worker[[link_ip6tnl]]
1213*4dc78e53SAndroid Build Coastguard Worker==== IP6TNL
1214*4dc78e53SAndroid Build Coastguard Worker
1215*4dc78e53SAndroid Build Coastguard Worker[source,c]
1216*4dc78e53SAndroid Build Coastguard Worker-----
1217*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_ip6_tnl_alloc(void);
1218*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_add(struct nl_sock *sk, const char *name);
1219*4dc78e53SAndroid Build Coastguard Worker
1220*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_link(struct rtnl_link *link,  uint32_t index);
1221*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ip6_tnl_get_link(struct rtnl_link *link);
1222*4dc78e53SAndroid Build Coastguard Worker
1223*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_local(struct rtnl_link *link, struct in6_addr *);
1224*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_get_local(struct rtnl_link *link, struct in6_addr *);
1225*4dc78e53SAndroid Build Coastguard Worker
1226*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_remote(struct rtnl_link *link, struct in6_addr *);
1227*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_get_remote(struct rtnl_link *link, struct in6_addr *);
1228*4dc78e53SAndroid Build Coastguard Worker
1229*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_ttl(struct rtnl_link *link, uint8_t ttl);
1230*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ip6_tnl_get_ttl(struct rtnl_link *link);
1231*4dc78e53SAndroid Build Coastguard Worker
1232*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_tos(struct rtnl_link *link, uint8_t tos);
1233*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ip6_tnl_get_tos(struct rtnl_link *link);
1234*4dc78e53SAndroid Build Coastguard Worker
1235*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_encaplimit(struct rtnl_link *link, uint8_t encap_limit);
1236*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ip6_tnl_get_encaplimit(struct rtnl_link *link);
1237*4dc78e53SAndroid Build Coastguard Worker
1238*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_flags(struct rtnl_link *link, uint32_t flags);
1239*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ip6_tnl_get_flags(struct rtnl_link *link);
1240*4dc78e53SAndroid Build Coastguard Worker
1241*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_ip6_tnl_get_flowinfo(struct rtnl_link *link);
1242*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_flowinfo(struct rtnl_link *link, uint32_t flowinfo);
1243*4dc78e53SAndroid Build Coastguard Worker
1244*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_proto(struct rtnl_link *link, uint8_t proto);
1245*4dc78e53SAndroid Build Coastguard Workerextern uint8_t rtnl_link_ip6_tnl_get_proto(struct rtnl_link *link);
1246*4dc78e53SAndroid Build Coastguard Worker
1247*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_set_fwmark(struct rtnl_link *link, uint32_t fwmark);
1248*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6_tnl_get_fwmark(struct rtnl_link *link, uint32_t *fwmark);
1249*4dc78e53SAndroid Build Coastguard Worker
1250*4dc78e53SAndroid Build Coastguard Worker-----
1251*4dc78e53SAndroid Build Coastguard Worker
1252*4dc78e53SAndroid Build Coastguard Worker.Example: Add an ip6tnl tunnel device
1253*4dc78e53SAndroid Build Coastguard Worker[source,c]
1254*4dc78e53SAndroid Build Coastguard Worker-----
1255*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link
1256*4dc78e53SAndroid Build Coastguard Workerstruct in6_addr addr
1257*4dc78e53SAndroid Build Coastguard Worker
1258*4dc78e53SAndroid Build Coastguard Workerlink = rtnl_link_ip6_tnl_alloc();
1259*4dc78e53SAndroid Build Coastguard Worker
1260*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_name(link, "ip6tnl-tun");
1261*4dc78e53SAndroid Build Coastguard Workerrtnl_link_ip6_tnl_set_link(link, if_index);
1262*4dc78e53SAndroid Build Coastguard Worker
1263*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET6, "2607:f0d0:1002:51::4", &addr);
1264*4dc78e53SAndroid Build Coastguard Workerrtnl_link_ip6_tnl_set_local(link, &addr);
1265*4dc78e53SAndroid Build Coastguard Worker
1266*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET6, "2607:f0d0:1002:52::5", &addr);
1267*4dc78e53SAndroid Build Coastguard Workerrtnl_link_ip6_tnl_set_remote(link, &addr);
1268*4dc78e53SAndroid Build Coastguard Worker
1269*4dc78e53SAndroid Build Coastguard Workerrtnl_link_add(sk, link, NLM_F_CREATE);
1270*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
1271*4dc78e53SAndroid Build Coastguard Worker
1272*4dc78e53SAndroid Build Coastguard Worker-----
1273*4dc78e53SAndroid Build Coastguard Worker
1274*4dc78e53SAndroid Build Coastguard Worker[[link_ip6gre]]
1275*4dc78e53SAndroid Build Coastguard Worker==== IP6GRE
1276*4dc78e53SAndroid Build Coastguard Worker
1277*4dc78e53SAndroid Build Coastguard Worker[source,c]
1278*4dc78e53SAndroid Build Coastguard Worker----
1279*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_is_ip6gre(struct rtnl_link *link);
1280*4dc78e53SAndroid Build Coastguard Worker
1281*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_ip6gre_alloc(void);
1282*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_add(struct nl_sock *sk, const char *name);
1283*4dc78e53SAndroid Build Coastguard Worker
1284*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_link(struct rtnl_link *link, uint32_t index);
1285*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_link(struct rtnl_link *link, uint32_t *index);
1286*4dc78e53SAndroid Build Coastguard Worker
1287*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_iflags(struct rtnl_link *link, uint16_t iflags);
1288*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_iflags(struct rtnl_link *link, uint16_t *iflags);
1289*4dc78e53SAndroid Build Coastguard Worker
1290*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_oflags(struct rtnl_link *link, uint16_t oflags);
1291*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_oflags(struct rtnl_link *link, uint16_t *oflags);
1292*4dc78e53SAndroid Build Coastguard Worker
1293*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_ikey(struct rtnl_link *link, uint32_t ikey);
1294*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_ikey(struct rtnl_link *link, uint32_t *ikey);
1295*4dc78e53SAndroid Build Coastguard Worker
1296*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_okey(struct rtnl_link *link, uint32_t okey);
1297*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_okey(struct rtnl_link *link, uint32_t *okey);
1298*4dc78e53SAndroid Build Coastguard Worker
1299*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_local(struct rtnl_link *link, struct in6_addr *local);
1300*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_local(struct rtnl_link *link, struct in6_addr *local);
1301*4dc78e53SAndroid Build Coastguard Worker
1302*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_remote(struct rtnl_link *link, struct in6_addr *remote);
1303*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_remote(struct rtnl_link *link, struct in6_addr *remote);
1304*4dc78e53SAndroid Build Coastguard Worker
1305*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_ttl(struct rtnl_link *link, uint8_t ttl);
1306*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_ttl(struct rtnl_link *link, uint8_t *ttl);
1307*4dc78e53SAndroid Build Coastguard Worker
1308*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_encaplimit(struct rtnl_link *link, uint8_t encaplimit);
1309*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_encaplimit(struct rtnl_link *link, uint8_t *encaplimit);
1310*4dc78e53SAndroid Build Coastguard Worker
1311*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_flowinfo(struct rtnl_link *link, uint32_t flowinfo);
1312*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_flowinfo(struct rtnl_link *link, uint32_t *flowinfo);
1313*4dc78e53SAndroid Build Coastguard Worker
1314*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_flags(struct rtnl_link *link, uint32_t flags);
1315*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_flags(struct rtnl_link *link, uint32_t *flags);
1316*4dc78e53SAndroid Build Coastguard Worker
1317*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_set_fwmark(struct rtnl_link *link, uint32_t fwmark);
1318*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6gre_get_fwmark(struct rtnl_link *link, uint32_t *fwmark);
1319*4dc78e53SAndroid Build Coastguard Worker
1320*4dc78e53SAndroid Build Coastguard Worker----
1321*4dc78e53SAndroid Build Coastguard Worker
1322*4dc78e53SAndroid Build Coastguard Worker.Example: Add an ip6gre tunnel device
1323*4dc78e53SAndroid Build Coastguard Worker[source,c]
1324*4dc78e53SAndroid Build Coastguard Worker----
1325*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link
1326*4dc78e53SAndroid Build Coastguard Workerstruct in6_addr addr
1327*4dc78e53SAndroid Build Coastguard Worker
1328*4dc78e53SAndroid Build Coastguard Workerlink = rtnl_link_ip6gre_alloc();
1329*4dc78e53SAndroid Build Coastguard Worker
1330*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_name(link, "ip6gre-tun");
1331*4dc78e53SAndroid Build Coastguard Workerrtnl_link_ip6gre_set_link(link, if_index);
1332*4dc78e53SAndroid Build Coastguard Worker
1333*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET6, "2607:f0d0:1002:51::4", &addr);
1334*4dc78e53SAndroid Build Coastguard Workerrtnl_link_ip6gre_set_local(link, &addr);
1335*4dc78e53SAndroid Build Coastguard Worker
1336*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET6, "2607:f0d0:1002:52::5", &addr);
1337*4dc78e53SAndroid Build Coastguard Workerrtnl_link_ip6gre_set_remote(link, &addr);
1338*4dc78e53SAndroid Build Coastguard Worker
1339*4dc78e53SAndroid Build Coastguard Workerrtnl_link_add(sk, link, NLM_F_CREATE);
1340*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
1341*4dc78e53SAndroid Build Coastguard Worker
1342*4dc78e53SAndroid Build Coastguard Worker-----
1343*4dc78e53SAndroid Build Coastguard Worker
1344*4dc78e53SAndroid Build Coastguard Worker[[link_ip6vti]]
1345*4dc78e53SAndroid Build Coastguard Worker==== IP6VTI
1346*4dc78e53SAndroid Build Coastguard Worker
1347*4dc78e53SAndroid Build Coastguard Worker[source,c]
1348*4dc78e53SAndroid Build Coastguard Worker----
1349*4dc78e53SAndroid Build Coastguard Workerint rtnl_link_is_ip6vti(struct rtnl_link *link);
1350*4dc78e53SAndroid Build Coastguard Worker
1351*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_ip6vti_alloc(void);
1352*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_add(struct nl_sock *sk, const char *name);
1353*4dc78e53SAndroid Build Coastguard Worker
1354*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_set_link(struct rtnl_link *link, uint32_t index);
1355*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_get_link(struct rtnl_link *link, uint32_t *index);
1356*4dc78e53SAndroid Build Coastguard Worker
1357*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_set_ikey(struct rtnl_link *link, uint32_t ikey);
1358*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_get_ikey(struct rtnl_link *link, uint32_t *ikey);
1359*4dc78e53SAndroid Build Coastguard Worker
1360*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_set_okey(struct rtnl_link *link, uint32_t okey);
1361*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_get_okey(struct rtnl_link *link, uint32_t *okey);
1362*4dc78e53SAndroid Build Coastguard Worker
1363*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_set_local(struct rtnl_link *link, struct in6_addr *local);
1364*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_get_local(struct rtnl_link *link, struct in6_addr *remote);
1365*4dc78e53SAndroid Build Coastguard Worker
1366*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_set_remote(struct rtnl_link *link, struct in6_addr *remote);
1367*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_get_remote(struct rtnl_link *link, struct in6_addr *remote);
1368*4dc78e53SAndroid Build Coastguard Worker
1369*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_set_fwmark(struct rtnl_link *link, uint32_t fwmark);
1370*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_ip6vti_get_fwmark(struct rtnl_link *link, uint32_t *fwmark);
1371*4dc78e53SAndroid Build Coastguard Worker
1372*4dc78e53SAndroid Build Coastguard Worker----
1373*4dc78e53SAndroid Build Coastguard Worker
1374*4dc78e53SAndroid Build Coastguard Worker.Example: Add an ip6vti tunnel device
1375*4dc78e53SAndroid Build Coastguard Worker[source,c]
1376*4dc78e53SAndroid Build Coastguard Worker----
1377*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link
1378*4dc78e53SAndroid Build Coastguard Workerstruct in6_addr addr
1379*4dc78e53SAndroid Build Coastguard Worker
1380*4dc78e53SAndroid Build Coastguard Workerlink = rtnl_link_ip6vti_alloc();
1381*4dc78e53SAndroid Build Coastguard Worker
1382*4dc78e53SAndroid Build Coastguard Workerrtnl_link_set_name(link, "ip6vti-tun");
1383*4dc78e53SAndroid Build Coastguard Workerrtnl_link_ip6vti_set_link(link, if_index);
1384*4dc78e53SAndroid Build Coastguard Worker
1385*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET6, "2607:f0d0:1002:51::4", &addr);
1386*4dc78e53SAndroid Build Coastguard Workerrtnl_link_ip6vti_set_local(link, &addr);
1387*4dc78e53SAndroid Build Coastguard Worker
1388*4dc78e53SAndroid Build Coastguard Workerinet_pton(AF_INET6, "2607:f0d0:1002:52::5", &addr);
1389*4dc78e53SAndroid Build Coastguard Workerrtnl_link_ip6vti_set_remote(link, &addr);
1390*4dc78e53SAndroid Build Coastguard Worker
1391*4dc78e53SAndroid Build Coastguard Workerrtnl_link_add(sk, link, NLM_F_CREATE);
1392*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
1393*4dc78e53SAndroid Build Coastguard Worker
1394*4dc78e53SAndroid Build Coastguard Worker-----
1395*4dc78e53SAndroid Build Coastguard Worker
1396*4dc78e53SAndroid Build Coastguard Worker[[link_xfrmi]]
1397*4dc78e53SAndroid Build Coastguard Worker==== XFRMI
1398*4dc78e53SAndroid Build Coastguard Worker
1399*4dc78e53SAndroid Build Coastguard Worker[source,c]
1400*4dc78e53SAndroid Build Coastguard Worker-----
1401*4dc78e53SAndroid Build Coastguard Workerextern struct rtnl_link *rtnl_link_xfrmi_alloc(void);
1402*4dc78e53SAndroid Build Coastguard Worker
1403*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_xfrmi_set_link(struct rtnl_link *link,  uint32_t index);
1404*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_xfrmi_get_link(struct rtnl_link *link);
1405*4dc78e53SAndroid Build Coastguard Worker
1406*4dc78e53SAndroid Build Coastguard Workerextern int rtnl_link_xfrmi_set_if_id(struct rtnl_link *link, uint32_t if_id);
1407*4dc78e53SAndroid Build Coastguard Workerextern uint32_t rtnl_link_xfrmi_get_if_id(struct rtnl_link *link);
1408*4dc78e53SAndroid Build Coastguard Worker
1409*4dc78e53SAndroid Build Coastguard Worker-----
1410*4dc78e53SAndroid Build Coastguard Worker
1411*4dc78e53SAndroid Build Coastguard Worker.Example: Add a xfrmi device
1412*4dc78e53SAndroid Build Coastguard Worker[source,c]
1413*4dc78e53SAndroid Build Coastguard Worker-----
1414*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_link *link
1415*4dc78e53SAndroid Build Coastguard Workerstruct in_addr addr
1416*4dc78e53SAndroid Build Coastguard Worker
1417*4dc78e53SAndroid Build Coastguard Worker/* allocate new link object of type xfrmi */
1418*4dc78e53SAndroid Build Coastguard Workerif(!(link = rtnl_link_xfrmi_alloc()))
1419*4dc78e53SAndroid Build Coastguard Worker	/* error */
1420*4dc78e53SAndroid Build Coastguard Worker
1421*4dc78e53SAndroid Build Coastguard Worker/* set xfrmi name */
1422*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_set_name(link, "ipsec0")) < 0)
1423*4dc78e53SAndroid Build Coastguard Worker	/* error */
1424*4dc78e53SAndroid Build Coastguard Worker
1425*4dc78e53SAndroid Build Coastguard Worker/* set link index  */
1426*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_xfrmi_set_link(link, if_index)) < 0)
1427*4dc78e53SAndroid Build Coastguard Worker	/* error */
1428*4dc78e53SAndroid Build Coastguard Worker
1429*4dc78e53SAndroid Build Coastguard Worker/* set if_id */
1430*4dc78e53SAndroid Build Coastguard Workerif ((err = rtnl_link_xfrmi_set_if_id(link, 16)) < 0)
1431*4dc78e53SAndroid Build Coastguard Worker	/* error */
1432*4dc78e53SAndroid Build Coastguard Worker
1433*4dc78e53SAndroid Build Coastguard Workerif((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
1434*4dc78e53SAndroid Build Coastguard Worker	/* error */
1435*4dc78e53SAndroid Build Coastguard Worker
1436*4dc78e53SAndroid Build Coastguard Workerrtnl_link_put(link);
1437*4dc78e53SAndroid Build Coastguard Worker-----
1438*4dc78e53SAndroid Build Coastguard Worker
1439*4dc78e53SAndroid Build Coastguard Worker== Neighbouring
1440*4dc78e53SAndroid Build Coastguard Worker
1441*4dc78e53SAndroid Build Coastguard Worker== Routing
1442*4dc78e53SAndroid Build Coastguard Worker
1443*4dc78e53SAndroid Build Coastguard Worker[[route_tc]]
1444*4dc78e53SAndroid Build Coastguard Worker== Traffic Control
1445*4dc78e53SAndroid Build Coastguard Worker
1446*4dc78e53SAndroid Build Coastguard WorkerThe traffic control architecture allows the queueing and
1447*4dc78e53SAndroid Build Coastguard Workerprioritization of packets before they are enqueued to the network
1448*4dc78e53SAndroid Build Coastguard Workerdriver. To a limited degree it is also possible to take control of
1449*4dc78e53SAndroid Build Coastguard Workernetwork traffic as it enters the network stack.
1450*4dc78e53SAndroid Build Coastguard Worker
1451*4dc78e53SAndroid Build Coastguard WorkerThe architecture consists of three different types of modules:
1452*4dc78e53SAndroid Build Coastguard Worker
1453*4dc78e53SAndroid Build Coastguard Worker- *Queueing disciplines (qdisc)* provide a mechanism to enqueue packets
1454*4dc78e53SAndroid Build Coastguard Worker  in different forms. They may be used to implement fair queueing,
1455*4dc78e53SAndroid Build Coastguard Worker  prioritization of differentiated services, enforce bandwidth
1456*4dc78e53SAndroid Build Coastguard Worker  limitations, or even to simulate network behaviour such as packet
1457*4dc78e53SAndroid Build Coastguard Worker  loss and packet delay. Qdiscs can be classful in which case they
1458*4dc78e53SAndroid Build Coastguard Worker  allow traffic classes described in the next paragraph to be attached
1459*4dc78e53SAndroid Build Coastguard Worker  to them.
1460*4dc78e53SAndroid Build Coastguard Worker
1461*4dc78e53SAndroid Build Coastguard Worker- *Traffic classes (class)* are supported by several qdiscs to build
1462*4dc78e53SAndroid Build Coastguard Worker  a tree structure for different types of traffic. Each class may be
1463*4dc78e53SAndroid Build Coastguard Worker  assigned its own set of attributes such as bandwidth limits or
1464*4dc78e53SAndroid Build Coastguard Worker  queueing priorities. Some qdiscs even allow borrowing of bandwidth
1465*4dc78e53SAndroid Build Coastguard Worker  between classes.
1466*4dc78e53SAndroid Build Coastguard Worker
1467*4dc78e53SAndroid Build Coastguard Worker- *Classifiers (cls)* are used to decide which qdisc/class the packet
1468*4dc78e53SAndroid Build Coastguard Worker  should be enqueued to. Different types of classifiers exists,
1469*4dc78e53SAndroid Build Coastguard Worker  ranging from classification based on protocol header values to
1470*4dc78e53SAndroid Build Coastguard Worker  classification based on packet priority or firewall marks.
1471*4dc78e53SAndroid Build Coastguard Worker  Additionally most classifiers support *extended matches (ematch)*
1472*4dc78e53SAndroid Build Coastguard Worker  which allow extending classifiers by a set of matcher modules, and
1473*4dc78e53SAndroid Build Coastguard Worker  *actions* which allow classifiers to take actions such as mangling,
1474*4dc78e53SAndroid Build Coastguard Worker  mirroring, or even rerouting of packets.
1475*4dc78e53SAndroid Build Coastguard Worker
1476*4dc78e53SAndroid Build Coastguard Worker.Default Qdisc
1477*4dc78e53SAndroid Build Coastguard Worker
1478*4dc78e53SAndroid Build Coastguard WorkerThe default qdisc used on all network devices is `pfifo_fast`.
1479*4dc78e53SAndroid Build Coastguard WorkerNetwork devices which do not require a transmit queue such as the
1480*4dc78e53SAndroid Build Coastguard Workerloopback device do not have a default qdisc attached. The `pfifo_fast`
1481*4dc78e53SAndroid Build Coastguard Workerqdisc provides three bands to prioritize interactive traffic over bulk
1482*4dc78e53SAndroid Build Coastguard Workertraffic. Classification is based on the packet priority (diffserv).
1483*4dc78e53SAndroid Build Coastguard Worker
1484*4dc78e53SAndroid Build Coastguard Workerimage:qdisc_default.png["Default Qdisc"]
1485*4dc78e53SAndroid Build Coastguard Worker
1486*4dc78e53SAndroid Build Coastguard Worker.Multiqueue Default Qdisc
1487*4dc78e53SAndroid Build Coastguard Worker
1488*4dc78e53SAndroid Build Coastguard WorkerIf the network device provides multiple transmit queues the `mq`
1489*4dc78e53SAndroid Build Coastguard Workerqdisc is used by default. It will automatically create a separate
1490*4dc78e53SAndroid Build Coastguard Workerclass for each transmit queue available and will also replace
1491*4dc78e53SAndroid Build Coastguard Workerthe single per device tx lock with a per queue lock.
1492*4dc78e53SAndroid Build Coastguard Worker
1493*4dc78e53SAndroid Build Coastguard Workerimage:qdisc_mq.png["Multiqueue default Qdisc"]
1494*4dc78e53SAndroid Build Coastguard Worker
1495*4dc78e53SAndroid Build Coastguard Worker.Example of a customized classful qdisc setup
1496*4dc78e53SAndroid Build Coastguard Worker
1497*4dc78e53SAndroid Build Coastguard WorkerThe following figure illustrates a possible combination of different
1498*4dc78e53SAndroid Build Coastguard Workerqueueing and classification modules to implement quality of service
1499*4dc78e53SAndroid Build Coastguard Workerneeds.
1500*4dc78e53SAndroid Build Coastguard Worker
1501*4dc78e53SAndroid Build Coastguard Workerimage:tc_overview.png["Classful Qdisc diagram"]
1502*4dc78e53SAndroid Build Coastguard Worker
1503*4dc78e53SAndroid Build Coastguard Worker=== Traffic Control Object
1504*4dc78e53SAndroid Build Coastguard Worker
1505*4dc78e53SAndroid Build Coastguard WorkerEach type traffic control module (qdisc, class, classifier) is
1506*4dc78e53SAndroid Build Coastguard Workerrepresented by its own structure. All of them are based on the traffic
1507*4dc78e53SAndroid Build Coastguard Workercontrol object represented by `struct rtnl_tc` which itself is based
1508*4dc78e53SAndroid Build Coastguard Workeron the generic object `struct nl_object` to make it cacheable. The
1509*4dc78e53SAndroid Build Coastguard Workertraffic control object contains all attributes, implementation details
1510*4dc78e53SAndroid Build Coastguard Workerand statistics that are shared by all of the traffic control object
1511*4dc78e53SAndroid Build Coastguard Workertypes.
1512*4dc78e53SAndroid Build Coastguard Worker
1513*4dc78e53SAndroid Build Coastguard Workerimage:tc_obj.png["struct rtnl_tc hierarchy"]
1514*4dc78e53SAndroid Build Coastguard Worker
1515*4dc78e53SAndroid Build Coastguard WorkerIt is not possible to allocate a `struct rtnl_tc` object, instead the
1516*4dc78e53SAndroid Build Coastguard Workeractual tc object types must be allocated directly using
1517*4dc78e53SAndroid Build Coastguard Worker`rtnl_qdisc_alloc()`, `rtnl_class_alloc()`, `rtnl_cls_alloc()` and
1518*4dc78e53SAndroid Build Coastguard Workerthen casted to `struct rtnl_tc` using the `TC_CAST()` macro.
1519*4dc78e53SAndroid Build Coastguard Worker
1520*4dc78e53SAndroid Build Coastguard Worker.Usage Example: Allocation, Casting, Freeing
1521*4dc78e53SAndroid Build Coastguard Worker[source,c]
1522*4dc78e53SAndroid Build Coastguard Worker-----
1523*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/tc.h>
1524*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/qdisc.h>
1525*4dc78e53SAndroid Build Coastguard Worker
1526*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_qdisc *qdisc;
1527*4dc78e53SAndroid Build Coastguard Worker
1528*4dc78e53SAndroid Build Coastguard Worker/* Allocation of a qdisc object */
1529*4dc78e53SAndroid Build Coastguard Workerqdisc = rtnl_qdisc_alloc();
1530*4dc78e53SAndroid Build Coastguard Worker
1531*4dc78e53SAndroid Build Coastguard Worker/* Cast the qdisc to a tc object using TC_CAST() to use rtnl_tc_ functions. */
1532*4dc78e53SAndroid Build Coastguard Workerrtnl_tc_set_mpu(TC_CAST(qdisc), 64);
1533*4dc78e53SAndroid Build Coastguard Worker
1534*4dc78e53SAndroid Build Coastguard Worker/* Free the qdisc object */
1535*4dc78e53SAndroid Build Coastguard Workerrtnl_qdisc_put(qdisc);
1536*4dc78e53SAndroid Build Coastguard Worker-----
1537*4dc78e53SAndroid Build Coastguard Worker
1538*4dc78e53SAndroid Build Coastguard Worker[[tc_attr]]
1539*4dc78e53SAndroid Build Coastguard Worker==== Attributes
1540*4dc78e53SAndroid Build Coastguard Worker
1541*4dc78e53SAndroid Build Coastguard WorkerHandle::
1542*4dc78e53SAndroid Build Coastguard WorkerThe handle uniquely identifies a tc object and is used to refer
1543*4dc78e53SAndroid Build Coastguard Workerto other tc objects when constructing tc trees.
1544*4dc78e53SAndroid Build Coastguard Worker+
1545*4dc78e53SAndroid Build Coastguard Worker[source,c]
1546*4dc78e53SAndroid Build Coastguard Worker-----
1547*4dc78e53SAndroid Build Coastguard Workervoid rtnl_tc_set_handle(struct rtnl_tc *tc, uint32_t handle);
1548*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_tc_get_handle(struct rtnl_tc *tc);
1549*4dc78e53SAndroid Build Coastguard Worker-----
1550*4dc78e53SAndroid Build Coastguard Worker
1551*4dc78e53SAndroid Build Coastguard WorkerInterface Index::
1552*4dc78e53SAndroid Build Coastguard WorkerThe interface index specifies the network device the traffic object
1553*4dc78e53SAndroid Build Coastguard Workeris attached to. The function `rtnl_tc_set_link()` should be preferred
1554*4dc78e53SAndroid Build Coastguard Workerwhen setting the interface index. It stores the reference to the link
1555*4dc78e53SAndroid Build Coastguard Workerobject in the tc object and allows retrieving the `mtu` and `linktype`
1556*4dc78e53SAndroid Build Coastguard Workerautomatically.
1557*4dc78e53SAndroid Build Coastguard Worker+
1558*4dc78e53SAndroid Build Coastguard Worker[source,c]
1559*4dc78e53SAndroid Build Coastguard Worker-----
1560*4dc78e53SAndroid Build Coastguard Workervoid rtnl_tc_set_ifindex(struct rtnl_tc *tc, int ifindex);
1561*4dc78e53SAndroid Build Coastguard Workervoid rtnl_tc_set_link(struct rtnl_tc *tc, struct rtnl_link *link);
1562*4dc78e53SAndroid Build Coastguard Workerint rtnl_tc_get_ifindex(struct rtnl_tc *tc);
1563*4dc78e53SAndroid Build Coastguard Worker-----
1564*4dc78e53SAndroid Build Coastguard Worker
1565*4dc78e53SAndroid Build Coastguard WorkerLink Type::
1566*4dc78e53SAndroid Build Coastguard WorkerThe link type specifies the kind of link that is used by the network
1567*4dc78e53SAndroid Build Coastguard Workerdevice (e.g. ethernet, ATM, ...). It is derived automatically when
1568*4dc78e53SAndroid Build Coastguard Workerthe network device is specified with `rtnl_tc_set_link()`.
1569*4dc78e53SAndroid Build Coastguard WorkerThe default fallback is `ARPHRD_ETHER` (ethernet).
1570*4dc78e53SAndroid Build Coastguard Worker+
1571*4dc78e53SAndroid Build Coastguard Worker[source,c]
1572*4dc78e53SAndroid Build Coastguard Worker-----
1573*4dc78e53SAndroid Build Coastguard Workervoid rtnl_tc_set_linktype(struct rtnl_tc *tc, uint32_t type);
1574*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_tc_get_linktype(struct rtnl_tc *tc);
1575*4dc78e53SAndroid Build Coastguard Worker-----
1576*4dc78e53SAndroid Build Coastguard Worker
1577*4dc78e53SAndroid Build Coastguard WorkerKind::
1578*4dc78e53SAndroid Build Coastguard WorkerThe kind character string specifies the type of qdisc, class,
1579*4dc78e53SAndroid Build Coastguard Workerclassifier. Setting the kind results in the module specific
1580*4dc78e53SAndroid Build Coastguard Workerstructure being allocated. Therefore it is imperative to call
1581*4dc78e53SAndroid Build Coastguard Worker`rtnl_tc_set_kind()` before using any type specific API functions
1582*4dc78e53SAndroid Build Coastguard Workersuch as `rtnl_htb_set_rate()`.
1583*4dc78e53SAndroid Build Coastguard Worker+
1584*4dc78e53SAndroid Build Coastguard Worker[source,c]
1585*4dc78e53SAndroid Build Coastguard Worker-----
1586*4dc78e53SAndroid Build Coastguard Workerint rtnl_tc_set_kind(struct rtnl_tc *tc, const char *kind);
1587*4dc78e53SAndroid Build Coastguard Workerchar *rtnl_tc_get_kind(struct rtnl_tc *tc);
1588*4dc78e53SAndroid Build Coastguard Worker-----
1589*4dc78e53SAndroid Build Coastguard Worker
1590*4dc78e53SAndroid Build Coastguard WorkerMPU::
1591*4dc78e53SAndroid Build Coastguard WorkerThe Minimum Packet Unit specifies the minimum packet size which will
1592*4dc78e53SAndroid Build Coastguard Workerbe transmitted
1593*4dc78e53SAndroid Build Coastguard Workerever be seen by this traffic control object. This value is used for
1594*4dc78e53SAndroid Build Coastguard Workerrate calculations. Not all object implementations will make use of
1595*4dc78e53SAndroid Build Coastguard Workerthis value. The default value is 0.
1596*4dc78e53SAndroid Build Coastguard Worker+
1597*4dc78e53SAndroid Build Coastguard Worker[source,c]
1598*4dc78e53SAndroid Build Coastguard Worker-----
1599*4dc78e53SAndroid Build Coastguard Workervoid rtnl_tc_set_mpu(struct rtnl_tc *tc, uint32_t mpu);
1600*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_tc_get_mpu(struct rtnl_tc *tc);
1601*4dc78e53SAndroid Build Coastguard Worker-----
1602*4dc78e53SAndroid Build Coastguard Worker
1603*4dc78e53SAndroid Build Coastguard WorkerMTU::
1604*4dc78e53SAndroid Build Coastguard WorkerThe Maximum Transmission Unit specifies the maximum packet size which
1605*4dc78e53SAndroid Build Coastguard Workerwill be transmitted. The value is derived from the link specified
1606*4dc78e53SAndroid Build Coastguard Workerwith `rtnl_tc_set_link()` if not overwritten with `rtnl_tc_set_mtu()`.
1607*4dc78e53SAndroid Build Coastguard WorkerIf no link and MTU is specified, the value defaults to 1500
1608*4dc78e53SAndroid Build Coastguard Worker(ethernet).
1609*4dc78e53SAndroid Build Coastguard Worker+
1610*4dc78e53SAndroid Build Coastguard Worker[source,c]
1611*4dc78e53SAndroid Build Coastguard Worker-----
1612*4dc78e53SAndroid Build Coastguard Workervoid rtnl_tc_set_mtu(struct rtnl_tc *tc, uint32_t mtu);
1613*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_tc_get_mtu(struct rtnl_tc *tc);
1614*4dc78e53SAndroid Build Coastguard Worker-----
1615*4dc78e53SAndroid Build Coastguard Worker
1616*4dc78e53SAndroid Build Coastguard WorkerOverhead::
1617*4dc78e53SAndroid Build Coastguard WorkerThe overhead specifies the additional overhead per packet caused by
1618*4dc78e53SAndroid Build Coastguard Workerthe network layer. This value can be used to correct packet size
1619*4dc78e53SAndroid Build Coastguard Workercalculations if the packet size on the wire does not match the packet
1620*4dc78e53SAndroid Build Coastguard Workersize seen by the kernel. The default value is 0.
1621*4dc78e53SAndroid Build Coastguard Worker+
1622*4dc78e53SAndroid Build Coastguard Worker[source,c]
1623*4dc78e53SAndroid Build Coastguard Worker-----
1624*4dc78e53SAndroid Build Coastguard Workervoid rtnl_tc_set_overhead(struct rtnl_tc *tc, uint32_t overhead);
1625*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_tc_get_overhead(struct rtnl_tc *tc);
1626*4dc78e53SAndroid Build Coastguard Worker-----
1627*4dc78e53SAndroid Build Coastguard Worker
1628*4dc78e53SAndroid Build Coastguard WorkerParent::
1629*4dc78e53SAndroid Build Coastguard WorkerSpecifies the parent traffic control object. The parent is identified
1630*4dc78e53SAndroid Build Coastguard Workerby its handle. Special values are:
1631*4dc78e53SAndroid Build Coastguard Worker- `TC_H_ROOT`: attach tc object directly to network device (root
1632*4dc78e53SAndroid Build Coastguard Worker  qdisc, root classifier)
1633*4dc78e53SAndroid Build Coastguard Worker- `TC_H_INGRESS`: same as `TC_H_ROOT` but on the ingress side of the
1634*4dc78e53SAndroid Build Coastguard Worker  network stack.
1635*4dc78e53SAndroid Build Coastguard Worker+
1636*4dc78e53SAndroid Build Coastguard Worker[source,c]
1637*4dc78e53SAndroid Build Coastguard Worker-----
1638*4dc78e53SAndroid Build Coastguard Workervoid rtnl_tc_set_parent(struct rtnl_tc *tc, uint32_t parent);
1639*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_tc_get_parent(struct rtnl_tc *tc);
1640*4dc78e53SAndroid Build Coastguard Worker-----
1641*4dc78e53SAndroid Build Coastguard Worker
1642*4dc78e53SAndroid Build Coastguard WorkerStatistics::
1643*4dc78e53SAndroid Build Coastguard WorkerGeneric statistics, see <<tc_stats>> for additional information.
1644*4dc78e53SAndroid Build Coastguard Worker+
1645*4dc78e53SAndroid Build Coastguard Worker[source,c]
1646*4dc78e53SAndroid Build Coastguard Worker-----
1647*4dc78e53SAndroid Build Coastguard Workeruint64_t rtnl_tc_get_stat(struct rtnl_tc *tc, enum rtnl_tc_stat id);
1648*4dc78e53SAndroid Build Coastguard Worker-----
1649*4dc78e53SAndroid Build Coastguard Worker
1650*4dc78e53SAndroid Build Coastguard Worker[[tc_stats]]
1651*4dc78e53SAndroid Build Coastguard Worker==== Accessing Statistics
1652*4dc78e53SAndroid Build Coastguard Worker
1653*4dc78e53SAndroid Build Coastguard WorkerThe traffic control object holds a set of generic statistics. Not all
1654*4dc78e53SAndroid Build Coastguard Workertraffic control modules will make use of all of these statistics. Some
1655*4dc78e53SAndroid Build Coastguard Workermodules may provide additional statistics via their own APIs.
1656*4dc78e53SAndroid Build Coastguard Worker
1657*4dc78e53SAndroid Build Coastguard Worker.Statistic identifiers `(enum rtnl_tc_stat)`
1658*4dc78e53SAndroid Build Coastguard Worker[cols="m,,", options="header", frame="topbot"]
1659*4dc78e53SAndroid Build Coastguard Worker|====================================================================
1660*4dc78e53SAndroid Build Coastguard Worker| ID                 | Type    | Description
1661*4dc78e53SAndroid Build Coastguard Worker| RTNL_TC_PACKETS    | Counter | Total # of packets transmitted
1662*4dc78e53SAndroid Build Coastguard Worker| RTNL_TC_BYTES      | Counter | Total # of bytes transmitted
1663*4dc78e53SAndroid Build Coastguard Worker| RTNL_TC_RATE_BPS   | Rate    | Current bytes/s rate
1664*4dc78e53SAndroid Build Coastguard Worker| RTNL_TC_RATE_PPS   | Rate    | Current packets/s rate
1665*4dc78e53SAndroid Build Coastguard Worker| RTNL_TC_QLEN       | Rate    | Current length of the queue
1666*4dc78e53SAndroid Build Coastguard Worker| RTNL_TC_BACKLOG    | Rate    | # of packets currently backlogged
1667*4dc78e53SAndroid Build Coastguard Worker| RTNL_TC_DROPS      | Counter | # of packets dropped
1668*4dc78e53SAndroid Build Coastguard Worker| RTNL_TC_REQUEUES   | Counter | # of packets requeued
1669*4dc78e53SAndroid Build Coastguard Worker| RTNL_TC_OVERLIMITS | Counter | # of packets that exceeded the limit
1670*4dc78e53SAndroid Build Coastguard Worker|====================================================================
1671*4dc78e53SAndroid Build Coastguard Worker
1672*4dc78e53SAndroid Build Coastguard WorkerNOTE: `RTNL_TC_RATE_BPS` and `RTNL_TC_RATE_PPS` only return meaningful
1673*4dc78e53SAndroid Build Coastguard Worker      values if a rate estimator has been configured.
1674*4dc78e53SAndroid Build Coastguard Worker
1675*4dc78e53SAndroid Build Coastguard Worker.Usage Example: Retrieving tc statistics
1676*4dc78e53SAndroid Build Coastguard Worker[source,c]
1677*4dc78e53SAndroid Build Coastguard Worker-------
1678*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/tc.h>
1679*4dc78e53SAndroid Build Coastguard Worker
1680*4dc78e53SAndroid Build Coastguard Workeruint64_t drops, qlen;
1681*4dc78e53SAndroid Build Coastguard Worker
1682*4dc78e53SAndroid Build Coastguard Workerdrops = rtnl_tc_get_stat(TC_CAST(qdisc), RTNL_TC_DROPS);
1683*4dc78e53SAndroid Build Coastguard Workerqlen  = rtnl_tc_get_stat(TC_CAST(qdisc), RTNL_TC_QLEN);
1684*4dc78e53SAndroid Build Coastguard Worker-------
1685*4dc78e53SAndroid Build Coastguard Worker
1686*4dc78e53SAndroid Build Coastguard Worker==== Rate Table Calculations
1687*4dc78e53SAndroid Build Coastguard WorkerTODO
1688*4dc78e53SAndroid Build Coastguard Worker
1689*4dc78e53SAndroid Build Coastguard Worker[[tc_qdisc]]
1690*4dc78e53SAndroid Build Coastguard Worker=== Queueing Discipline (qdisc)
1691*4dc78e53SAndroid Build Coastguard Worker
1692*4dc78e53SAndroid Build Coastguard Worker.Classless Qdisc
1693*4dc78e53SAndroid Build Coastguard Worker
1694*4dc78e53SAndroid Build Coastguard WorkerThe queueing discipline (qdisc) is used to implement fair queueing,
1695*4dc78e53SAndroid Build Coastguard Workerprioritization or rate control. It provides a _enqueue()_ and
1696*4dc78e53SAndroid Build Coastguard Worker_dequeue()_ operation. Whenever a network packet leaves the networking
1697*4dc78e53SAndroid Build Coastguard Workerstack over a network device, be it a physical or virtual device, it
1698*4dc78e53SAndroid Build Coastguard Workerwill be enqueued to a qdisc unless the device is queueless. The
1699*4dc78e53SAndroid Build Coastguard Worker_enqueue()_ operation is followed by an immediate call to _dequeue()_
1700*4dc78e53SAndroid Build Coastguard Workerfor the same qdisc to eventually retrieve a packet which can be
1701*4dc78e53SAndroid Build Coastguard Workerscheduled for transmission by the driver. Additionally, the networking
1702*4dc78e53SAndroid Build Coastguard Workerstack runs a watchdog which polls the qdisc regularly to dequeue and
1703*4dc78e53SAndroid Build Coastguard Workersend packets even if no new packets are being enqueued.
1704*4dc78e53SAndroid Build Coastguard Worker
1705*4dc78e53SAndroid Build Coastguard WorkerThis additional watchdog is required due to the fact that qdiscs may
1706*4dc78e53SAndroid Build Coastguard Workerhold on to packets and not return any packets upon _dequeue()_ in
1707*4dc78e53SAndroid Build Coastguard Workerorder to enforce bandwidth restrictions.
1708*4dc78e53SAndroid Build Coastguard Worker
1709*4dc78e53SAndroid Build Coastguard Workerimage:classless_qdisc_nbands.png[alt="Multiband Qdisc", float="right"]
1710*4dc78e53SAndroid Build Coastguard Worker
1711*4dc78e53SAndroid Build Coastguard WorkerThe figure illustrates a trivial example of a classless qdisc
1712*4dc78e53SAndroid Build Coastguard Workerconsisting of three bands (queues). Use of multiple bands is a common
1713*4dc78e53SAndroid Build Coastguard Workertechnique in qdiscs to implement fair queueing between flows or
1714*4dc78e53SAndroid Build Coastguard Workerprioritize differentiated services.
1715*4dc78e53SAndroid Build Coastguard Worker
1716*4dc78e53SAndroid Build Coastguard WorkerClassless qdiscs can be regarded as a blackbox, their inner workings
1717*4dc78e53SAndroid Build Coastguard Workercan only be steered using the configuration parameters provided by the
1718*4dc78e53SAndroid Build Coastguard Workerqdisc. There is no way of taking influence on the structure of its
1719*4dc78e53SAndroid Build Coastguard Workerinternal queues itself.
1720*4dc78e53SAndroid Build Coastguard Worker
1721*4dc78e53SAndroid Build Coastguard Worker.Classful Qdisc
1722*4dc78e53SAndroid Build Coastguard Worker
1723*4dc78e53SAndroid Build Coastguard WorkerClassful qdiscs allow for the queueing structure and classification
1724*4dc78e53SAndroid Build Coastguard Workerprocess to be created by the user.
1725*4dc78e53SAndroid Build Coastguard Worker
1726*4dc78e53SAndroid Build Coastguard Workerimage:classful_qdisc.png["Classful Qdisc"]
1727*4dc78e53SAndroid Build Coastguard Worker
1728*4dc78e53SAndroid Build Coastguard WorkerThe figure above shows a classful qdisc with a classifier attached to
1729*4dc78e53SAndroid Build Coastguard Workerit which will make the decision whether to enqueue a packet to traffic
1730*4dc78e53SAndroid Build Coastguard Workerclass +1:1+ or +1:2+. Unlike with classless qdiscs, classful qdiscs
1731*4dc78e53SAndroid Build Coastguard Workerallow the classification process and the structure of the queues to be
1732*4dc78e53SAndroid Build Coastguard Workerdefined by the user. This allows for complex traffic class rules to
1733*4dc78e53SAndroid Build Coastguard Workerbe applied.
1734*4dc78e53SAndroid Build Coastguard Worker
1735*4dc78e53SAndroid Build Coastguard Worker.List of Qdisc Implementations
1736*4dc78e53SAndroid Build Coastguard Worker[options="header", frame="topbot", cols="2,1^,8"]
1737*4dc78e53SAndroid Build Coastguard Worker|======================================================================
1738*4dc78e53SAndroid Build Coastguard Worker| Qdisc     | Classful | Description
1739*4dc78e53SAndroid Build Coastguard Worker| ATM       | Yes      | FIXME
1740*4dc78e53SAndroid Build Coastguard Worker| Blackhole | No       | This qdisc will drop all packets passed to it.
1741*4dc78e53SAndroid Build Coastguard Worker| CBQ       | Yes      |
1742*4dc78e53SAndroid Build Coastguard WorkerThe CBQ (Class Based Queueing) is a classful qdisc which allows
1743*4dc78e53SAndroid Build Coastguard Workercreating traffic classes and enforce bandwidth limitations for each
1744*4dc78e53SAndroid Build Coastguard Workerclass.
1745*4dc78e53SAndroid Build Coastguard Worker| DRR       | Yes      |
1746*4dc78e53SAndroid Build Coastguard WorkerThe DRR (Deficit Round Robin) scheduler is a classful qdisc
1747*4dc78e53SAndroid Build Coastguard Workerimplementing fair queueing. Each class is assigned a quantum specifying
1748*4dc78e53SAndroid Build Coastguard Workerthe maximum number of bytes that can be served per round.  Unused
1749*4dc78e53SAndroid Build Coastguard Workerquantum at the end of the round is carried over to the next round.
1750*4dc78e53SAndroid Build Coastguard Worker| DSMARK   | Yes       | FIXME
1751*4dc78e53SAndroid Build Coastguard Worker| FIFO     | No        | FIXME
1752*4dc78e53SAndroid Build Coastguard Worker| GRED     | No        | FIXME
1753*4dc78e53SAndroid Build Coastguard Worker| HFSC     | Yes       | FIXME
1754*4dc78e53SAndroid Build Coastguard Worker| HTB      | Yes       | FIXME
1755*4dc78e53SAndroid Build Coastguard Worker| mq       | Yes       | FIXME
1756*4dc78e53SAndroid Build Coastguard Worker| multiq   | Yes       | FIXME
1757*4dc78e53SAndroid Build Coastguard Worker| netem    | No        | FIXME
1758*4dc78e53SAndroid Build Coastguard Worker| Prio     | Yes       | FIXME
1759*4dc78e53SAndroid Build Coastguard Worker| RED      | Yes       | FIXME
1760*4dc78e53SAndroid Build Coastguard Worker| SFQ      | Yes       | FIXME
1761*4dc78e53SAndroid Build Coastguard Worker| TBF      | Yes       | FIXME
1762*4dc78e53SAndroid Build Coastguard Worker| teql     | No        | FIXME
1763*4dc78e53SAndroid Build Coastguard Worker|======================================================================
1764*4dc78e53SAndroid Build Coastguard Worker
1765*4dc78e53SAndroid Build Coastguard Worker
1766*4dc78e53SAndroid Build Coastguard Worker.QDisc API Overview
1767*4dc78e53SAndroid Build Coastguard Worker[cols="a,a", options="header", frame="topbot"]
1768*4dc78e53SAndroid Build Coastguard Worker|====================================================================
1769*4dc78e53SAndroid Build Coastguard Worker| Attribute | C Interface
1770*4dc78e53SAndroid Build Coastguard Worker|
1771*4dc78e53SAndroid Build Coastguard WorkerAllocation / Freeing::
1772*4dc78e53SAndroid Build Coastguard Worker|
1773*4dc78e53SAndroid Build Coastguard Worker[source,c]
1774*4dc78e53SAndroid Build Coastguard Worker-----
1775*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_qdisc *rtnl_qdisc_alloc(void);
1776*4dc78e53SAndroid Build Coastguard Workervoid rtnl_qdisc_put(struct rtnl_qdisc *qdisc);
1777*4dc78e53SAndroid Build Coastguard Worker-----
1778*4dc78e53SAndroid Build Coastguard Worker|
1779*4dc78e53SAndroid Build Coastguard WorkerAddition::
1780*4dc78e53SAndroid Build Coastguard Worker|
1781*4dc78e53SAndroid Build Coastguard Worker[source,c]
1782*4dc78e53SAndroid Build Coastguard Worker-----
1783*4dc78e53SAndroid Build Coastguard Workerint rtnl_qdisc_build_add_request(struct rtnl_qdisc *qdisc, int flags,
1784*4dc78e53SAndroid Build Coastguard Worker				 struct nl_msg **result);
1785*4dc78e53SAndroid Build Coastguard Workerint rtnl_qdisc_add(struct nl_sock *sock, struct rtnl_qdisc *qdisc,
1786*4dc78e53SAndroid Build Coastguard Worker                   int flags);
1787*4dc78e53SAndroid Build Coastguard Worker-----
1788*4dc78e53SAndroid Build Coastguard Worker|
1789*4dc78e53SAndroid Build Coastguard WorkerModification::
1790*4dc78e53SAndroid Build Coastguard Worker|
1791*4dc78e53SAndroid Build Coastguard Worker[source,c]
1792*4dc78e53SAndroid Build Coastguard Worker-----
1793*4dc78e53SAndroid Build Coastguard Workerint rtnl_qdisc_build_change_request(struct rtnl_qdisc *old,
1794*4dc78e53SAndroid Build Coastguard Worker				    struct rtnl_qdisc *new,
1795*4dc78e53SAndroid Build Coastguard Worker				    struct nl_msg **result);
1796*4dc78e53SAndroid Build Coastguard Workerint rtnl_qdisc_change(struct nl_sock *sock, struct rtnl_qdisc *old,
1797*4dc78e53SAndroid Build Coastguard Worker		      struct rtnl_qdisc *new);
1798*4dc78e53SAndroid Build Coastguard Worker-----
1799*4dc78e53SAndroid Build Coastguard Worker|
1800*4dc78e53SAndroid Build Coastguard WorkerDeletion::
1801*4dc78e53SAndroid Build Coastguard Worker|
1802*4dc78e53SAndroid Build Coastguard Worker[source,c]
1803*4dc78e53SAndroid Build Coastguard Worker-----
1804*4dc78e53SAndroid Build Coastguard Workerint rtnl_qdisc_build_delete_request(struct rtnl_qdisc *qdisc,
1805*4dc78e53SAndroid Build Coastguard Worker				    struct nl_msg **result);
1806*4dc78e53SAndroid Build Coastguard Workerint rtnl_qdisc_delete(struct nl_sock *sock, struct rtnl_qdisc *qdisc);
1807*4dc78e53SAndroid Build Coastguard Worker-----
1808*4dc78e53SAndroid Build Coastguard Worker|
1809*4dc78e53SAndroid Build Coastguard WorkerCache::
1810*4dc78e53SAndroid Build Coastguard Worker|
1811*4dc78e53SAndroid Build Coastguard Worker[source,c]
1812*4dc78e53SAndroid Build Coastguard Worker-----
1813*4dc78e53SAndroid Build Coastguard Workerint rtnl_qdisc_alloc_cache(struct nl_sock *sock,
1814*4dc78e53SAndroid Build Coastguard Worker			   struct nl_cache **cache);
1815*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_qdisc *rtnl_qdisc_get(struct nl_cache *cache, int, uint32_t);
1816*4dc78e53SAndroid Build Coastguard Worker
1817*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_qdisc *rtnl_qdisc_get_by_parent(struct nl_cache *, int, uint32_t);
1818*4dc78e53SAndroid Build Coastguard Worker-----
1819*4dc78e53SAndroid Build Coastguard Worker|====================================================================
1820*4dc78e53SAndroid Build Coastguard Worker
1821*4dc78e53SAndroid Build Coastguard Worker[[qdisc_get]]
1822*4dc78e53SAndroid Build Coastguard Worker==== Retrieving Qdisc Configuration
1823*4dc78e53SAndroid Build Coastguard Worker
1824*4dc78e53SAndroid Build Coastguard WorkerThe function rtnl_qdisc_alloc_cache() is used to retrieve the current
1825*4dc78e53SAndroid Build Coastguard Workerqdisc configuration in the kernel. It will construct a +RTM_GETQDISC+
1826*4dc78e53SAndroid Build Coastguard Workernetlink message, requesting the complete list of qdiscs configured in
1827*4dc78e53SAndroid Build Coastguard Workerthe kernel.
1828*4dc78e53SAndroid Build Coastguard Worker
1829*4dc78e53SAndroid Build Coastguard Worker[source,c]
1830*4dc78e53SAndroid Build Coastguard Worker-------
1831*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/qdisc.h>
1832*4dc78e53SAndroid Build Coastguard Worker
1833*4dc78e53SAndroid Build Coastguard Workerstruct nl_cache *all_qdiscs;
1834*4dc78e53SAndroid Build Coastguard Worker
1835*4dc78e53SAndroid Build Coastguard Workerif (rtnl_link_alloc_cache(sock, &all_qdiscs) < 0)
1836*4dc78e53SAndroid Build Coastguard Worker	/* error while retrieving qdisc cfg */
1837*4dc78e53SAndroid Build Coastguard Worker-------
1838*4dc78e53SAndroid Build Coastguard Worker
1839*4dc78e53SAndroid Build Coastguard WorkerThe cache can be accessed using the following functions:
1840*4dc78e53SAndroid Build Coastguard Worker
1841*4dc78e53SAndroid Build Coastguard Worker- Search qdisc with matching ifindex and handle:
1842*4dc78e53SAndroid Build Coastguard Worker+
1843*4dc78e53SAndroid Build Coastguard Worker[source,c]
1844*4dc78e53SAndroid Build Coastguard Worker--------
1845*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_qdisc *rtnl_qdisc_get(struct nl_cache *cache, int ifindex, uint32_t handle);
1846*4dc78e53SAndroid Build Coastguard Worker--------
1847*4dc78e53SAndroid Build Coastguard Worker- Search qdisc with matching ifindex and parent:
1848*4dc78e53SAndroid Build Coastguard Worker+
1849*4dc78e53SAndroid Build Coastguard Worker[source,c]
1850*4dc78e53SAndroid Build Coastguard Worker--------
1851*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_qdisc *rtnl_qdisc_get_by_parent(struct nl_cache *cache, int ifindex , uint32_t parent);
1852*4dc78e53SAndroid Build Coastguard Worker--------
1853*4dc78e53SAndroid Build Coastguard Worker- Or any of the generic cache functions (e.g. nl_cache_search(), nl_cache_dump(), etc.)
1854*4dc78e53SAndroid Build Coastguard Worker
1855*4dc78e53SAndroid Build Coastguard Worker.Example: Search and print qdisc
1856*4dc78e53SAndroid Build Coastguard Worker[source,c]
1857*4dc78e53SAndroid Build Coastguard Worker-------
1858*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_qdisc *qdisc;
1859*4dc78e53SAndroid Build Coastguard Workerint ifindex;
1860*4dc78e53SAndroid Build Coastguard Worker
1861*4dc78e53SAndroid Build Coastguard Workerifindex = rtnl_link_get_ifindex(eth0_obj);
1862*4dc78e53SAndroid Build Coastguard Worker
1863*4dc78e53SAndroid Build Coastguard Worker/* search for qdisc on eth0 with handle 1:0 */
1864*4dc78e53SAndroid Build Coastguard Workerif (!(qdisc = rtnl_qdisc_get(all_qdiscs, ifindex, TC_HANDLE(1, 0))))
1865*4dc78e53SAndroid Build Coastguard Worker	/* no such qdisc found */
1866*4dc78e53SAndroid Build Coastguard Worker
1867*4dc78e53SAndroid Build Coastguard Workernl_object_dump(OBJ_CAST(qdisc), NULL);
1868*4dc78e53SAndroid Build Coastguard Worker
1869*4dc78e53SAndroid Build Coastguard Workerrtnl_qdisc_put(qdisc);
1870*4dc78e53SAndroid Build Coastguard Worker-------
1871*4dc78e53SAndroid Build Coastguard Worker
1872*4dc78e53SAndroid Build Coastguard Worker[[qdisc_add]]
1873*4dc78e53SAndroid Build Coastguard Worker==== Adding a Qdisc
1874*4dc78e53SAndroid Build Coastguard Worker
1875*4dc78e53SAndroid Build Coastguard WorkerIn order to add a new qdisc to the kernel, a qdisc object needs to be
1876*4dc78e53SAndroid Build Coastguard Workerallocated. It will hold all attributes of the new qdisc.
1877*4dc78e53SAndroid Build Coastguard Worker
1878*4dc78e53SAndroid Build Coastguard Worker[source,c]
1879*4dc78e53SAndroid Build Coastguard Worker-----
1880*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/qdisc.h>
1881*4dc78e53SAndroid Build Coastguard Worker
1882*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_qdisc *qdisc;
1883*4dc78e53SAndroid Build Coastguard Worker
1884*4dc78e53SAndroid Build Coastguard Workerif (!(qdisc = rtnl_qdisc_alloc()))
1885*4dc78e53SAndroid Build Coastguard Worker	/* OOM error */
1886*4dc78e53SAndroid Build Coastguard Worker-----
1887*4dc78e53SAndroid Build Coastguard Worker
1888*4dc78e53SAndroid Build Coastguard WorkerThe next step is to specify all generic qdisc attributes using the tc
1889*4dc78e53SAndroid Build Coastguard Workerobject interface described in the section <<tc_attr>>.
1890*4dc78e53SAndroid Build Coastguard Worker
1891*4dc78e53SAndroid Build Coastguard WorkerThe following attributes must be specified:
1892*4dc78e53SAndroid Build Coastguard Worker- IfIndex
1893*4dc78e53SAndroid Build Coastguard Worker- Parent
1894*4dc78e53SAndroid Build Coastguard Worker- Kind
1895*4dc78e53SAndroid Build Coastguard Worker
1896*4dc78e53SAndroid Build Coastguard Worker[source,c]
1897*4dc78e53SAndroid Build Coastguard Worker-----
1898*4dc78e53SAndroid Build Coastguard Worker/* Attach qdisc to device eth0 */
1899*4dc78e53SAndroid Build Coastguard Workerrtnl_tc_set_link(TC_CAST(qdisc), eth0_obj);
1900*4dc78e53SAndroid Build Coastguard Worker
1901*4dc78e53SAndroid Build Coastguard Worker/* Make this the root qdisc */
1902*4dc78e53SAndroid Build Coastguard Workerrtnl_tc_set_parent(TC_CAST(qdisc), TC_H_ROOT);
1903*4dc78e53SAndroid Build Coastguard Worker
1904*4dc78e53SAndroid Build Coastguard Worker/* Set qdisc identifier to 1:0, if left unspecified, a handle will be generated by the kernel. */
1905*4dc78e53SAndroid Build Coastguard Workerrtnl_tc_set_handle(TC_CAST(qdisc), TC_HANDLE(1, 0));
1906*4dc78e53SAndroid Build Coastguard Worker
1907*4dc78e53SAndroid Build Coastguard Worker/* Make this a HTB qdisc */
1908*4dc78e53SAndroid Build Coastguard Workerrtnl_tc_set_kind(TC_CAST(qdisc), "htb");
1909*4dc78e53SAndroid Build Coastguard Worker-----
1910*4dc78e53SAndroid Build Coastguard Worker
1911*4dc78e53SAndroid Build Coastguard WorkerAfter specifying the qdisc kind (rtnl_tc_set_kind()) the qdisc type
1912*4dc78e53SAndroid Build Coastguard Workerspecific interface can be used to set attributes which are specific
1913*4dc78e53SAndroid Build Coastguard Workerto the respective qdisc implementations:
1914*4dc78e53SAndroid Build Coastguard Worker
1915*4dc78e53SAndroid Build Coastguard Worker[source,c]
1916*4dc78e53SAndroid Build Coastguard Worker------
1917*4dc78e53SAndroid Build Coastguard Worker/* HTB feature: Make unclassified packets go to traffic class 1:5 */
1918*4dc78e53SAndroid Build Coastguard Workerrtnl_htb_set_defcls(qdisc, TC_HANDLE(1, 5));
1919*4dc78e53SAndroid Build Coastguard Worker------
1920*4dc78e53SAndroid Build Coastguard Worker
1921*4dc78e53SAndroid Build Coastguard WorkerFinally, the qdisc is ready to be added and can be passed on to the
1922*4dc78e53SAndroid Build Coastguard Workerfunction rntl_qdisc_add() which takes care of constructing a netlink
1923*4dc78e53SAndroid Build Coastguard Workermessage requesting the addition of the new qdisc, sends the message to
1924*4dc78e53SAndroid Build Coastguard Workerthe kernel and waits for the response by the kernel. The function
1925*4dc78e53SAndroid Build Coastguard Workerreturns 0 if the qdisc has been added or updated successfully or a
1926*4dc78e53SAndroid Build Coastguard Workernegative error code if an error occured.
1927*4dc78e53SAndroid Build Coastguard Worker
1928*4dc78e53SAndroid Build Coastguard WorkerCAUTION: The kernel operation for updating and adding a qdisc is the
1929*4dc78e53SAndroid Build Coastguard Worker         same. Therefore when calling rtnl_qdisc_add() any existing
1930*4dc78e53SAndroid Build Coastguard Worker         qdisc with matching handle will be updated unless the flag
1931*4dc78e53SAndroid Build Coastguard Worker         NLM_F_EXCL is specified.
1932*4dc78e53SAndroid Build Coastguard Worker
1933*4dc78e53SAndroid Build Coastguard WorkerThe following flags may be specified:
1934*4dc78e53SAndroid Build Coastguard Worker[horizontal]
1935*4dc78e53SAndroid Build Coastguard WorkerNLM_F_CREATE::  Create qdisc if it does not exist, otherwise
1936*4dc78e53SAndroid Build Coastguard Worker                -NLE_OBJ_NOTFOUND is returned.
1937*4dc78e53SAndroid Build Coastguard WorkerNLM_F_REPLACE:: If another qdisc is already attached to the same
1938*4dc78e53SAndroid Build Coastguard Worker                parent and their handles mismatch, replace the qdisc
1939*4dc78e53SAndroid Build Coastguard Worker                instead of returning -EEXIST.
1940*4dc78e53SAndroid Build Coastguard WorkerNLM_F_EXCL::    Return -NLE_EXISTS if a qdisc with matching handles
1941*4dc78e53SAndroid Build Coastguard Worker                exists already.
1942*4dc78e53SAndroid Build Coastguard Worker
1943*4dc78e53SAndroid Build Coastguard WorkerWARNING: The function rtnl_qdisc_add() requires administrator
1944*4dc78e53SAndroid Build Coastguard Worker         privileges.
1945*4dc78e53SAndroid Build Coastguard Worker
1946*4dc78e53SAndroid Build Coastguard Worker[source,c]
1947*4dc78e53SAndroid Build Coastguard Worker------
1948*4dc78e53SAndroid Build Coastguard Worker/* Submit request to kernel and wait for response */
1949*4dc78e53SAndroid Build Coastguard Workererr = rtnl_qdisc_add(sock, qdisc, NLM_F_CREATE);
1950*4dc78e53SAndroid Build Coastguard Worker
1951*4dc78e53SAndroid Build Coastguard Worker/* Return the qdisc object to free memory resources */
1952*4dc78e53SAndroid Build Coastguard Workerrtnl_qdisc_put(qdisc);
1953*4dc78e53SAndroid Build Coastguard Worker
1954*4dc78e53SAndroid Build Coastguard Workerif (err < 0) {
1955*4dc78e53SAndroid Build Coastguard Worker	fprintf(stderr, "Unable to add qdisc: %s\n", nl_geterror(err));
1956*4dc78e53SAndroid Build Coastguard Worker	return err;
1957*4dc78e53SAndroid Build Coastguard Worker}
1958*4dc78e53SAndroid Build Coastguard Worker------
1959*4dc78e53SAndroid Build Coastguard Worker
1960*4dc78e53SAndroid Build Coastguard Worker==== Deleting a qdisc
1961*4dc78e53SAndroid Build Coastguard Worker
1962*4dc78e53SAndroid Build Coastguard Worker[source,c]
1963*4dc78e53SAndroid Build Coastguard Worker------
1964*4dc78e53SAndroid Build Coastguard Worker#include <netlink/route/qdisc.h>
1965*4dc78e53SAndroid Build Coastguard Worker
1966*4dc78e53SAndroid Build Coastguard Workerstruct rtnl_qdisc *qdisc;
1967*4dc78e53SAndroid Build Coastguard Worker
1968*4dc78e53SAndroid Build Coastguard Workerqdisc = rtnl_qdisc_alloc();
1969*4dc78e53SAndroid Build Coastguard Worker
1970*4dc78e53SAndroid Build Coastguard Workerrtnl_tc_set_link(TC_CAST(qdisc), eth0_obj);
1971*4dc78e53SAndroid Build Coastguard Workerrtnl_tc_set_parent(TC_CAST(qdisc), TC_H_ROOT);
1972*4dc78e53SAndroid Build Coastguard Worker
1973*4dc78e53SAndroid Build Coastguard Workerrtnl_qdisc_delete(sock, qdisc)
1974*4dc78e53SAndroid Build Coastguard Worker
1975*4dc78e53SAndroid Build Coastguard Workerrtnl_qdisc_put(qdisc);
1976*4dc78e53SAndroid Build Coastguard Worker------
1977*4dc78e53SAndroid Build Coastguard Worker
1978*4dc78e53SAndroid Build Coastguard WorkerWARNING: The function rtnl_qdisc_delete() requires administrator
1979*4dc78e53SAndroid Build Coastguard Worker         privileges.
1980*4dc78e53SAndroid Build Coastguard Worker
1981*4dc78e53SAndroid Build Coastguard Worker
1982*4dc78e53SAndroid Build Coastguard Worker[[qdisc_htb]]
1983*4dc78e53SAndroid Build Coastguard Worker==== HTB - Hierarchical Token Bucket
1984*4dc78e53SAndroid Build Coastguard Worker
1985*4dc78e53SAndroid Build Coastguard Worker.HTB Qdisc Attributes
1986*4dc78e53SAndroid Build Coastguard Worker
1987*4dc78e53SAndroid Build Coastguard WorkerDefault Class::
1988*4dc78e53SAndroid Build Coastguard WorkerThe default class is the fallback class to which all traffic which
1989*4dc78e53SAndroid Build Coastguard Workerremained unclassified is directed to. If no default class or an
1990*4dc78e53SAndroid Build Coastguard Workerinvalid default class is specified, packets are transmitted directly
1991*4dc78e53SAndroid Build Coastguard Workerto the next layer (direct transmissions).
1992*4dc78e53SAndroid Build Coastguard Worker+
1993*4dc78e53SAndroid Build Coastguard Worker[source,c]
1994*4dc78e53SAndroid Build Coastguard Worker-----
1995*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_htb_get_defcls(struct rtnl_qdisc *qdisc);
1996*4dc78e53SAndroid Build Coastguard Workerint rtnl_htb_set_defcls(struct rtnl_qdisc *qdisc, uint32_t defcls);
1997*4dc78e53SAndroid Build Coastguard Worker-----
1998*4dc78e53SAndroid Build Coastguard Worker
1999*4dc78e53SAndroid Build Coastguard WorkerRate to Quantum (r2q)::
2000*4dc78e53SAndroid Build Coastguard WorkerTODO
2001*4dc78e53SAndroid Build Coastguard Worker+
2002*4dc78e53SAndroid Build Coastguard Worker[source,c]
2003*4dc78e53SAndroid Build Coastguard Worker-----
2004*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_htb_get_rate2quantum(struct rtnl_qdisc *qdisc);
2005*4dc78e53SAndroid Build Coastguard Workerint rtnl_htb_set_rate2quantum(struct rtnl_qdisc *qdisc, uint32_t rate2quantum);
2006*4dc78e53SAndroid Build Coastguard Worker-----
2007*4dc78e53SAndroid Build Coastguard Worker
2008*4dc78e53SAndroid Build Coastguard Worker
2009*4dc78e53SAndroid Build Coastguard Worker.HTB Class Attributes
2010*4dc78e53SAndroid Build Coastguard Worker
2011*4dc78e53SAndroid Build Coastguard WorkerPriority::
2012*4dc78e53SAndroid Build Coastguard Worker+
2013*4dc78e53SAndroid Build Coastguard Worker[source,c]
2014*4dc78e53SAndroid Build Coastguard Worker-----
2015*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_htb_get_prio(struct rtnl_class *class);
2016*4dc78e53SAndroid Build Coastguard Workerint rtnl_htb_set_prio(struct rtnl_class *class, uint32_t prio);
2017*4dc78e53SAndroid Build Coastguard Worker-----
2018*4dc78e53SAndroid Build Coastguard Worker
2019*4dc78e53SAndroid Build Coastguard WorkerRate::
2020*4dc78e53SAndroid Build Coastguard WorkerThe rate (bytes/s) specifies the maximum bandwidth an individual class
2021*4dc78e53SAndroid Build Coastguard Workercan use without borrowing. The rate of a class should always be greater
2022*4dc78e53SAndroid Build Coastguard Workeror erqual than the rate of its children.
2023*4dc78e53SAndroid Build Coastguard Worker+
2024*4dc78e53SAndroid Build Coastguard Worker[source,c]
2025*4dc78e53SAndroid Build Coastguard Worker-----
2026*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_htb_get_rate(struct rtnl_class *class);
2027*4dc78e53SAndroid Build Coastguard Workerint rtnl_htb_set_rate(struct rtnl_class *class, uint32_t ceil);
2028*4dc78e53SAndroid Build Coastguard Worker-----
2029*4dc78e53SAndroid Build Coastguard Worker
2030*4dc78e53SAndroid Build Coastguard WorkerCeil Rate::
2031*4dc78e53SAndroid Build Coastguard WorkerThe ceil rate specifies the maximum bandwidth an individual class
2032*4dc78e53SAndroid Build Coastguard Workercan use. This includes bandwidth that is being borrowed from other
2033*4dc78e53SAndroid Build Coastguard Workerclasses. Ceil defaults to the class rate implying that by default
2034*4dc78e53SAndroid Build Coastguard Workerthe class will not borrow. The ceil rate of a class should always
2035*4dc78e53SAndroid Build Coastguard Workerbe greater or erqual than the ceil rate of its children.
2036*4dc78e53SAndroid Build Coastguard Worker+
2037*4dc78e53SAndroid Build Coastguard Worker[source,c]
2038*4dc78e53SAndroid Build Coastguard Worker-----
2039*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_htb_get_ceil(struct rtnl_class *class);
2040*4dc78e53SAndroid Build Coastguard Workerint rtnl_htb_set_ceil(struct rtnl_class *class, uint32_t ceil);
2041*4dc78e53SAndroid Build Coastguard Worker-----
2042*4dc78e53SAndroid Build Coastguard Worker
2043*4dc78e53SAndroid Build Coastguard WorkerBurst::
2044*4dc78e53SAndroid Build Coastguard WorkerTODO
2045*4dc78e53SAndroid Build Coastguard Worker+
2046*4dc78e53SAndroid Build Coastguard Worker[source,c]
2047*4dc78e53SAndroid Build Coastguard Worker-----
2048*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_htb_get_rbuffer(struct rtnl_class *class);
2049*4dc78e53SAndroid Build Coastguard Workerint rtnl_htb_set_rbuffer(struct rtnl_class *class, uint32_t burst);
2050*4dc78e53SAndroid Build Coastguard Worker-----
2051*4dc78e53SAndroid Build Coastguard Worker
2052*4dc78e53SAndroid Build Coastguard WorkerCeil Burst::
2053*4dc78e53SAndroid Build Coastguard WorkerTODO
2054*4dc78e53SAndroid Build Coastguard Worker+
2055*4dc78e53SAndroid Build Coastguard Worker[source,c]
2056*4dc78e53SAndroid Build Coastguard Worker-----
2057*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_htb_get_cbuffer(struct rtnl_class *);
2058*4dc78e53SAndroid Build Coastguard Workerint rtnl_htb_set_cbuffer(struct rtnl_class *, uint32_t);
2059*4dc78e53SAndroid Build Coastguard Worker-----
2060*4dc78e53SAndroid Build Coastguard Worker
2061*4dc78e53SAndroid Build Coastguard WorkerQuantum::
2062*4dc78e53SAndroid Build Coastguard WorkerTODO
2063*4dc78e53SAndroid Build Coastguard Worker+
2064*4dc78e53SAndroid Build Coastguard Worker[source,c]
2065*4dc78e53SAndroid Build Coastguard Worker-----
2066*4dc78e53SAndroid Build Coastguard Workeruint32_t rtnl_htb_get_quantum(struct rtnl_class *class);
2067*4dc78e53SAndroid Build Coastguard Workerint rtnl_htb_set_quantum(struct rtnl_class *class, uint32_t quantum);
2068*4dc78e53SAndroid Build Coastguard Worker-----
2069*4dc78e53SAndroid Build Coastguard Worker
2070*4dc78e53SAndroid Build Coastguard Worker
2071*4dc78e53SAndroid Build Coastguard Worker[[tc_class]]
2072*4dc78e53SAndroid Build Coastguard Worker=== Class
2073*4dc78e53SAndroid Build Coastguard Worker
2074*4dc78e53SAndroid Build Coastguard Worker[options="header", cols="s,a,a,a,a"]
2075*4dc78e53SAndroid Build Coastguard Worker|=======================================================================
2076*4dc78e53SAndroid Build Coastguard Worker|        | UNSPEC             | TC_H_ROOT          | 0:pY  | pX:pY
2077*4dc78e53SAndroid Build Coastguard Worker| UNSPEC 3+^|
2078*4dc78e53SAndroid Build Coastguard Worker[horizontal]
2079*4dc78e53SAndroid Build Coastguard Workerqdisc =:: root-qdisc
2080*4dc78e53SAndroid Build Coastguard Workerclass =:: root-qdisc:0
2081*4dc78e53SAndroid Build Coastguard Worker|
2082*4dc78e53SAndroid Build Coastguard Worker[horizontal]
2083*4dc78e53SAndroid Build Coastguard Workerqdisc =:: pX:0
2084*4dc78e53SAndroid Build Coastguard Workerclass =:: pX:0
2085*4dc78e53SAndroid Build Coastguard Worker| 0:hY 3+^|
2086*4dc78e53SAndroid Build Coastguard Worker[horizontal]
2087*4dc78e53SAndroid Build Coastguard Workerqdisc =:: root-qdisc
2088*4dc78e53SAndroid Build Coastguard Workerclass =:: root-qdisc:hY
2089*4dc78e53SAndroid Build Coastguard Worker|
2090*4dc78e53SAndroid Build Coastguard Worker[horizontal]
2091*4dc78e53SAndroid Build Coastguard Workerqdisc =:: pX:0
2092*4dc78e53SAndroid Build Coastguard Workerclass =:: pX:hY
2093*4dc78e53SAndroid Build Coastguard Worker| hX:hY 3+^|
2094*4dc78e53SAndroid Build Coastguard Worker[horizontal]
2095*4dc78e53SAndroid Build Coastguard Workerqdisc =:: hX:
2096*4dc78e53SAndroid Build Coastguard Workerclass =:: hX:hY
2097*4dc78e53SAndroid Build Coastguard Worker|
2098*4dc78e53SAndroid Build Coastguard Workerif pX != hX
2099*4dc78e53SAndroid Build Coastguard Worker    return -EINVAL
2100*4dc78e53SAndroid Build Coastguard Worker[horizontal]
2101*4dc78e53SAndroid Build Coastguard Workerqdisc =:: hX:
2102*4dc78e53SAndroid Build Coastguard Workerclass =:: hX:hY
2103*4dc78e53SAndroid Build Coastguard Worker|=======================================================================
2104*4dc78e53SAndroid Build Coastguard Worker
2105*4dc78e53SAndroid Build Coastguard Worker[[tc_cls]]
2106*4dc78e53SAndroid Build Coastguard Worker=== Classifier (cls)
2107*4dc78e53SAndroid Build Coastguard Worker
2108*4dc78e53SAndroid Build Coastguard WorkerTODO
2109*4dc78e53SAndroid Build Coastguard Worker
2110*4dc78e53SAndroid Build Coastguard Worker[[tc_classid_mngt]]
2111*4dc78e53SAndroid Build Coastguard Worker=== ClassID Management
2112*4dc78e53SAndroid Build Coastguard Worker
2113*4dc78e53SAndroid Build Coastguard WorkerTODO
2114*4dc78e53SAndroid Build Coastguard Worker
2115*4dc78e53SAndroid Build Coastguard Worker[[tc_pktloc]]
2116*4dc78e53SAndroid Build Coastguard Worker=== Packet Location Aliasing (pktloc)
2117*4dc78e53SAndroid Build Coastguard Worker
2118*4dc78e53SAndroid Build Coastguard WorkerTODO
2119*4dc78e53SAndroid Build Coastguard Worker
2120*4dc78e53SAndroid Build Coastguard Worker[[tc_api]]
2121*4dc78e53SAndroid Build Coastguard Worker=== Traffic Control Module API
2122*4dc78e53SAndroid Build Coastguard Worker
2123*4dc78e53SAndroid Build Coastguard WorkerTODO
2124