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

Modules

 Queueing Discipline Modules
 
 Queueing Discipline Object
 

Data Structures

struct  rtnl_qdisc_ops
 Qdisc Operations. More...
 

QDisc Addition

int rtnl_qdisc_build_add_request (struct rtnl_qdisc *qdisc, int flags, struct nl_msg **result)
 Build a netlink message to add a new qdisc. More...
 
int rtnl_qdisc_add (struct nl_sock *sk, struct rtnl_qdisc *qdisc, int flags)
 Add a new qdisc. More...
 

QDisc Modification

int rtnl_qdisc_build_change_request (struct rtnl_qdisc *qdisc, struct rtnl_qdisc *new, struct nl_msg **result)
 Build a netlink message to change attributes of a existing qdisc. More...
 
int rtnl_qdisc_change (struct nl_sock *sk, struct rtnl_qdisc *qdisc, struct rtnl_qdisc *new)
 Change attributes of a qdisc. More...
 

QDisc Deletion

int rtnl_qdisc_build_delete_request (struct rtnl_qdisc *qdisc, struct nl_msg **result)
 Build a netlink request message to delete a qdisc. More...
 
int rtnl_qdisc_delete (struct nl_sock *sk, struct rtnl_qdisc *qdisc)
 Delete a qdisc. More...
 

Qdisc Cache Management

int rtnl_qdisc_alloc_cache (struct nl_sock *sk, struct nl_cache **result)
 Build a qdisc cache including all qdiscs currently configured in the kernel. More...
 
struct rtnl_qdiscrtnl_qdisc_get_by_parent (struct nl_cache *cache, int ifindex, uint32_t parent)
 Look up qdisc by its parent in the provided cache. More...
 
struct rtnl_qdiscrtnl_qdisc_get (struct nl_cache *cache, int ifindex, uint32_t handle)
 Look up qdisc by its handle in the provided cache. More...
 

Detailed Description

Qdisc Handles
In general, qdiscs are identified by the major part of a traffic control handle (the upper 16 bits). A few special values exist though:
  • TC_H_ROOT: root qdisc (directly attached to the device)
  • TC_H_INGRESS: ingress qdisc (directly attached to the device)
  • TC_H_UNSPEC: unspecified qdisc (no reference)
1) Adding a Qdisc
// Allocate a new empty qdisc to be filled out
struct rtnl_qdisc *qdisc = rtnl_qdisc_alloc();
// ... specify the kind of the Qdisc
rtnl_qdisc_set_kind(qdisc, "pfifo");
// Specify the device the qdisc should be attached to
rtnl_qdisc_set_ifindex(qdisc, ifindex);
// ... specify the parent qdisc
// Specifying the handle is not required but makes reidentifying easier
// and may help to avoid adding a qdisc twice.
rtnl_qdisc_set_handle(qdisc, 0x000A0000);
// Now on to specify the qdisc specific options, see the relevant qdisc
// modules for documentation, in this example we set the upper limit of
// the packet fifo qdisc to 64
rtnl_qdisc_add(handle, qdisc, NLM_R_REPLACE);
// Free up the memory
2) Deleting a Qdisc
// Allocate a new empty qdisc to be filled out with the parameters
// specifying the qdisc to be deleted. Alternatively a fully equiped
// Qdisc object from a cache can be used.
struct rtnl_qdisc *qdisc = rtnl_qdisc_alloc();
// The interface index of the device the qdisc is on and the parent handle
// are the least required fields to be filled out.
// Note: Specify TC_H_ROOT or TC_H_INGRESS as parent handle to delete the
// root respectively root ingress qdisc.
rtnl_qdisc_set_ifindex(qdisc, ifindex);
rtnl_qdisc_set_parent(qdisc, parent_handle);
// If required for identification, the handle can be specified as well.
rtnl_qdisc_set_handle(qdisc, qdisc_handle);
// Not required but maybe helpful as sanity check, the kind of the qdisc
// can be specified to avoid mistakes.
rtnl_qdisc_set_kind(qdisc, "pfifo");
// Finally delete the qdisc with rtnl_qdisc_delete(), alternatively
// rtnl_qdisc_build_delete_request() can be invoked to generate an
// appropritate netlink message to send out.
// Free up the memory

Function Documentation

int rtnl_qdisc_add ( struct nl_sock sk,
struct rtnl_qdisc qdisc,
int  flags 
)

Add a new qdisc.

  • sk Netlink socket.
  • qdisc qdisc to delete
  • flags additional netlink message flags

