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