netfilter
firewalling, NAT, and packet mangling for linux
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
Links (Interfaces)
Collaboration diagram for Links (Interfaces):

Modules

 

Allocation/Freeing

struct rtnl_linkrtnl_link_alloc (void)
 
void rtnl_link_put (struct rtnl_link *link)
 

Cache Management

int rtnl_link_alloc_cache (struct nl_sock *sk, struct nl_cache **result)
 Allocate link cache and fill in all configured links. More...
 
struct rtnl_linkrtnl_link_get (struct nl_cache *cache, int ifindex)
 Look up link by interface index in the provided cache. More...
 
struct rtnl_linkrtnl_link_get_by_name (struct nl_cache *cache, const char *name)
 Look up link by link name in the provided cache. More...
 

Link Modifications

int rtnl_link_build_change_request (struct rtnl_link *old, struct rtnl_link *tmpl, int flags, struct nl_msg **result)
 Builds a netlink change request message to change link attributes. More...
 
int rtnl_link_change (struct nl_sock *sk, struct rtnl_link *old, struct rtnl_link *tmpl, int flags)
 Change link attributes. More...
 

Name <-> Index Translations

char * rtnl_link_i2name (struct nl_cache *cache, int ifindex, char *dst, size_t len)
 Translate an interface index to the corresponding link name. More...
 
int rtnl_link_name2i (struct nl_cache *cache, const char *name)
 Translate a link name to the corresponding interface index. More...
 

Link Flags Translations

char * rtnl_link_flags2str (int flags, char *buf, size_t len)
 
int rtnl_link_str2flags (const char *name)
 

Link Statistics Translations

char * rtnl_link_stat2str (int st, char *buf, size_t len)
 
int rtnl_link_str2stat (const char *name)
 

Link Operstate Translations

char * rtnl_link_operstate2str (int st, char *buf, size_t len)
 
int rtnl_link_str2operstate (const char *name)
 

Link Mode Translations

char * rtnl_link_mode2str (int st, char *buf, size_t len)
 
int rtnl_link_str2mode (const char *name)
 

Attributes

void rtnl_link_set_qdisc (struct rtnl_link *link, const char *qdisc)
 
char * rtnl_link_get_qdisc (struct rtnl_link *link)
 
void rtnl_link_set_name (struct rtnl_link *link, const char *name)
 
char * rtnl_link_get_name (struct rtnl_link *link)
 
void rtnl_link_set_addr (struct rtnl_link *link, struct nl_addr *addr)
 
struct nl_addrrtnl_link_get_addr (struct rtnl_link *link)
 
void rtnl_link_set_broadcast (struct rtnl_link *link, struct nl_addr *brd)
 
struct nl_addrrtnl_link_get_broadcast (struct rtnl_link *link)
 
void rtnl_link_set_flags (struct rtnl_link *link, unsigned int flags)
 
void rtnl_link_unset_flags (struct rtnl_link *link, unsigned int flags)
 
unsigned int rtnl_link_get_flags (struct rtnl_link *link)
 
void rtnl_link_set_family (struct rtnl_link *link, int family)
 
int rtnl_link_get_family (struct rtnl_link *link)
 
void rtnl_link_set_arptype (struct rtnl_link *link, unsigned int arptype)
 
unsigned int rtnl_link_get_arptype (struct rtnl_link *link)
 
void rtnl_link_set_ifindex (struct rtnl_link *link, int ifindex)
 
int rtnl_link_get_ifindex (struct rtnl_link *link)
 
void rtnl_link_set_mtu (struct rtnl_link *link, unsigned int mtu)
 
unsigned int rtnl_link_get_mtu (struct rtnl_link *link)
 
void rtnl_link_set_txqlen (struct rtnl_link *link, unsigned int txqlen)
 
unsigned int rtnl_link_get_txqlen (struct rtnl_link *link)
 
void rtnl_link_set_weight (struct rtnl_link *link, unsigned int weight)
 
unsigned int rtnl_link_get_weight (struct rtnl_link *link)
 
void rtnl_link_set_link (struct rtnl_link *link, int ifindex)
 
int rtnl_link_get_link (struct rtnl_link *link)
 
void rtnl_link_set_master (struct rtnl_link *link, int ifindex)
 