Builds a netlink message by calling rtnl_qdisc_build_add_request(), sends the request to the kernel and waits for the ACK to be received and thus blocks until the request has been processed.

Common message flags used:

  • NLM_F_REPLACE - replace a potential existing qdisc
Returns
0 on success or a negative error code

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

Referenced by main().

Here is the call graph for this function:

Here is the caller graph for this function:

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

Build a qdisc cache including all qdiscs currently configured in the kernel.

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

Allocates a new cache, initializes it properly and updates it to include all qdiscs 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_qdisc_build_add_request ( struct rtnl_qdisc qdisc,
int  flags,
struct nl_msg **  result 
)

Build a netlink message to add a new qdisc.

  • qdisc qdisc to add
  • flags additional netlink message flags
  • result Pointer to store resulting message.

Builds a new netlink message requesting an addition of a qdisc. 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.

Common message flags used:

  • NLM_F_REPLACE - replace a potential existing qdisc
Returns
0 on success or a negative error code.

References NLM_F_CREATE, and RTM_NEWQDISC.

Referenced by rtnl_qdisc_add().

Here is the caller graph for this function:

int rtnl_qdisc_build_change_request ( struct rtnl_qdisc qdisc,
struct rtnl_qdisc new,
struct nl_msg **  result 
)

Build a netlink message to change attributes of a existing qdisc.

  • qdisc qdisc to change
  • new new qdisc attributes
  • result Pointer to store resulting message.

Builds a new netlink message requesting an change of qdisc 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.

Returns
0 on success or a negative error code.

References NLM_F_REPLACE, and RTM_NEWQDISC.

Referenced by rtnl_qdisc_change().

Here is the caller graph for this function:

int rtnl_qdisc_build_delete_request ( struct rtnl_qdisc qdisc,
struct nl_msg **  result 
)

Build a netlink request message to delete a qdisc.

  • qdisc qdisc to delete
  • result Pointer to store resulting message.

Builds a new netlink message requesting a deletion of a qdisc. The netlink message header isn't fully equipped with all relevant fields and must thus be sent out via nl_send_auto_complete() or supplemented as needed.

Returns
0 on success or a negative error code.

References BUG, NLE_MSGSIZE, NLE_NOMEM, NLMSG_ALIGNTO, nlmsg_alloc_simple(), nlmsg_append(), nlmsg_free(), RTM_DELQDISC, TCA_ATTR_IFINDEX, TCA_ATTR_PARENT, tcmsg::tcm_family, tcmsg::tcm_handle, tcmsg::tcm_ifindex, and tcmsg::tcm_parent.

Referenced by rtnl_qdisc_delete().

Here is the call graph for this function:

Here is the caller graph for this function:

int rtnl_qdisc_change ( struct nl_sock sk,
struct rtnl_qdisc qdisc,
struct rtnl_qdisc new 
)

Change attributes of a qdisc.

  • sk Netlink socket.
  • qdisc qdisc to change
  • new new qdisc attributes

Builds a netlink message by calling rtnl_qdisc_build_change_request(), sends the request to the kernel and waits for the ACK to be received and thus blocks until the request has been processed.

Returns
0 on success or a negative error code

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

Here is the call graph for this function:

int rtnl_qdisc_delete ( struct nl_sock sk,
struct rtnl_qdisc qdisc 
)

Delete a qdisc.

  • sk Netlink socket.
  • qdisc qdisc to delete

Builds a netlink message by calling rtnl_qdisc_build_delete_request(), sends the request to the kernel and waits for the ACK to be received and thus blocks until the request has been processed.

Returns
0 on success or a negative error code

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

Here is the call graph for this function:

struct rtnl_qdisc* rtnl_qdisc_get ( struct nl_cache cache,
int  ifindex,
uint32_t  handle 
)

Look up qdisc by its handle in the provided cache.

  • cache qdisc cache
  • ifindex interface the qdisc is attached to
  • handle qdisc handle
    Returns
    pointer to qdisc inside the cache or NULL if no match was found.

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

Here is the call graph for this function:

struct rtnl_qdisc* rtnl_qdisc_get_by_parent ( struct nl_cache cache,
int  ifindex,
uint32_t  parent 
)

Look up qdisc by its parent in the provided cache.

  • cache qdisc cache
  • ifindex interface the qdisc is attached to
  • parent parent handle
    Returns
    pointer to qdisc inside the cache or NULL if no match was found.

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

Referenced by rtnl_class_leaf_qdisc().

Here is the call graph for this function:

Here is the caller graph for this function: