]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blame - include/net/pkt_sched.h
powerpc32: don't adjust unmoved stack pointer in csum_partial_copy_generic() epilogue
[mirror_ubuntu-hirsute-kernel.git] / include / net / pkt_sched.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2#ifndef __NET_PKT_SCHED_H
3#define __NET_PKT_SCHED_H
4
538e43a4 5#include <linux/jiffies.h>
641b9e0e 6#include <linux/ktime.h>
d8b9605d 7#include <linux/if_vlan.h>
855319be 8#include <linux/netdevice.h>
1da177e4 9#include <net/sch_generic.h>
855319be 10#include <net/net_namespace.h>
861932ec 11#include <uapi/linux/pkt_sched.h>
1da177e4 12
d0a81f67
JDB
13#define DEFAULT_TX_QUEUE_LEN 1000
14
fd2c3ef7 15struct qdisc_walker {
1da177e4
LT
16 int stop;
17 int skip;
18 int count;
19 int (*fn)(struct Qdisc *, unsigned long cl, struct qdisc_walker *);
20};
21
5d944c64 22#define QDISC_ALIGNTO 64
3d54b82f 23#define QDISC_ALIGN(len) (((len) + QDISC_ALIGNTO-1) & ~(QDISC_ALIGNTO-1))
1da177e4
LT
24
25static inline void *qdisc_priv(struct Qdisc *q)
26{
3d54b82f 27 return (char *) q + QDISC_ALIGN(sizeof(struct Qdisc));
1da177e4
LT
28}
29
30/*
31 Timer resolution MUST BE < 10% of min_schedulable_packet_size/bandwidth
32
33 Normal IP packet size ~ 512byte, hence:
34
35 0.5Kbyte/1Mbyte/sec = 0.5msec, so that we need 50usec timer for
36 10Mbit ethernet.
37
38 10msec resolution -> <50Kbit/sec.
39
40 The result: [34]86 is not good choice for QoS router :-(
41
25985edc 42 The things are not so bad, because we may use artificial
1da177e4
LT
43 clock evaluated by integration of network data flow
44 in the most critical places.
1da177e4
LT
45 */
46
1da177e4
LT
47typedef u64 psched_time_t;
48typedef long psched_tdiff_t;
49
a4a710c4
JP
50/* Avoid doing 64 bit divide */
51#define PSCHED_SHIFT 6
ca44d6e6
JP
52#define PSCHED_TICKS2NS(x) ((s64)(x) << PSCHED_SHIFT)
53#define PSCHED_NS2TICKS(x) ((x) >> PSCHED_SHIFT)
1da177e4 54
ca44d6e6 55#define PSCHED_TICKS_PER_SEC PSCHED_NS2TICKS(NSEC_PER_SEC)
a084980d 56#define PSCHED_PASTPERFECT 0
1da177e4 57
3bebcda2
PM
58static inline psched_time_t psched_get_time(void)
59{
d2de875c 60 return PSCHED_NS2TICKS(ktime_get_ns());
3bebcda2
PM
61}
62
03cc45c0
PM
63static inline psched_tdiff_t
64psched_tdiff_bounded(psched_time_t tv1, psched_time_t tv2, psched_time_t bound)
65{
66 return min(tv1 - tv2, bound);
67}
68
4179477f 69struct qdisc_watchdog {
a9efad8b 70 u64 last_expires;
4179477f
PM
71 struct hrtimer timer;
72 struct Qdisc *qdisc;
73};
74
860b642b
VCG
75void qdisc_watchdog_init_clockid(struct qdisc_watchdog *wd, struct Qdisc *qdisc,
76 clockid_t clockid);
5c15257f 77void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc);
efe074c2
ED
78
79void qdisc_watchdog_schedule_range_ns(struct qdisc_watchdog *wd, u64 expires,
80 u64 delta_ns);
81
82static inline void qdisc_watchdog_schedule_ns(struct qdisc_watchdog *wd,
83 u64 expires)
84{
85 return qdisc_watchdog_schedule_range_ns(wd, expires, 0ULL);
86}
34c5d292
JP
87
88static inline void qdisc_watchdog_schedule(struct qdisc_watchdog *wd,
89 psched_time_t expires)
90{
45f50bed 91 qdisc_watchdog_schedule_ns(wd, PSCHED_TICKS2NS(expires));
34c5d292
JP
92}
93
5c15257f 94void qdisc_watchdog_cancel(struct qdisc_watchdog *wd);
4179477f 95
1da177e4
LT
96extern struct Qdisc_ops pfifo_qdisc_ops;
97extern struct Qdisc_ops bfifo_qdisc_ops;
57dbb2d8 98extern struct Qdisc_ops pfifo_head_drop_qdisc_ops;
1da177e4 99
5c15257f
JP
100int fifo_set_limit(struct Qdisc *q, unsigned int limit);
101struct Qdisc *fifo_create_dflt(struct Qdisc *sch, struct Qdisc_ops *ops,
a38a9882
AA
102 unsigned int limit,
103 struct netlink_ext_ack *extack);
5c15257f
JP
104
105int register_qdisc(struct Qdisc_ops *qops);
106int unregister_qdisc(struct Qdisc_ops *qops);
6da7c8fc 107void qdisc_get_default(char *id, size_t len);
108int qdisc_set_default(const char *id);
109
49b49971 110void qdisc_hash_add(struct Qdisc *q, bool invisible);
59cc1f61 111void qdisc_hash_del(struct Qdisc *q);
5c15257f 112struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle);
3a7d0d07 113struct Qdisc *qdisc_lookup_rcu(struct net_device *dev, u32 handle);
5c15257f 114struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
e9bc3fa2
AA
115 struct nlattr *tab,
116 struct netlink_ext_ack *extack);
5c15257f
JP
117void qdisc_put_rtab(struct qdisc_rate_table *tab);
118void qdisc_put_stab(struct qdisc_size_table *tab);
6e765a00 119void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc);
29b86cda
JF
120bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
121 struct net_device *dev, struct netdev_queue *txq,
122 spinlock_t *root_lock, bool validate);
5c15257f
JP
123
124void __qdisc_run(struct Qdisc *q);
1da177e4 125
37437bb2 126static inline void qdisc_run(struct Qdisc *q)
1da177e4 127{
6c148184 128 if (qdisc_run_begin(q)) {
d518d2ed
PA
129 /* NOLOCK qdisc must check 'state' under the qdisc seqlock
130 * to avoid racing with dev_qdisc_reset()
131 */
132 if (!(q->flags & TCQ_F_NOLOCK) ||
133 likely(!test_bit(__QDISC_STATE_DEACTIVATED, &q->state)))
134 __qdisc_run(q);
6c148184
JF
135 qdisc_run_end(q);
136 }
d8b9605d
JP
137}
138
1da177e4
LT
139/* Calculate maximal size of packet seen by hard_start_xmit
140 routine of this device.
141 */
95c96174 142static inline unsigned int psched_mtu(const struct net_device *dev)
1da177e4 143{
3b04ddde 144 return dev->mtu + dev->hard_header_len;
1da177e4
LT
145}
146
855319be
JP
147static inline struct net *qdisc_net(struct Qdisc *q)
148{
149 return dev_net(q->dev_queue->dev);
150}
151
3d0bd028
VCG
152struct tc_cbs_qopt_offload {
153 u8 enable;
154 s32 queue;
155 s32 hicredit;
156 s32 locredit;
157 s32 idleslope;
158 s32 sendslope;
159};
160
88cab771
JSP
161struct tc_etf_qopt_offload {
162 u8 enable;
163 s32 queue;
164};
165
9c66d156
VCG
166struct tc_taprio_sched_entry {
167 u8 command; /* TC_TAPRIO_CMD_* */
168
169 /* The gate_mask in the offloading side refers to traffic classes */
170 u32 gate_mask;
171 u32 interval;
172};
173
174struct tc_taprio_qopt_offload {
175 u8 enable;
176 ktime_t base_time;
177 u64 cycle_time;
178 u64 cycle_time_extension;
179
180 size_t num_entries;
b90feaff 181 struct tc_taprio_sched_entry entries[];
9c66d156
VCG
182};
183
184/* Reference counting */
185struct tc_taprio_qopt_offload *taprio_offload_get(struct tc_taprio_qopt_offload
186 *offload);
187void taprio_offload_free(struct tc_taprio_qopt_offload *offload);
188
1da177e4 189#endif