int rtnl_link_get_master (struct rtnl_link *link)
 
void rtnl_link_set_operstate (struct rtnl_link *link, uint8_t operstate)
 
uint8_t rtnl_link_get_operstate (struct rtnl_link *link)
 
void rtnl_link_set_linkmode (struct rtnl_link *link, uint8_t linkmode)
 
uint8_t rtnl_link_get_linkmode (struct rtnl_link *link)
 
uint64_t rtnl_link_get_stat (struct rtnl_link *link, int id)
 
int rtnl_link_set_info_type (struct rtnl_link *link, const char *type)
 Specify the info type of a link. More...
 
char * rtnl_link_get_info_type (struct rtnl_link *link)
 Return info type of a link. More...
 

Detailed Description

Link Identification
A link can be identified by either its interface index or by its name. The kernel favours the interface index but falls back to the interface name if the interface index is lesser-than 0 for kernels >= 2.6.11. Therefore you can request changes without mapping a interface name to the corresponding index first.
Changeable Attributes
  • Link layer address
  • Link layer broadcast address
  • device mapping (ifmap) (>= 2.6.9)
  • MTU (>= 2.6.9)
  • Transmission queue length (>= 2.6.9)
  • Weight (>= 2.6.9)
  • Link name (only via access through interface index) (>= 2.6.9)
  • Flags (>= 2.6.9)
    • IFF_DEBUG
    • IFF_NOTRAILERS
    • IFF_NOARP
    • IFF_DYNAMIC
    • IFF_MULTICAST
    • IFF_PORTSEL
    • IFF_AUTOMEDIA
    • IFF_UP
    • IFF_PROMISC
    • IFF_ALLMULTI
Link Flags (linux/if.h)
IFF_UP Status of link (up|down)
IFF_BROADCAST Indicates this link allows broadcasting
IFF_MULTICAST Indicates this link allows multicasting
IFF_ALLMULTI Indicates this link is doing multicast routing
IFF_DEBUG Tell the driver to do debugging (currently unused)
IFF_LOOPBACK This is the loopback link
IFF_POINTOPOINT Point-to-point link
IFF_NOARP Link is unable to perform ARP
IFF_PROMISC Status of promiscious mode flag
IFF_MASTER Used by teql
IFF_SLAVE Used by teql
IFF_PORTSEL Indicates this link allows port selection
IFF_AUTOMEDIA Indicates this link selects port automatically
IFF_DYNAMIC Indicates the address of this link is dynamic
IFF_RUNNING Link is running and carrier is ok.
IFF_NOTRAILERS Unused, BSD compat.
Notes on IFF_PROMISC and IFF_ALLMULTI flags
Although you can query the status of IFF_PROMISC and IFF_ALLMULTI they do not represent the actual state in the kernel but rather whether the flag has been enabled/disabled by userspace. The link may be in promiscious mode even if IFF_PROMISC is not set in a link dump request response because promiscity might be needed by the driver for a period of time.
Note
The unit of the transmission queue length depends on the link type, a common unit is packets.
1) Retrieving information about available links
// The first step is to retrieve a list of all available interfaces within
// the kernel and put them into a cache.
// In a second step, a specific link may be looked up by either interface
// index or interface name.
struct rtnl_link *link = rtnl_link_get_by_name(cache, "lo");
// rtnl_link_get_by_name() is the short version for translating the
// interface name to an interface index first like this:
int ifindex = rtnl_link_name2i(cache, "lo");
struct rtnl_link *link = rtnl_link_get(cache, ifindex);
// After successful usage, the object must be given back to the cache
2) Changing link attributes
// In order to change any attributes of an existing link, we must allocate
// a new link to hold the change requests:
struct rtnl_link *request = rtnl_link_alloc();
// Now we can go on and specify the attributes we want to change:
rtnl_link_set_weight(request, 300);
rtnl_link_set_mtu(request, 1360);
// We can also shut an interface down administratively
// Actually, we should know which link to change, so let's look it up
struct rtnl_link *old = rtnl_link_get(cache, "eth0");
// Two ways exist to commit this change request, the first one is to
// build the required netlink message and send it out in one single
// step:
rtnl_link_change(sk, old, request);
// An alternative way is to build the netlink message and send it
// out yourself using nl_send_auto_complete()
struct nl_msg *msg = rtnl_link_build_change_request(old, request);
// Don't forget to give back the link object ;->
3) Link Type Specific Attributes
// Some link types offer additional parameters and statistics specific
// to their type. F.e. a VLAN link can be configured like this:
//
// Allocate a new link and set the info type to "vlan". This is required
// to prepare the link to hold vlan specific attributes.
struct rtnl_link *request = rtnl_link_alloc();
rtnl_link_set_info_type(request, "vlan");
// Now vlan specific attributes can be set:
rtnl_link_vlan_set_id(request, 10);
// Of course the attributes can also be read, check the info type
// to make sure you are using the right access functions:
if (!strcmp(type, "vlan"))
int id = rtnl_link_vlan_get_id(link);

Function Documentation

struct rtnl_link* rtnl_link_alloc ( void  )

References nl_object_alloc().

Referenced by nl_cli_link_alloc().

Here is the call graph for this function:

Here is the caller graph for this function:

int rtnl_link_alloc_cache ( struct nl_sock sk,
struct nl_cache **  result 
)

Allocate link cache and fill in all configured links.

  • sk Netlink socket.
  • result Pointer to store resulting cache.

Allocates a new link cache, initializes it properly and updates it to include all links currently configured in the kernel.

Returns
0 on success or a negative error code.

References nl_cache_alloc_and_fill().

Here is the call graph for this function:

int rtnl_link_build_change_request ( struct rtnl_link old,
struct rtnl_link tmpl,
int  flags,
struct nl_msg **  result 
)

Builds a netlink change request message to change link attributes.

  • old link to be changed
  • tmpl template with requested changes
  • flags additional netlink message flags

Builds a new netlink message requesting a change of link attributes. The netlink message header isn't fully equipped with all relevant fields and must be sent out via nl_send_auto_complete() or supplemented as needed. old must point to a link currently configured in the kernel and tmpl must contain the attributes to be changed set via rtnl_link_set_* functions.

Returns
New netlink message
Note
Not all attributes can be changed, see Changeable Attributes for more details.

References ifinfomsg::ifi_family, ifinfomsg::ifi_flags, IFLA_IFNAME, IFLA_INFO_KIND, info, rtnl_link_info_ops::io_name, rtnl_link_info_ops::io_put_attrs, rtnl_link::l_addr, rtnl_link::l_bcast, rtnl_link::l_family, rtnl_link::l_flag_mask, rtnl_link::l_flags, rtnl_link::l_index, rtnl_link::l_info_ops, rtnl_link::l_linkmode, rtnl_link::l_mtu, rtnl_link::l_name, rtnl_link::l_operstate, rtnl_link::l_txqlen, rtnl_link::l_weight, nla_nest_end(), nla_nest_start(), NLA_PUT_ADDR, NLA_PUT_STRING, NLA_PUT_U32, NLA_PUT_U8, NLE_MSGSIZE, NLE_NOMEM, NLMSG_ALIGNTO, nlmsg_alloc_simple(), nlmsg_append(), nlmsg_free(), and RTM_SETLINK.

Referenced by rtnl_link_change().

Here is the call graph for this function:

Here is the caller graph for this function:

int rtnl_link_change ( struct nl_sock sk,
struct rtnl_link old,
struct rtnl_link tmpl,
int  flags 
)

Change link attributes.

  • sk Netlink socket.
  • old link to be changed
  • tmpl template with requested changes
  • flags additional netlink message flags

Builds a new netlink message by calling rtnl_link_build_change_request(), sends the request to the kernel and waits for the next ACK to be received, i.e. blocks until the request has been processed.

Returns
0 on success or a negative error code
Note
Not all attributes can be changed, see Changeable Attributes for more details.

References nl_send_auto_complete(), nlmsg_free(), and rtnl_link_build_change_request().

Here is the call graph for this function:

char* rtnl_link_flags2str ( int  flags,
char *  buf,
size_t  len 
)

References __flags2str(), and ARRAY_SIZE.

Here is the call graph for this function:

struct rtnl_link* rtnl_link_get ( struct nl_cache cache,
int  ifindex 
)

Look up link by interface index in the provided cache.

  • cache link cache
  • ifindex link interface index

The caller owns a reference on the returned object and must give the object back via rtnl_link_put().

Returns
pointer to link inside the cache or NULL if no match was found.

References nl_cache::c_items, nl_cache::c_ops, rtnl_link::l_index, nl_list_for_each_entry, nl_object_get(), and NULL.

Referenced by rtnl_link_i2name().

Here is the call graph for this function:

Here is the caller graph for this function:

struct nl_addr* rtnl_link_get_addr ( struct rtnl_link link)

References rtnl_link::l_addr, and NULL.

unsigned int rtnl_link_get_arptype ( struct rtnl_link link)

References rtnl_link::l_arptype.

struct nl_addr* rtnl_link_get_broadcast ( struct rtnl_link link)

References rtnl_link::l_bcast, and NULL.

struct rtnl_link* rtnl_link_get_by_name ( struct nl_cache cache,
const char *  name 
)

Look up link by link name in the provided cache.

  • cache link cache
  • name link name

The caller owns a reference on the returned object and must give the object back via rtnl_link_put().

Returns
pointer to link inside the cache or NULL if no match was found.

References nl_cache::c_items, nl_cache::c_ops, rtnl_link::l_name, nl_list_for_each_entry, nl_object_get(), and NULL.

Referenced by rtnl_link_name2i().

Here is the call graph for this function:

Here is the caller graph for this function:

int rtnl_link_get_family ( struct rtnl_link link)

References rtnl_link::l_family.

unsigned int rtnl_link_get_flags ( struct rtnl_link link)

References rtnl_link::l_flags.

int rtnl_link_get_ifindex ( struct rtnl_link link)

References rtnl_link::l_index.

char* rtnl_link_get_info_type ( struct rtnl_link link)

Return info type of a link.

  • link link object
Note
The returned pointer is only valid as long as the link exists
Returns
Info type name or NULL if unknown.

References rtnl_link_info_ops::io_name, rtnl_link::l_info_ops, and NULL.

int rtnl_link_get_link ( struct rtnl_link link)

References rtnl_link::l_link.

uint8_t rtnl_link_get_linkmode ( struct rtnl_link link)
int rtnl_link_get_master ( struct rtnl_link link)

References rtnl_link::l_master.

unsigned int rtnl_link_get_mtu ( struct rtnl_link link)

References rtnl_link::l_mtu.

char* rtnl_link_get_name ( struct rtnl_link link)

References rtnl_link::l_name, and NULL.

uint8_t rtnl_link_get_operstate ( struct rtnl_link link)
char* rtnl_link_get_qdisc ( struct rtnl_link link)

References rtnl_link::l_qdisc, and NULL.

uint64_t rtnl_link_get_stat ( struct rtnl_link link,
int  id 
)
unsigned int rtnl_link_get_txqlen ( struct rtnl_link link)

References rtnl_link::l_txqlen.

unsigned int rtnl_link_get_weight ( struct rtnl_link link)

References rtnl_link::l_weight.

char* rtnl_link_i2name ( struct nl_cache cache,
int  ifindex,
char *  dst,
size_t  len 
)

Translate an interface index to the corresponding link name.

  • cache link cache
  • ifindex link interface index
  • dst destination buffer
  • len length of destination buffer

Translates the specified interface index to the corresponding link name and stores the name in the destination buffer.

Returns
link name or NULL if no match was found.

References rtnl_link::l_name, NULL, rtnl_link_get(), and rtnl_link_put().

Referenced by main().

Here is the call graph for this function:

Here is the caller graph for this function:

char* rtnl_link_mode2str ( int  st,
char *  buf,
size_t  len 
)

References __type2str(), and ARRAY_SIZE.

Here is the call graph for this function:

int rtnl_link_name2i ( struct nl_cache cache,
const char *  name 
)

Translate a link name to the corresponding interface index.

  • cache link cache
  • name link name
Returns
interface index or 0 if no match was found.

References rtnl_link::l_index, rtnl_link_get_by_name(), and rtnl_link_put().

Referenced by main(), nl_cli_addr_parse_dev(), nl_cli_neigh_parse_dev(), nl_cli_qdisc_parse_dev(), nl_cli_route_parse_iif(), nl_cli_route_parse_nexthop(), and parse_dev().

Here is the call graph for this function:

Here is the caller graph for this function:

char* rtnl_link_operstate2str ( int  st,
char *  buf,
size_t  len 
)

References __type2str(), and ARRAY_SIZE.

Here is the call graph for this function:

void rtnl_link_put ( struct rtnl_link link)

References nl_object_put().

Referenced by rtnl_link_i2name(), and rtnl_link_name2i().

Here is the call graph for this function:

Here is the caller graph for this function:

void rtnl_link_set_addr ( struct rtnl_link link,
struct nl_addr addr 
)

References rtnl_link::l_addr.

void rtnl_link_set_arptype ( struct rtnl_link link,
unsigned int  arptype 
)

References rtnl_link::l_arptype.

void rtnl_link_set_broadcast ( struct rtnl_link link,
struct nl_addr brd 
)

References rtnl_link::l_bcast.

void rtnl_link_set_family ( struct rtnl_link link,
int  family 
)

References rtnl_link::l_family.

Referenced by nl_cli_link_parse_family().

Here is the caller graph for this function:

void rtnl_link_set_flags ( struct rtnl_link link,
unsigned int  flags 
)
void rtnl_link_set_ifindex ( struct rtnl_link link,
int  ifindex 
)

References rtnl_link::l_index.

Referenced by nl_cli_link_parse_ifindex().

Here is the caller graph for this function:

int rtnl_link_set_info_type ( struct rtnl_link link,
const char *  type 
)

Specify the info type of a link.

  • link link object
  • type info type

Looks up the info type and prepares the link to store info type specific attributes. If an info type has been assigned already it will be released with all changes lost.

Returns
0 on success or a negative errror code.

References rtnl_link_info_ops::io_alloc, rtnl_link::l_info_ops, NLE_OPNOTSUPP, NULL, and rtnl_link_info_ops_lookup().

Here is the call graph for this function:

void rtnl_link_set_link ( struct rtnl_link link,
int  ifindex 
)

References rtnl_link::l_link.

void rtnl_link_set_linkmode ( struct rtnl_link link,
uint8_t  linkmode 
)

References rtnl_link::l_linkmode.

void rtnl_link_set_master ( struct rtnl_link link,
int  ifindex 
)

References rtnl_link::l_master.

void rtnl_link_set_mtu ( struct rtnl_link link,
unsigned int  mtu 
)

References rtnl_link::l_mtu.

Referenced by nl_cli_link_parse_mtu().

Here is the caller graph for this function:

void rtnl_link_set_name ( struct rtnl_link link,
const char *  name 
)

References rtnl_link::l_name.

Referenced by nl_cli_link_parse_name().

Here is the caller graph for this function:

void rtnl_link_set_operstate ( struct rtnl_link link,
uint8_t  operstate 
)
void rtnl_link_set_qdisc ( struct rtnl_link link,
const char *  qdisc 
)

References rtnl_link::l_qdisc.

void rtnl_link_set_txqlen ( struct rtnl_link link,
unsigned int  txqlen 
)

References rtnl_link::l_txqlen.

Referenced by nl_cli_link_parse_txqlen().

Here is the caller graph for this function:

void rtnl_link_set_weight ( struct rtnl_link link,
unsigned int  weight 
)

References rtnl_link::l_weight.

Referenced by nl_cli_link_parse_weight().

Here is the caller graph for this function:

char* rtnl_link_stat2str ( int  st,
char *  buf,
size_t  len 
)

References __type2str(), and ARRAY_SIZE.

Here is the call graph for this function:

int rtnl_link_str2flags ( const char *  name)

References __str2flags(), and ARRAY_SIZE.

Here is the call graph for this function:

int rtnl_link_str2mode ( const char *  name)

References __str2type(), and ARRAY_SIZE.

Here is the call graph for this function:

int rtnl_link_str2operstate ( const char *  name)

References __str2type(), and ARRAY_SIZE.

Here is the call graph for this function:

int rtnl_link_str2stat ( const char *  name)

References __str2type(), and ARRAY_SIZE.

Here is the call graph for this function:

void rtnl_link_unset_flags ( struct rtnl_link link,
unsigned int  flags 
)