]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - include/net/pkt_sched.h
Merge tag 'xtensa-20170202' of git://github.com/jcmvbkbc/linux-xtensa
[mirror_ubuntu-zesty-kernel.git] / include / net / pkt_sched.h
CommitLineData
1da177e4
LT
1#ifndef __NET_PKT_SCHED_H
2#define __NET_PKT_SCHED_H
3
538e43a4 4#include <linux/jiffies.h>
641b9e0e 5#include <linux/ktime.h>
d8b9605d 6#include <linux/if_vlan.h>
1da177e4
LT
7#include <net/sch_generic.h>
8
d0a81f67
JDB
9#define DEFAULT_TX_QUEUE_LEN 1000
10
fd2c3ef7 11struct qdisc_walker {
1da177e4
LT
12 int stop;
13 int skip;
14 int count;
15 int (*fn)(struct Qdisc *, unsigned long cl, struct qdisc_walker *);
16};
17
5d944c64 18#define QDISC_ALIGNTO 64
3d54b82f 19#define QDISC_ALIGN(len) (((len) + QDISC_ALIGNTO-1) & ~(QDISC_ALIGNTO-1))
1da177e4
LT
20
21static inline void *qdisc_priv(struct Qdisc *q)
22{
3d54b82f 23 return (char *) q + QDISC_ALIGN(sizeof(struct Qdisc));
1da177e4
LT
24}
25
26/*
27 Timer resolution MUST BE < 10% of min_schedulable_packet_size/bandwidth
28
29 Normal IP packet size ~ 512byte, hence:
30
31 0.5Kbyte/1Mbyte/sec = 0.5msec, so that we need 50usec timer for
32 10Mbit ethernet.
33
34 10msec resolution -> <50Kbit/sec.
35
36 The result: [34]86 is not good choice for QoS router :-(
37
25985edc 38 The things are not so bad, because we may use artificial
1da177e4
LT
39 clock evaluated by integration of network data flow
40 in the most critical places.
1da177e4
LT
41 */
42
1da177e4
LT
43typedef u64 psched_time_t;
44typedef long psched_tdiff_t;
45
a4a710c4
JP
46/* Avoid doing 64 bit divide */
47#define PSCHED_SHIFT 6
ca44d6e6
JP
48#define PSCHED_TICKS2NS(x) ((s64)(x) << PSCHED_SHIFT)
49#define PSCHED_NS2TICKS(x) ((x) >> PSCHED_SHIFT)
1da177e4 50
ca44d6e6 51#define PSCHED_TICKS_PER_SEC PSCHED_NS2TICKS(NSEC_PER_SEC)
a084980d 52#define PSCHED_PASTPERFECT 0
1da177e4 53
3bebcda2
PM
54static inline psched_time_t psched_get_time(void)
55{
d2de875c 56 return PSCHED_NS2TICKS(ktime_get_ns());
3bebcda2
PM
57}
58
03cc45c0
PM
59static inline psched_tdiff_t
60psched_tdiff_bounded(psched_time_t tv1, psched_time_t tv2, psched_time_t bound)
61{
62 return min(tv1 - tv2, bound);
63}
64
4179477f 65struct qdisc_watchdog {
a9efad8b 66 u64 last_expires;
4179477f
PM
67 struct hrtimer timer;
68 struct Qdisc *qdisc;
69};
70
5c15257f 71void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc);
45f50bed 72void qdisc_watchdog_schedule_ns(struct qdisc_watchdog *wd, u64 expires);
34c5d292
JP
73
74static inline void qdisc_watchdog_schedule(struct qdisc_watchdog *wd,
75 psched_time_t expires)
76{
45f50bed 77 qdisc_watchdog_schedule_ns(wd, PSCHED_TICKS2NS(expires));
34c5d292
JP
78}
79
5c15257f 80void qdisc_watchdog_cancel(struct qdisc_watchdog *wd);
4179477f 81
1da177e4
LT
82extern struct Qdisc_ops pfifo_qdisc_ops;
83extern struct Qdisc_ops bfifo_qdisc_ops;
57dbb2d8 84extern struct Qdisc_ops pfifo_head_drop_qdisc_ops;
1da177e4 85
5c15257f
JP
86int fifo_set_limit(struct Qdisc *q, unsigned int limit);
87struct Qdisc *fifo_create_dflt(struct Qdisc *sch, struct Qdisc_ops *ops,
88 unsigned int limit);
89
90int register_qdisc(struct Qdisc_ops *qops);
91int unregister_qdisc(struct Qdisc_ops *qops);
6da7c8fc 92void qdisc_get_default(char *id, size_t len);
93int qdisc_set_default(const char *id);
94
59cc1f61
JK
95void qdisc_hash_add(struct Qdisc *q);
96void qdisc_hash_del(struct Qdisc *q);
5c15257f
JP
97struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle);
98struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle);
99struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
100 struct nlattr *tab);
101void qdisc_put_rtab(struct qdisc_rate_table *tab);
102void qdisc_put_stab(struct qdisc_size_table *tab);
6e765a00 103void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc);
5c15257f
JP
104int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
105 struct net_device *dev, struct netdev_queue *txq,
55a93b3e 106 spinlock_t *root_lock, bool validate);
5c15257f
JP
107
108void __qdisc_run(struct Qdisc *q);
1da177e4 109
37437bb2 110static inline void qdisc_run(struct Qdisc *q)
1da177e4 111{
bc135b23 112 if (qdisc_run_begin(q))
37437bb2 113 __qdisc_run(q);
1da177e4
LT
114}
115
5c15257f 116int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp,
3b3ae880 117 struct tcf_result *res, bool compat_mode);
1da177e4 118
d8b9605d
JP
119static inline __be16 tc_skb_protocol(const struct sk_buff *skb)
120{
121 /* We need to take extra care in case the skb came via
122 * vlan accelerated path. In that case, use skb->vlan_proto
123 * as the original vlan header was already stripped.
124 */
df8a39de 125 if (skb_vlan_tag_present(skb))
d8b9605d
JP
126 return skb->vlan_proto;
127 return skb->protocol;
128}
129
1da177e4
LT
130/* Calculate maximal size of packet seen by hard_start_xmit
131 routine of this device.
132 */
95c96174 133static inline unsigned int psched_mtu(const struct net_device *dev)
1da177e4 134{
3b04ddde 135 return dev->mtu + dev->hard_header_len;
1da177e4
LT
136}
137
138#endif