]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blame - include/net/pkt_sched.h
sched: consistently handle layer3 header accesses in the presence of VLANs
[mirror_ubuntu-focal-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);
45f50bed 78void qdisc_watchdog_schedule_ns(struct qdisc_watchdog *wd, u64 expires);
34c5d292
JP
79
80static inline void qdisc_watchdog_schedule(struct qdisc_watchdog *wd,
81 psched_time_t expires)
82{
45f50bed 83 qdisc_watchdog_schedule_ns(wd, PSCHED_TICKS2NS(expires));
34c5d292
JP
84}
85
5c15257f 86void qdisc_watchdog_cancel(struct qdisc_watchdog *wd);
4179477f 87
1da177e4
LT
88extern struct Qdisc_ops pfifo_qdisc_ops;
89extern struct Qdisc_ops bfifo_qdisc_ops;
57dbb2d8 90extern struct Qdisc_ops pfifo_head_drop_qdisc_ops;
1da177e4 91
5c15257f
JP
92int fifo_set_limit(struct Qdisc *q, unsigned int limit);
93struct Qdisc *fifo_create_dflt(struct Qdisc *sch, struct Qdisc_ops *ops,
a38a9882
AA
94 unsigned int limit,
95 struct netlink_ext_ack *extack);
5c15257f
JP
96
97int register_qdisc(struct Qdisc_ops *qops);
98int unregister_qdisc(struct Qdisc_ops *qops);
6da7c8fc 99void qdisc_get_default(char *id, size_t len);
100int qdisc_set_default(const char *id);
101
49b49971 102void qdisc_hash_add(struct Qdisc *q, bool invisible);
59cc1f61 103void qdisc_hash_del(struct Qdisc *q);
5c15257f 104struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle);
3a7d0d07 105struct Qdisc *qdisc_lookup_rcu(struct net_device *dev, u32 handle);
5c15257f 106struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
e9bc3fa2
AA
107 struct nlattr *tab,
108 struct netlink_ext_ack *extack);
5c15257f
JP
109void qdisc_put_rtab(struct qdisc_rate_table *tab);
110void qdisc_put_stab(struct qdisc_size_table *tab);
6e765a00 111void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc);
29b86cda
JF
112bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
113 struct net_device *dev, struct netdev_queue *txq,
114 spinlock_t *root_lock, bool validate);
5c15257f
JP
115
116void __qdisc_run(struct Qdisc *q);
1da177e4 117
37437bb2 118static inline void qdisc_run(struct Qdisc *q)
1da177e4 119{
6c148184 120 if (qdisc_run_begin(q)) {
d518d2ed
PA
121 /* NOLOCK qdisc must check 'state' under the qdisc seqlock
122 * to avoid racing with dev_qdisc_reset()
123 */
124 if (!(q->flags & TCQ_F_NOLOCK) ||
125 likely(!test_bit(__QDISC_STATE_DEACTIVATED, &q->state)))
126 __qdisc_run(q);
6c148184
JF
127 qdisc_run_end(q);
128 }
1da177e4 129}
d8b9605d 130
1da177e4
LT
131/* Calculate maximal size of packet seen by hard_start_xmit
132 routine of this device.
133 */
95c96174 134static inline unsigned int psched_mtu(const struct net_device *dev)
1da177e4 135{
3b04ddde 136 return dev->mtu + dev->hard_header_len;
1da177e4
LT
137}
138
855319be
JP
139static inline struct net *qdisc_net(struct Qdisc *q)
140{
141 return dev_net(q->dev_queue->dev);
142}
143
3d0bd028
VCG
144struct tc_cbs_qopt_offload {
145 u8 enable;
146 s32 queue;
147 s32 hicredit;
148 s32 locredit;
149 s32 idleslope;
150 s32 sendslope;
151};
152
88cab771
JSP
153struct tc_etf_qopt_offload {
154 u8 enable;
155 s32 queue;
156};
157
9c66d156
VCG
158struct tc_taprio_sched_entry {
159 u8 command; /* TC_TAPRIO_CMD_* */
160
161 /* The gate_mask in the offloading side refers to traffic classes */
162 u32 gate_mask;
163 u32 interval;
164};
165
166struct tc_taprio_qopt_offload {
167 u8 enable;
168 ktime_t base_time;
169 u64 cycle_time;
170 u64 cycle_time_extension;
171
172 size_t num_entries;
173 struct tc_taprio_sched_entry entries[0];
174};
175
176/* Reference counting */
177struct tc_taprio_qopt_offload *taprio_offload_get(struct tc_taprio_qopt_offload
178 *offload);
179void taprio_offload_free(struct tc_taprio_qopt_offload *offload);
180
1da177e4 181#endif