| .TH TC 8 "16 December 2001" "iproute2" "Linux" |
| .SH NAME |
| tc \- show / manipulate traffic control settings |
| .SH SYNOPSIS |
| .B tc qdisc [ add | change | replace | link ] dev |
| DEV |
| .B |
| [ parent |
| qdisc-id |
| .B | root ] |
| .B [ handle |
| qdisc-id ] qdisc |
| [ qdisc specific parameters ] |
| .P |
| |
| .B tc class [ add | change | replace ] dev |
| DEV |
| .B parent |
| qdisc-id |
| .B [ classid |
| class-id ] qdisc |
| [ qdisc specific parameters ] |
| .P |
| |
| .B tc filter [ add | change | replace ] dev |
| DEV |
| .B [ parent |
| qdisc-id |
| .B | root ] protocol |
| protocol |
| .B prio |
| priority filtertype |
| [ filtertype specific parameters ] |
| .B flowid |
| flow-id |
| |
| .B tc |
| .RI "[ " FORMAT " ]" |
| .B qdisc show [ dev |
| DEV |
| .B ] |
| .P |
| .B tc |
| .RI "[ " FORMAT " ]" |
| .B class show dev |
| DEV |
| .P |
| .B tc filter show dev |
| DEV |
| |
| .ti -8 |
| .IR FORMAT " := {" |
| \fB\-s\fR[\fItatistics\fR] | |
| \fB\-d\fR[\fIetails\fR] | |
| \fB\-r\fR[\fIaw\fR] | |
| \fB\-p\fR[\fIretty\fR] | |
| \fB\i\fR[\fIec\fR] } |
| |
| .SH DESCRIPTION |
| .B Tc |
| is used to configure Traffic Control in the Linux kernel. Traffic Control consists |
| of the following: |
| |
| .TP |
| SHAPING |
| When traffic is shaped, its rate of transmission is under control. Shaping may |
| be more than lowering the available bandwidth - it is also used to smooth out |
| bursts in traffic for better network behaviour. Shaping occurs on egress. |
| |
| .TP |
| SCHEDULING |
| By scheduling the transmission of packets it is possible to improve interactivity |
| for traffic that needs it while still guaranteeing bandwidth to bulk transfers. Reordering |
| is also called prioritizing, and happens only on egress. |
| |
| .TP |
| POLICING |
| Where shaping deals with transmission of traffic, policing pertains to traffic |
| arriving. Policing thus occurs on ingress. |
| |
| .TP |
| DROPPING |
| Traffic exceeding a set bandwidth may also be dropped forthwith, both on |
| ingress and on egress. |
| |
| .P |
| Processing of traffic is controlled by three kinds of objects: qdiscs, |
| classes and filters. |
| |
| .SH QDISCS |
| .B qdisc |
| is short for 'queueing discipline' and it is elementary to |
| understanding traffic control. Whenever the kernel needs to send a |
| packet to an interface, it is |
| .B enqueued |
| to the qdisc configured for that interface. Immediately afterwards, the kernel |
| tries to get as many packets as possible from the qdisc, for giving them |
| to the network adaptor driver. |
| |
| A simple QDISC is the 'pfifo' one, which does no processing at all and is a pure |
| First In, First Out queue. It does however store traffic when the network interface |
| can't handle it momentarily. |
| |
| .SH CLASSES |
| Some qdiscs can contain classes, which contain further qdiscs - traffic may |
| then be enqueued in any of the inner qdiscs, which are within the |
| .B classes. |
| When the kernel tries to dequeue a packet from such a |
| .B classful qdisc |
| it can come from any of the classes. A qdisc may for example prioritize |
| certain kinds of traffic by trying to dequeue from certain classes |
| before others. |
| |
| .SH FILTERS |
| A |
| .B filter |
| is used by a classful qdisc to determine in which class a packet will |
| be enqueued. Whenever traffic arrives at a class with subclasses, it needs |
| to be classified. Various methods may be employed to do so, one of these |
| are the filters. All filters attached to the class are called, until one of |
| them returns with a verdict. If no verdict was made, other criteria may be |
| available. This differs per qdisc. |
| |
| It is important to notice that filters reside |
| .B within |
| qdiscs - they are not masters of what happens. |
| |
| .SH CLASSLESS QDISCS |
| The classless qdiscs are: |
| .TP |
| [p|b]fifo |
| Simplest usable qdisc, pure First In, First Out behaviour. Limited in |
| packets or in bytes. |
| .TP |
| pfifo_fast |
| Standard qdisc for 'Advanced Router' enabled kernels. Consists of a three-band |
| queue which honors Type of Service flags, as well as the priority that may be |
| assigned to a packet. |
| .TP |
| red |
| Random Early Detection simulates physical congestion by randomly dropping |
| packets when nearing configured bandwidth allocation. Well suited to very |
| large bandwidth applications. |
| .TP |
| sfq |
| Stochastic Fairness Queueing reorders queued traffic so each 'session' |
| gets to send a packet in turn. |
| .TP |
| tbf |
| The Token Bucket Filter is suited for slowing traffic down to a precisely |
| configured rate. Scales well to large bandwidths. |
| .SH CONFIGURING CLASSLESS QDISCS |
| In the absence of classful qdiscs, classless qdiscs can only be attached at |
| the root of a device. Full syntax: |
| .P |
| .B tc qdisc add dev |
| DEV |
| .B root |
| QDISC QDISC-PARAMETERS |
| |
| To remove, issue |
| .P |
| .B tc qdisc del dev |
| DEV |
| .B root |
| |
| The |
| .B pfifo_fast |
| qdisc is the automatic default in the absence of a configured qdisc. |
| |
| .SH CLASSFUL QDISCS |
| The classful qdiscs are: |
| .TP |
| CBQ |
| Class Based Queueing implements a rich linksharing hierarchy of classes. |
| It contains shaping elements as well as prioritizing capabilities. Shaping is |
| performed using link idle time calculations based on average packet size and |
| underlying link bandwidth. The latter may be ill-defined for some interfaces. |
| .TP |
| HTB |
| The Hierarchy Token Bucket implements a rich linksharing hierarchy of |
| classes with an emphasis on conforming to existing practices. HTB facilitates |
| guaranteeing bandwidth to classes, while also allowing specification of upper |
| limits to inter-class sharing. It contains shaping elements, based on TBF and |
| can prioritize classes. |
| .TP |
| PRIO |
| The PRIO qdisc is a non-shaping container for a configurable number of |
| classes which are dequeued in order. This allows for easy prioritization |
| of traffic, where lower classes are only able to send if higher ones have |
| no packets available. To facilitate configuration, Type Of Service bits are |
| honored by default. |
| .SH THEORY OF OPERATION |
| Classes form a tree, where each class has a single parent. |
| A class may have multiple children. Some qdiscs allow for runtime addition |
| of classes (CBQ, HTB) while others (PRIO) are created with a static number of |
| children. |
| |
| Qdiscs which allow dynamic addition of classes can have zero or more |
| subclasses to which traffic may be enqueued. |
| |
| Furthermore, each class contains a |
| .B leaf qdisc |
| which by default has |
| .B pfifo |
| behaviour though another qdisc can be attached in place. This qdisc may again |
| contain classes, but each class can have only one leaf qdisc. |
| |
| When a packet enters a classful qdisc it can be |
| .B classified |
| to one of the classes within. Three criteria are available, although not all |
| qdiscs will use all three: |
| .TP |
| tc filters |
| If tc filters are attached to a class, they are consulted first |
| for relevant instructions. Filters can match on all fields of a packet header, |
| as well as on the firewall mark applied by ipchains or iptables. |
| .TP |
| Type of Service |
| Some qdiscs have built in rules for classifying packets based on the TOS field. |
| .TP |
| skb->priority |
| Userspace programs can encode a class-id in the 'skb->priority' field using |
| the SO_PRIORITY option. |
| .P |
| Each node within the tree can have its own filters but higher level filters |
| may also point directly to lower classes. |
| |
| If classification did not succeed, packets are enqueued to the leaf qdisc |
| attached to that class. Check qdisc specific manpages for details, however. |
| |
| .SH NAMING |
| All qdiscs, classes and filters have IDs, which can either be specified |
| or be automatically assigned. |
| |
| IDs consist of a major number and a minor number, separated by a colon. |
| |
| .TP |
| QDISCS |
| A qdisc, which potentially can have children, |
| gets assigned a major number, called a 'handle', leaving the minor |
| number namespace available for classes. The handle is expressed as '10:'. |
| It is customary to explicitly assign a handle to qdiscs expected to have |
| children. |
| |
| .TP |
| CLASSES |
| Classes residing under a qdisc share their qdisc major number, but each have |
| a separate minor number called a 'classid' that has no relation to their |
| parent classes, only to their parent qdisc. The same naming custom as for |
| qdiscs applies. |
| |
| .TP |
| FILTERS |
| Filters have a three part ID, which is only needed when using a hashed |
| filter hierarchy. |
| .SH UNITS |
| All parameters accept a floating point number, possibly followed by a unit. |
| .P |
| Bandwidths or rates can be specified in: |
| .TP |
| kbps |
| Kilobytes per second |
| .TP |
| mbps |
| Megabytes per second |
| .TP |
| kbit |
| Kilobits per second |
| .TP |
| mbit |
| Megabits per second |
| .TP |
| bps or a bare number |
| Bytes per second |
| .P |
| Amounts of data can be specified in: |
| .TP |
| kb or k |
| Kilobytes |
| .TP |
| mb or m |
| Megabytes |
| .TP |
| mbit |
| Megabits |
| .TP |
| kbit |
| Kilobits |
| .TP |
| b or a bare number |
| Bytes. |
| .P |
| Lengths of time can be specified in: |
| .TP |
| s, sec or secs |
| Whole seconds |
| .TP |
| ms, msec or msecs |
| Milliseconds |
| .TP |
| us, usec, usecs or a bare number |
| Microseconds. |
| |
| .SH TC COMMANDS |
| The following commands are available for qdiscs, classes and filter: |
| .TP |
| add |
| Add a qdisc, class or filter to a node. For all entities, a |
| .B parent |
| must be passed, either by passing its ID or by attaching directly to the root of a device. |
| When creating a qdisc or a filter, it can be named with the |
| .B handle |
| parameter. A class is named with the |
| .B classid |
| parameter. |
| |
| .TP |
| remove |
| A qdisc can be removed by specifying its handle, which may also be 'root'. All subclasses and their leaf qdiscs |
| are automatically deleted, as well as any filters attached to them. |
| |
| .TP |
| change |
| Some entities can be modified 'in place'. Shares the syntax of 'add', with the exception |
| that the handle cannot be changed and neither can the parent. In other words, |
| .B |
| change |
| cannot move a node. |
| |
| .TP |
| replace |
| Performs a nearly atomic remove/add on an existing node id. If the node does not exist yet |
| it is created. |
| |
| .TP |
| link |
| Only available for qdiscs and performs a replace where the node |
| must exist already. |
| |
| .SH FORMAT |
| The show command has additional formatting options: |
| |
| .TP |
| .BR "\-s" , " \-stats", " \-statistics" |
| output more statistics about packet usage. |
| |
| .TP |
| .BR "\-d", " \-details" |
| output more detailed information about rates and cell sizes. |
| |
| .TP |
| .BR "\-r", " \-raw" |
| output raw hex values for handles. |
| |
| .TP |
| .BR "\-p", " \-pretty" |
| decode filter offset and mask values to equivalent filter commands based on TCP/IP. |
| |
| .TP |
| .BR "\-iec" |
| print rates in IEC units (ie. 1K = 1024). |
| |
| |
| .SH HISTORY |
| .B tc |
| was written by Alexey N. Kuznetsov and added in Linux 2.2. |
| .SH SEE ALSO |
| .BR tc-cbq (8), |
| .BR tc-drr (8), |
| .BR tc-htb (8), |
| .BR tc-sfq (8), |
| .BR tc-red (8), |
| .BR tc-tbf (8), |
| .BR tc-pfifo (8), |
| .BR tc-bfifo (8), |
| .BR tc-pfifo_fast (8), |
| .br |
| .RB "User documentation at " http://lartc.org/ ", but please direct bugreports and patches to: " <netdev@vger.kernel.org> |
| |
| .SH AUTHOR |
| Manpage maintained by bert hubert (ahu@ds9a.nl) |
| |