Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
c5d40033
Commit
c5d40033
authored
Mar 18, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/net-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
e7830385
f6ee1ee5
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
338 additions
and
58 deletions
+338
-58
include/linux/pkt_sched.h
include/linux/pkt_sched.h
+6
-0
include/net/flow.h
include/net/flow.h
+1
-1
net/key/af_key.c
net/key/af_key.c
+23
-7
net/sched/Kconfig
net/sched/Kconfig
+11
-0
net/sched/Makefile
net/sched/Makefile
+1
-0
net/sched/sch_delay.c
net/sched/sch_delay.c
+269
-0
net/sched/sch_hfsc.c
net/sched/sch_hfsc.c
+27
-50
No files found.
include/linux/pkt_sched.h
View file @
c5d40033
...
...
@@ -432,4 +432,10 @@ enum {
#define TCA_ATM_MAX TCA_ATM_STATE
/* Delay section */
struct
tc_dly_qopt
{
__u32
latency
;
__u32
limit
;
};
#endif
include/net/flow.h
View file @
c5d40033
...
...
@@ -77,7 +77,7 @@ struct flowi {
#define fl_icmp_type uli_u.icmpt.type
#define fl_icmp_code uli_u.icmpt.code
#define fl_ipsec_spi uli_u.spi
};
}
__attribute__
((
__aligned__
(
BITS_PER_LONG
/
8
)))
;
#define FLOW_DIR_IN 0
#define FLOW_DIR_OUT 1
...
...
net/key/af_key.c
View file @
c5d40033
...
...
@@ -901,6 +901,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
struct
sadb_sa
*
sa
;
struct
sadb_key
*
key
;
uint16_t
proto
;
int
err
;
sa
=
(
struct
sadb_sa
*
)
ext_hdrs
[
SADB_EXT_SA
-
1
];
...
...
@@ -922,6 +923,9 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
if
(
proto
==
0
)
return
ERR_PTR
(
-
EINVAL
);
/* default error is no buffer space */
err
=
-
ENOBUFS
;
/* RFC2367:
Only SADB_SASTATE_MATURE SAs may be submitted in an SADB_ADD message.
...
...
@@ -980,8 +984,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
if
(
sa
->
sadb_sa_auth
)
{
int
keysize
=
0
;
struct
xfrm_algo_desc
*
a
=
xfrm_aalg_get_byid
(
sa
->
sadb_sa_auth
);
if
(
!
a
)
if
(
!
a
)
{
err
=
-
ENOSYS
;
goto
out
;
}
if
(
key
)
keysize
=
(
key
->
sadb_key_bits
+
7
)
/
8
;
x
->
aalg
=
kmalloc
(
sizeof
(
*
x
->
aalg
)
+
keysize
,
GFP_KERNEL
);
...
...
@@ -999,8 +1005,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
if
(
sa
->
sadb_sa_encrypt
)
{
if
(
hdr
->
sadb_msg_satype
==
SADB_X_SATYPE_IPCOMP
)
{
struct
xfrm_algo_desc
*
a
=
xfrm_calg_get_byid
(
sa
->
sadb_sa_encrypt
);
if
(
!
a
)
if
(
!
a
)
{
err
=
-
ENOSYS
;
goto
out
;
}
x
->
calg
=
kmalloc
(
sizeof
(
*
x
->
calg
),
GFP_KERNEL
);
if
(
!
x
->
calg
)
goto
out
;
...
...
@@ -1009,8 +1017,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
}
else
{
int
keysize
=
0
;
struct
xfrm_algo_desc
*
a
=
xfrm_ealg_get_byid
(
sa
->
sadb_sa_encrypt
);
if
(
!
a
)
if
(
!
a
)
{
err
=
-
ENOSYS
;
goto
out
;
}
key
=
(
struct
sadb_key
*
)
ext_hdrs
[
SADB_EXT_KEY_ENCRYPT
-
1
];
if
(
key
)
keysize
=
(
key
->
sadb_key_bits
+
7
)
/
8
;
...
...
@@ -1030,8 +1040,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
x
->
props
.
family
=
pfkey_sadb_addr2xfrm_addr
((
struct
sadb_address
*
)
ext_hdrs
[
SADB_EXT_ADDRESS_SRC
-
1
],
&
x
->
props
.
saddr
);
if
(
!
x
->
props
.
family
)
if
(
!
x
->
props
.
family
)
{
err
=
-
EAFNOSUPPORT
;
goto
out
;
}
pfkey_sadb_addr2xfrm_addr
((
struct
sadb_address
*
)
ext_hdrs
[
SADB_EXT_ADDRESS_DST
-
1
],
&
x
->
id
.
daddr
);
...
...
@@ -1076,10 +1088,14 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
}
x
->
type
=
xfrm_get_type
(
proto
,
x
->
props
.
family
);
if
(
x
->
type
==
NULL
)
if
(
x
->
type
==
NULL
)
{
err
=
-
ENOPROTOOPT
;
goto
out
;
if
(
x
->
type
->
init_state
(
x
,
NULL
))
}
if
(
x
->
type
->
init_state
(
x
,
NULL
))
{
err
=
-
EINVAL
;
goto
out
;
}
x
->
km
.
seq
=
hdr
->
sadb_msg_seq
;
x
->
km
.
state
=
XFRM_STATE_VALID
;
return
x
;
...
...
@@ -1087,7 +1103,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
out:
x
->
km
.
state
=
XFRM_STATE_DEAD
;
xfrm_state_put
(
x
);
return
ERR_PTR
(
-
ENOBUFS
);
return
ERR_PTR
(
err
);
}
static
int
pfkey_reserved
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
,
struct
sadb_msg
*
hdr
,
void
**
ext_hdrs
)
...
...
net/sched/Kconfig
View file @
c5d40033
...
...
@@ -164,6 +164,17 @@ config NET_SCH_DSMARK
To compile this code as a module, choose M here: the
module will be called sch_dsmark.
config NET_SCH_DELAY
tristate "Delay simulator"
depends on NET_SCHED
help
Say Y if you want to delay packets by a fixed amount of
time. This is often useful to simulate network delay when
testing applications or protocols.
To compile this driver as a module, choose M here: the module
will be called sch_delay.
config NET_SCH_INGRESS
tristate "Ingress Qdisc"
depends on NET_SCHED && NETFILTER
...
...
net/sched/Makefile
View file @
c5d40033
...
...
@@ -22,6 +22,7 @@ obj-$(CONFIG_NET_SCH_TBF) += sch_tbf.o
obj-$(CONFIG_NET_SCH_TEQL)
+=
sch_teql.o
obj-$(CONFIG_NET_SCH_PRIO)
+=
sch_prio.o
obj-$(CONFIG_NET_SCH_ATM)
+=
sch_atm.o
obj-$(CONFIG_NET_SCH_DELAY)
+=
sch_delay.o
obj-$(CONFIG_NET_CLS_U32)
+=
cls_u32.o
obj-$(CONFIG_NET_CLS_ROUTE4)
+=
cls_route.o
obj-$(CONFIG_NET_CLS_FW)
+=
cls_fw.o
...
...
net/sched/sch_delay.c
0 → 100644
View file @
c5d40033
/*
* net/sched/sch_delay.c Simple constant delay
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Authors: Stephen Hemminger <shemminger@osdl.org>
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/socket.h>
#include <linux/sockios.h>
#include <linux/in.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/if_ether.h>
#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/notifier.h>
#include <net/ip.h>
#include <net/route.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <net/pkt_sched.h>
/* Network delay simulator
This scheduler adds a fixed delay to all packets.
Similar to NISTnet and BSD Dummynet.
It uses byte fifo underneath similar to TBF */
struct
dly_sched_data
{
u32
latency
;
u32
limit
;
struct
timer_list
timer
;
struct
Qdisc
*
qdisc
;
};
/* Time stamp put into socket buffer control block */
struct
dly_skb_cb
{
psched_time_t
queuetime
;
};
/* Enqueue packets with underlying discipline (fifo)
* but mark them with current time first.
*/
static
int
dly_enqueue
(
struct
sk_buff
*
skb
,
struct
Qdisc
*
sch
)
{
struct
dly_sched_data
*
q
=
(
struct
dly_sched_data
*
)
sch
->
data
;
struct
dly_skb_cb
*
cb
=
(
struct
dly_skb_cb
*
)
skb
->
cb
;
int
ret
;
PSCHED_GET_TIME
(
cb
->
queuetime
);
/* Queue to underlying scheduler */
ret
=
q
->
qdisc
->
enqueue
(
skb
,
q
->
qdisc
);
if
(
ret
)
sch
->
stats
.
drops
++
;
else
{
sch
->
q
.
qlen
++
;
sch
->
stats
.
bytes
+=
skb
->
len
;
sch
->
stats
.
packets
++
;
}
return
0
;
}
/* Requeue packets but don't change time stamp */
static
int
dly_requeue
(
struct
sk_buff
*
skb
,
struct
Qdisc
*
sch
)
{
struct
dly_sched_data
*
q
=
(
struct
dly_sched_data
*
)
sch
->
data
;
int
ret
;
ret
=
q
->
qdisc
->
ops
->
requeue
(
skb
,
q
->
qdisc
);
if
(
ret
==
0
)
sch
->
q
.
qlen
++
;
return
ret
;
}
static
unsigned
int
dly_drop
(
struct
Qdisc
*
sch
)
{
struct
dly_sched_data
*
q
=
(
struct
dly_sched_data
*
)
sch
->
data
;
unsigned
int
len
;
len
=
q
->
qdisc
->
ops
->
drop
(
q
->
qdisc
);
if
(
len
)
{
sch
->
q
.
qlen
--
;
sch
->
stats
.
drops
++
;
}
return
len
;
}
/* Dequeue packet.
* If packet needs to be held up, then stop the
* queue and set timer to wakeup later.
*/
static
struct
sk_buff
*
dly_dequeue
(
struct
Qdisc
*
sch
)
{
struct
dly_sched_data
*
q
=
(
struct
dly_sched_data
*
)
sch
->
data
;
struct
sk_buff
*
skb
=
q
->
qdisc
->
dequeue
(
q
->
qdisc
);
if
(
skb
)
{
struct
dly_skb_cb
*
cb
=
(
struct
dly_skb_cb
*
)
skb
->
cb
;
psched_time_t
now
;
long
diff
;
PSCHED_GET_TIME
(
now
);
diff
=
q
->
latency
-
PSCHED_TDIFF
(
now
,
cb
->
queuetime
);
if
(
diff
<=
0
)
{
sch
->
q
.
qlen
--
;
sch
->
flags
&=
~
TCQ_F_THROTTLED
;
return
skb
;
}
if
(
!
netif_queue_stopped
(
sch
->
dev
))
{
long
delay
=
PSCHED_US2JIFFIE
(
diff
);
if
(
delay
<=
0
)
delay
=
1
;
mod_timer
(
&
q
->
timer
,
jiffies
+
delay
);
}
if
(
q
->
qdisc
->
ops
->
requeue
(
skb
,
q
->
qdisc
)
!=
NET_XMIT_SUCCESS
)
{
sch
->
q
.
qlen
--
;
sch
->
stats
.
drops
++
;
}
sch
->
flags
|=
TCQ_F_THROTTLED
;
}
return
NULL
;
}
static
void
dly_reset
(
struct
Qdisc
*
sch
)
{
struct
dly_sched_data
*
q
=
(
struct
dly_sched_data
*
)
sch
->
data
;
qdisc_reset
(
q
->
qdisc
);
sch
->
q
.
qlen
=
0
;
sch
->
flags
&=
~
TCQ_F_THROTTLED
;
del_timer
(
&
q
->
timer
);
}
static
void
dly_timer
(
unsigned
long
arg
)
{
struct
Qdisc
*
sch
=
(
struct
Qdisc
*
)
arg
;
sch
->
flags
&=
~
TCQ_F_THROTTLED
;
netif_schedule
(
sch
->
dev
);
}
/* Tell Fifo the new limit. */
static
int
change_limit
(
struct
Qdisc
*
q
,
u32
limit
)
{
struct
rtattr
*
rta
;
int
ret
;
rta
=
kmalloc
(
RTA_LENGTH
(
sizeof
(
struct
tc_fifo_qopt
)),
GFP_KERNEL
);
if
(
!
rta
)
return
-
ENOMEM
;
rta
->
rta_type
=
RTM_NEWQDISC
;
((
struct
tc_fifo_qopt
*
)
RTA_DATA
(
rta
))
->
limit
=
limit
;
ret
=
q
->
ops
->
change
(
q
,
rta
);
kfree
(
rta
);
return
ret
;
}
/* Setup underlying FIFO discipline */
static
int
dly_change
(
struct
Qdisc
*
sch
,
struct
rtattr
*
opt
)
{
struct
dly_sched_data
*
q
=
(
struct
dly_sched_data
*
)
sch
->
data
;
struct
tc_dly_qopt
*
qopt
=
RTA_DATA
(
opt
);
int
err
;
if
(
q
->
qdisc
==
&
noop_qdisc
)
{
struct
Qdisc
*
child
=
qdisc_create_dflt
(
sch
->
dev
,
&
bfifo_qdisc_ops
);
if
(
!
child
)
return
-
EINVAL
;
q
->
qdisc
=
child
;
}
err
=
change_limit
(
q
->
qdisc
,
qopt
->
limit
);
if
(
err
)
{
qdisc_destroy
(
q
->
qdisc
);
q
->
qdisc
=
&
noop_qdisc
;
}
else
{
q
->
latency
=
qopt
->
latency
;
q
->
limit
=
qopt
->
limit
;
}
return
err
;
}
static
int
dly_init
(
struct
Qdisc
*
sch
,
struct
rtattr
*
opt
)
{
struct
dly_sched_data
*
q
=
(
struct
dly_sched_data
*
)
sch
->
data
;
if
(
!
opt
)
return
-
EINVAL
;
init_timer
(
&
q
->
timer
);
q
->
timer
.
function
=
dly_timer
;
q
->
timer
.
data
=
(
unsigned
long
)
sch
;
q
->
qdisc
=
&
noop_qdisc
;
return
dly_change
(
sch
,
opt
);
}
static
void
dly_destroy
(
struct
Qdisc
*
sch
)
{
struct
dly_sched_data
*
q
=
(
struct
dly_sched_data
*
)
sch
->
data
;
del_timer
(
&
q
->
timer
);
qdisc_destroy
(
q
->
qdisc
);
q
->
qdisc
=
&
noop_qdisc
;
}
static
int
dly_dump
(
struct
Qdisc
*
sch
,
struct
sk_buff
*
skb
)
{
struct
dly_sched_data
*
q
=
(
struct
dly_sched_data
*
)
sch
->
data
;
unsigned
char
*
b
=
skb
->
tail
;
struct
tc_dly_qopt
qopt
;
qopt
.
latency
=
q
->
latency
;
qopt
.
limit
=
q
->
limit
;
RTA_PUT
(
skb
,
TCA_OPTIONS
,
sizeof
(
qopt
),
&
qopt
);
return
skb
->
len
;
rtattr_failure:
skb_trim
(
skb
,
b
-
skb
->
data
);
return
-
1
;
}
static
struct
Qdisc_ops
dly_qdisc_ops
=
{
.
id
=
"delay"
,
.
priv_size
=
sizeof
(
struct
dly_sched_data
),
.
enqueue
=
dly_enqueue
,
.
dequeue
=
dly_dequeue
,
.
requeue
=
dly_requeue
,
.
drop
=
dly_drop
,
.
init
=
dly_init
,
.
reset
=
dly_reset
,
.
destroy
=
dly_destroy
,
.
change
=
dly_change
,
.
dump
=
dly_dump
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
dly_module_init
(
void
)
{
return
register_qdisc
(
&
dly_qdisc_ops
);
}
static
void
__exit
dly_module_exit
(
void
)
{
unregister_qdisc
(
&
dly_qdisc_ops
);
}
module_init
(
dly_module_init
)
module_exit
(
dly_module_exit
)
MODULE_LICENSE
(
"GPL"
);
net/sched/sch_hfsc.c
View file @
c5d40033
...
...
@@ -118,7 +118,7 @@ enum hfsc_class_flags
struct
hfsc_class
{
u32
classid
;
/* class id */
u32
classid
;
/* class id */
unsigned
int
refcnt
;
/* usage count */
struct
tc_stats
stats
;
/* generic statistics */
...
...
@@ -138,28 +138,28 @@ struct hfsc_class
struct
list_head
hlist
;
/* hash list member */
struct
list_head
dlist
;
/* drop list member */
u64
cl_total
;
/* total work in bytes */
u64
cl_cumul
;
/* cumulative work in bytes done by
u64
cl_total
;
/* total work in bytes */
u64
cl_cumul
;
/* cumulative work in bytes done by
real-time criteria */
u64
cl_d
;
/* deadline*/
u64
cl_e
;
/* eligible time */
u64
cl_vt
;
/* virtual time */
u64
cl_f
;
/* time when this class will fit for
u64
cl_d
;
/* deadline*/
u64
cl_e
;
/* eligible time */
u64
cl_vt
;
/* virtual time */
u64
cl_f
;
/* time when this class will fit for
link-sharing, max(myf, cfmin) */
u64
cl_myf
;
/* my fit-time (calculated from this
u64
cl_myf
;
/* my fit-time (calculated from this
class's own upperlimit curve) */
u64
cl_myfadj
;
/* my fit-time adjustment (to cancel
u64
cl_myfadj
;
/* my fit-time adjustment (to cancel
history dependence) */
u64
cl_cfmin
;
/* earliest children's fit-time (used
u64
cl_cfmin
;
/* earliest children's fit-time (used
with cl_myf to obtain cl_f) */
u64
cl_cvtmin
;
/* minimal virtual time among the
u64
cl_cvtmin
;
/* minimal virtual time among the
children fit for link-sharing
(monotonic within a period) */
u64
cl_vtadj
;
/* intra-period cumulative vt
u64
cl_vtadj
;
/* intra-period cumulative vt
adjustment */
u64
cl_vtoff
;
/* inter-period cumulative vt offset */
u64
cl_cvtmax
;
/* max child's vt in the last period */
u64
cl_vtoff
;
/* inter-period cumulative vt offset */
u64
cl_cvtmax
;
/* max child's vt in the last period */
struct
internal_sc
cl_rsc
;
/* internal real-time service curve */
struct
internal_sc
cl_fsc
;
/* internal fair service curve */
...
...
@@ -179,15 +179,13 @@ struct hfsc_class
struct
hfsc_sched
{
u16
defcls
;
/* default class id */
u16
defcls
;
/* default class id */
struct
hfsc_class
root
;
/* root class */
struct
hfsc_class
*
last_xmit
;
/* class that transmitted last
packet (for requeueing) */
struct
list_head
clhash
[
HFSC_HSIZE
];
/* class hash */
struct
list_head
eligible
;
/* eligible list */
struct
list_head
droplist
;
/* active leaf class list (for
dropping) */
struct
sk_buff_head
requeue
;
/* requeued packet */
struct
timer_list
wd_timer
;
/* watchdog timer */
};
...
...
@@ -566,8 +564,7 @@ sc2isc(struct tc_service_curve *sc, struct internal_sc *isc)
* service curve starting at (x, y).
*/
static
void
rtsc_init
(
struct
runtime_sc
*
rtsc
,
struct
internal_sc
*
isc
,
u64
x
,
u64
y
)
rtsc_init
(
struct
runtime_sc
*
rtsc
,
struct
internal_sc
*
isc
,
u64
x
,
u64
y
)
{
rtsc
->
x
=
x
;
rtsc
->
y
=
y
;
...
...
@@ -626,8 +623,7 @@ rtsc_x2y(struct runtime_sc *rtsc, u64 x)
* runtime service curve and the service curve starting at (x, y).
*/
static
void
rtsc_min
(
struct
runtime_sc
*
rtsc
,
struct
internal_sc
*
isc
,
u64
x
,
u64
y
)
rtsc_min
(
struct
runtime_sc
*
rtsc
,
struct
internal_sc
*
isc
,
u64
x
,
u64
y
)
{
u64
y1
,
y2
,
dx
,
dy
;
u32
dsm
;
...
...
@@ -1231,9 +1227,6 @@ hfsc_delete_class(struct Qdisc *sch, unsigned long arg)
list_del
(
&
cl
->
siblings
);
hfsc_adjust_levels
(
cl
->
cl_parent
);
hfsc_purge_queue
(
sch
,
cl
);
if
(
q
->
last_xmit
==
cl
)
q
->
last_xmit
=
NULL
;
if
(
--
cl
->
refcnt
==
0
)
hfsc_destroy_class
(
sch
,
cl
);
...
...
@@ -1541,6 +1534,7 @@ hfsc_init_qdisc(struct Qdisc *sch, struct rtattr *opt)
INIT_LIST_HEAD
(
&
q
->
clhash
[
i
]);
INIT_LIST_HEAD
(
&
q
->
eligible
);
INIT_LIST_HEAD
(
&
q
->
droplist
);
skb_queue_head_init
(
&
q
->
requeue
);
q
->
root
.
refcnt
=
1
;
q
->
root
.
classid
=
sch
->
handle
;
...
...
@@ -1619,10 +1613,9 @@ hfsc_reset_qdisc(struct Qdisc *sch)
list_for_each_entry
(
cl
,
&
q
->
clhash
[
i
],
hlist
)
hfsc_reset_class
(
cl
);
}
__skb_queue_purge
(
&
q
->
requeue
);
INIT_LIST_HEAD
(
&
q
->
eligible
);
INIT_LIST_HEAD
(
&
q
->
droplist
);
q
->
last_xmit
=
NULL
;
del_timer
(
&
q
->
wd_timer
);
sch
->
flags
&=
~
TCQ_F_THROTTLED
;
sch
->
q
.
qlen
=
0
;
...
...
@@ -1639,7 +1632,7 @@ hfsc_destroy_qdisc(struct Qdisc *sch)
list_for_each_entry_safe
(
cl
,
next
,
&
q
->
clhash
[
i
],
hlist
)
hfsc_destroy_class
(
sch
,
cl
);
}
__skb_queue_purge
(
&
q
->
requeue
);
del_timer
(
&
q
->
wd_timer
);
}
...
...
@@ -1708,6 +1701,8 @@ hfsc_dequeue(struct Qdisc *sch)
if
(
sch
->
q
.
qlen
==
0
)
return
NULL
;
if
((
skb
=
__skb_dequeue
(
&
q
->
requeue
)))
goto
out
;
PSCHED_GET_TIME
(
cur_time
);
...
...
@@ -1757,7 +1752,7 @@ hfsc_dequeue(struct Qdisc *sch)
set_passive
(
cl
);
}
q
->
last_xmit
=
cl
;
out:
sch
->
flags
&=
~
TCQ_F_THROTTLED
;
sch
->
q
.
qlen
--
;
...
...
@@ -1768,28 +1763,10 @@ static int
hfsc_requeue
(
struct
sk_buff
*
skb
,
struct
Qdisc
*
sch
)
{
struct
hfsc_sched
*
q
=
(
struct
hfsc_sched
*
)
sch
->
data
;
struct
hfsc_class
*
cl
=
q
->
last_xmit
;
unsigned
int
len
=
skb
->
len
;
int
ret
;
if
(
cl
==
NULL
)
{
kfree_skb
(
skb
);
sch
->
stats
.
drops
++
;
return
NET_XMIT_DROP
;
}
ret
=
cl
->
qdisc
->
ops
->
requeue
(
skb
,
cl
->
qdisc
);
if
(
ret
==
NET_XMIT_SUCCESS
)
{
if
(
cl
->
qdisc
->
q
.
qlen
==
1
)
set_active
(
cl
,
len
);
sch
->
q
.
qlen
++
;
}
else
{
cl
->
stats
.
drops
++
;
sch
->
stats
.
drops
++
;
}
q
->
last_xmit
=
NULL
;
return
ret
;
__skb_queue_head
(
&
q
->
requeue
,
skb
);
sch
->
q
.
qlen
++
;
return
NET_XMIT_SUCCESS
;
}
static
unsigned
int
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment