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
276ca536
Commit
276ca536
authored
Nov 03, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://lia64.bkbits.net/linux-ia64-release-2.6.10
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
148b43d6
cde1321b
Changes
28
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
543 additions
and
269 deletions
+543
-269
fs/ext2/dir.c
fs/ext2/dir.c
+2
-1
include/linux/divert.h
include/linux/divert.h
+2
-0
include/linux/filter.h
include/linux/filter.h
+6
-0
include/linux/icmp.h
include/linux/icmp.h
+2
-0
include/linux/inet.h
include/linux/inet.h
+2
-0
include/linux/inetdevice.h
include/linux/inetdevice.h
+3
-0
include/linux/rtnetlink.h
include/linux/rtnetlink.h
+1
-0
include/net/act_api.h
include/net/act_api.h
+11
-2
include/net/iw_handler.h
include/net/iw_handler.h
+3
-0
include/net/neighbour.h
include/net/neighbour.h
+1
-1
include/net/pkt_act.h
include/net/pkt_act.h
+3
-4
net/core/dev.c
net/core/dev.c
+14
-9
net/core/gen_stats.c
net/core/gen_stats.c
+1
-0
net/core/neighbour.c
net/core/neighbour.c
+15
-10
net/ipv4/Kconfig
net/ipv4/Kconfig
+4
-0
net/ipv4/tcp_diag.c
net/ipv4/tcp_diag.c
+10
-16
net/ipv6/ndisc.c
net/ipv6/ndisc.c
+0
-7
net/netlink/af_netlink.c
net/netlink/af_netlink.c
+374
-109
net/sched/act_api.c
net/sched/act_api.c
+26
-3
net/sched/cls_fw.c
net/sched/cls_fw.c
+2
-4
net/sched/cls_route.c
net/sched/cls_route.c
+2
-4
net/sched/cls_rsvp.h
net/sched/cls_rsvp.h
+2
-4
net/sched/cls_u32.c
net/sched/cls_u32.c
+2
-4
net/sched/gact.c
net/sched/gact.c
+4
-16
net/sched/ipt.c
net/sched/ipt.c
+5
-18
net/sched/mirred.c
net/sched/mirred.c
+5
-18
net/sched/pedit.c
net/sched/pedit.c
+3
-15
net/sched/police.c
net/sched/police.c
+38
-24
No files found.
fs/ext2/dir.c
View file @
276ca536
...
...
@@ -275,7 +275,8 @@ ext2_readdir (struct file * filp, void * dirent, filldir_t filldir)
"bad page in #%lu"
,
inode
->
i_ino
);
filp
->
f_pos
+=
PAGE_CACHE_SIZE
-
offset
;
continue
;
ret
=
-
EIO
;
goto
done
;
}
kaddr
=
page_address
(
page
);
if
(
need_revalidate
)
{
...
...
include/linux/divert.h
View file @
276ca536
...
...
@@ -109,6 +109,8 @@ struct divert_cf
#include <linux/skbuff.h>
#ifdef CONFIG_NET_DIVERT
#include <linux/netdevice.h>
int
alloc_divert_blk
(
struct
net_device
*
);
void
free_divert_blk
(
struct
net_device
*
);
int
divert_ioctl
(
unsigned
int
cmd
,
struct
divert_cf
__user
*
arg
);
...
...
include/linux/filter.h
View file @
276ca536
...
...
@@ -6,6 +6,9 @@
#define __LINUX_FILTER_H__
#include <linux/compiler.h>
#include <linux/types.h>
#include <asm/atomic.h>
/*
* Current version of the filter code architecture.
...
...
@@ -135,6 +138,9 @@ static inline unsigned int sk_filter_len(struct sk_filter *fp)
#define SKF_LL_OFF (-0x200000)
#ifdef __KERNEL__
struct
sk_buff
;
struct
sock
;
extern
int
sk_run_filter
(
struct
sk_buff
*
skb
,
struct
sock_filter
*
filter
,
int
flen
);
extern
int
sk_attach_filter
(
struct
sock_fprog
*
fprog
,
struct
sock
*
sk
);
extern
int
sk_chk_filter
(
struct
sock_filter
*
filter
,
int
flen
);
...
...
include/linux/icmp.h
View file @
276ca536
...
...
@@ -17,6 +17,8 @@
#ifndef _LINUX_ICMP_H
#define _LINUX_ICMP_H
#include <linux/types.h>
#define ICMP_ECHOREPLY 0
/* Echo Reply */
#define ICMP_DEST_UNREACH 3
/* Destination Unreachable */
#define ICMP_SOURCE_QUENCH 4
/* Source Quench */
...
...
include/linux/inet.h
View file @
276ca536
...
...
@@ -43,6 +43,8 @@
#define _LINUX_INET_H
#ifdef __KERNEL__
#include <linux/types.h>
extern
__u32
in_aton
(
const
char
*
str
);
#endif
#endif
/* _LINUX_INET_H */
include/linux/inetdevice.h
View file @
276ca536
...
...
@@ -3,7 +3,10 @@
#ifdef __KERNEL__
#include <linux/if.h>
#include <linux/netdevice.h>
#include <linux/rcupdate.h>
#include <linux/timer.h>
struct
ipv4_devconf
{
...
...
include/linux/rtnetlink.h
View file @
276ca536
...
...
@@ -699,6 +699,7 @@ enum
TCA_RATE
,
TCA_FCNT
,
TCA_STATS2
,
TCA_ACT_STATS
,
__TCA_MAX
};
...
...
include/net/act_api.h
View file @
276ca536
...
...
@@ -28,7 +28,9 @@ struct tcf_police
struct
qdisc_rate_table
*
R_tab
;
struct
qdisc_rate_table
*
P_tab
;
struct
tc_stats
stats
;
struct
gnet_stats_basic
bstats
;
struct
gnet_stats_queue
qstats
;
struct
gnet_stats_rate_est
rate_est
;
spinlock_t
*
stats_lock
;
};
...
...
@@ -44,10 +46,16 @@ struct tcf_##name *next; \
u32 capab; \
int action; \
struct tcf_t tm; \
struct tc_stats stats; \
struct gnet_stats_basic bstats; \
struct gnet_stats_queue qstats; \
struct gnet_stats_rate_est rate_est; \
spinlock_t *stats_lock; \
spinlock_t lock
struct
tcf_act_hdr
{
tca_gen
(
act_hdr
);
};
struct
tc_action
{
...
...
@@ -95,6 +103,7 @@ extern int qdisc_copy_stats(struct sk_buff *skb, struct tc_stats *st, spinlock_t
extern
void
tcf_police_destroy
(
struct
tcf_police
*
p
);
extern
struct
tcf_police
*
tcf_police_locate
(
struct
rtattr
*
rta
,
struct
rtattr
*
est
);
extern
int
tcf_police_dump
(
struct
sk_buff
*
skb
,
struct
tcf_police
*
p
);
extern
int
tcf_police_dump_stats
(
struct
sk_buff
*
skb
,
struct
tcf_police
*
p
);
static
inline
int
tcf_police_release
(
struct
tcf_police
*
p
,
int
bind
)
...
...
include/net/iw_handler.h
View file @
276ca536
...
...
@@ -198,6 +198,7 @@
/***************************** INCLUDES *****************************/
#include <linux/wireless.h>
/* IOCTL user space API */
#include <linux/if_ether.h>
/***************************** VERSION *****************************/
/*
...
...
@@ -294,6 +295,8 @@ struct iw_request_info
__u16
flags
;
/* More to come ;-) */
};
struct
net_device
;
/*
* This is how a function handling a Wireless Extension should look
* like (both get and set, standard and private).
...
...
include/net/neighbour.h
View file @
276ca536
...
...
@@ -189,7 +189,7 @@ struct neigh_table
struct
timer_list
gc_timer
;
struct
timer_list
proxy_timer
;
struct
sk_buff_head
proxy_queue
;
int
entries
;
atomic_t
entries
;
rwlock_t
lock
;
unsigned
long
last_rand
;
struct
neigh_parms
*
parms_list
;
...
...
include/net/pkt_act.h
View file @
276ca536
...
...
@@ -60,7 +60,7 @@ tcf_hash_destroy(struct tcf_st *p)
*
p1p
=
p
->
next
;
write_unlock_bh
(
&
tcf_t_lock
);
#ifdef CONFIG_NET_ESTIMATOR
qdisc_kill_estimator
(
&
p
->
stats
);
gen_kill_estimator
(
&
p
->
bstats
,
&
p
->
rate_est
);
#endif
kfree
(
p
);
return
;
...
...
@@ -256,9 +256,8 @@ tcf_hash_create(struct tc_st *parm, struct rtattr *est, struct tc_action *a, int
p
->
tm
.
install
=
jiffies
;
p
->
tm
.
lastuse
=
jiffies
;
#ifdef CONFIG_NET_ESTIMATOR
if
(
est
)
{
qdisc_new_estimator
(
&
p
->
stats
,
p
->
stats_lock
,
est
);
}
if
(
est
)
gen_new_estimator
(
&
p
->
bstats
,
&
p
->
rate_est
,
p
->
stats_lock
,
est
);
#endif
h
=
tcf_hash
(
p
->
index
);
write_lock_bh
(
&
tcf_t_lock
);
...
...
net/core/dev.c
View file @
276ca536
...
...
@@ -1261,11 +1261,6 @@ int dev_queue_xmit(struct sk_buff *skb)
struct
Qdisc
*
q
;
int
rc
=
-
ENOMEM
;
/* Disable soft irqs for various locks below. Also
* stops preemption for RCU.
*/
local_bh_disable
();
if
(
skb_shinfo
(
skb
)
->
frag_list
&&
!
(
dev
->
features
&
NETIF_F_FRAGLIST
)
&&
__skb_linearize
(
skb
,
GFP_ATOMIC
))
...
...
@@ -1290,6 +1285,11 @@ int dev_queue_xmit(struct sk_buff *skb)
if
(
skb_checksum_help
(
skb
,
0
))
goto
out_kfree_skb
;
/* Disable soft irqs for various locks below. Also
* stops preemption for RCU.
*/
local_bh_disable
();
/* Updates of qdisc are serialized by queue_lock.
* The struct Qdisc which is pointed to by qdisc is now a
* rcu structure - it may be accessed without acquiring
...
...
@@ -1352,7 +1352,6 @@ int dev_queue_xmit(struct sk_buff *skb)
if
(
net_ratelimit
())
printk
(
KERN_CRIT
"Virtual device %s asks to "
"queue packet!
\n
"
,
dev
->
name
);
goto
out_enetdown
;
}
else
{
/* Recursion is detected! It is possible,
* unfortunately */
...
...
@@ -1361,10 +1360,13 @@ int dev_queue_xmit(struct sk_buff *skb)
"%s, fix it urgently!
\n
"
,
dev
->
name
);
}
}
out_enetdown:
rc
=
-
ENETDOWN
;
local_bh_enable
();
out_kfree_skb:
kfree_skb
(
skb
);
return
rc
;
out:
local_bh_enable
();
return
rc
;
...
...
@@ -2374,8 +2376,11 @@ static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd)
return
dev_set_mtu
(
dev
,
ifr
->
ifr_mtu
);
case
SIOCGIFHWADDR
:
memcpy
(
ifr
->
ifr_hwaddr
.
sa_data
,
dev
->
dev_addr
,
min
(
sizeof
ifr
->
ifr_hwaddr
.
sa_data
,
(
size_t
)
dev
->
addr_len
));
if
(
!
dev
->
addr_len
)
memset
(
ifr
->
ifr_hwaddr
.
sa_data
,
0
,
sizeof
ifr
->
ifr_hwaddr
.
sa_data
);
else
memcpy
(
ifr
->
ifr_hwaddr
.
sa_data
,
dev
->
dev_addr
,
min
(
sizeof
ifr
->
ifr_hwaddr
.
sa_data
,
(
size_t
)
dev
->
addr_len
));
ifr
->
ifr_hwaddr
.
sa_family
=
dev
->
type
;
return
0
;
...
...
net/core/gen_stats.c
View file @
276ca536
...
...
@@ -125,6 +125,7 @@ gnet_stats_finish_copy(struct gnet_dump *d)
EXPORT_SYMBOL
(
gnet_stats_start_copy
);
EXPORT_SYMBOL
(
gnet_stats_start_copy_compat
);
EXPORT_SYMBOL
(
gnet_stats_copy_basic
);
EXPORT_SYMBOL
(
gnet_stats_copy_rate_est
);
EXPORT_SYMBOL
(
gnet_stats_copy_queue
);
...
...
net/core/neighbour.c
View file @
276ca536
...
...
@@ -254,18 +254,20 @@ static struct neighbour *neigh_alloc(struct neigh_table *tbl)
{
struct
neighbour
*
n
=
NULL
;
unsigned
long
now
=
jiffies
;
int
entries
;
if
(
tbl
->
entries
>
tbl
->
gc_thresh3
||
(
tbl
->
entries
>
tbl
->
gc_thresh2
&&
entries
=
atomic_inc_return
(
&
tbl
->
entries
)
-
1
;
if
(
entries
>=
tbl
->
gc_thresh3
||
(
entries
>=
tbl
->
gc_thresh2
&&
time_after
(
now
,
tbl
->
last_flush
+
5
*
HZ
)))
{
if
(
!
neigh_forced_gc
(
tbl
)
&&
tbl
->
entries
>
tbl
->
gc_thresh3
)
goto
out
;
entries
>=
tbl
->
gc_thresh3
)
goto
out
_entries
;
}
n
=
kmem_cache_alloc
(
tbl
->
kmem_cachep
,
SLAB_ATOMIC
);
if
(
!
n
)
goto
out
;
goto
out
_entries
;
memset
(
n
,
0
,
tbl
->
entry_size
);
...
...
@@ -281,12 +283,15 @@ static struct neighbour *neigh_alloc(struct neigh_table *tbl)
NEIGH_CACHE_STAT_INC
(
tbl
,
allocs
);
neigh_glbl_allocs
++
;
tbl
->
entries
++
;
n
->
tbl
=
tbl
;
atomic_set
(
&
n
->
refcnt
,
1
);
n
->
dead
=
1
;
out:
return
n
;
out_entries:
atomic_dec
(
&
tbl
->
entries
);
goto
out
;
}
static
struct
neighbour
**
neigh_hash_alloc
(
unsigned
int
entries
)
...
...
@@ -427,7 +432,7 @@ struct neighbour *neigh_create(struct neigh_table *tbl, const void *pkey,
write_lock_bh
(
&
tbl
->
lock
);
if
(
tbl
->
entries
>
(
tbl
->
hash_mask
+
1
))
if
(
atomic_read
(
&
tbl
->
entries
)
>
(
tbl
->
hash_mask
+
1
))
neigh_hash_grow
(
tbl
,
(
tbl
->
hash_mask
+
1
)
<<
1
);
hash_val
=
tbl
->
hash
(
pkey
,
dev
)
&
tbl
->
hash_mask
;
...
...
@@ -608,7 +613,7 @@ void neigh_destroy(struct neighbour *neigh)
NEIGH_PRINTK2
(
"neigh %p is destroyed.
\n
"
,
neigh
);
neigh_glbl_allocs
--
;
neigh
->
tbl
->
entries
--
;
atomic_dec
(
&
neigh
->
tbl
->
entries
)
;
kmem_cache_free
(
neigh
->
tbl
->
kmem_cachep
,
neigh
);
}
...
...
@@ -1394,7 +1399,7 @@ int neigh_table_clear(struct neigh_table *tbl)
del_timer_sync
(
&
tbl
->
proxy_timer
);
pneigh_queue_purge
(
&
tbl
->
proxy_queue
);
neigh_ifdown
(
tbl
,
NULL
);
if
(
tbl
->
entries
)
if
(
atomic_read
(
&
tbl
->
entries
)
)
printk
(
KERN_CRIT
"neighbour leakage
\n
"
);
write_lock
(
&
neigh_tbl_lock
);
for
(
tp
=
&
neigh_tables
;
*
tp
;
tp
=
&
(
*
tp
)
->
next
)
{
...
...
@@ -1951,7 +1956,7 @@ static int neigh_stat_seq_show(struct seq_file *seq, void *v)
seq_printf
(
seq
,
"%08x %08lx %08lx %08lx %08lx %08lx %08lx "
"%08lx %08lx %08lx %08lx
\n
"
,
tbl
->
entries
,
atomic_read
(
&
tbl
->
entries
)
,
st
->
allocs
,
st
->
destroys
,
...
...
net/ipv4/Kconfig
View file @
276ca536
...
...
@@ -351,6 +351,7 @@ config INET_TUNNEL
config IP_TCPDIAG
tristate "IP: TCP socket monitoring interface"
depends on INET
default y
---help---
Support for TCP socket monitoring interface used by native Linux
...
...
@@ -358,5 +359,8 @@ config IP_TCPDIAG
If unsure, say Y.
config IP_TCPDIAG_IPV6
def_bool (IP_TCPDIAG=y && IPV6=y) || (IP_TCPDIAG=m && IPV6)
source "net/ipv4/ipvs/Kconfig"
net/ipv4/tcp_diag.c
View file @
276ca536
...
...
@@ -103,14 +103,12 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk,
r
->
tcpdiag_wqueue
=
0
;
r
->
tcpdiag_uid
=
0
;
r
->
tcpdiag_inode
=
0
;
#ifdef CONFIG_IPV6
if
(
r
->
tcpdiag_family
==
AF_INET6
)
{
ipv6_addr_copy
((
struct
in6_addr
*
)
r
->
id
.
tcpdiag_src
,
&
tw
->
tw_v6_rcv_saddr
);
ipv6_addr_copy
((
struct
in6_addr
*
)
r
->
id
.
tcpdiag_dst
,
&
tw
->
tw_v6_daddr
);
}
#endif
nlh
->
nlmsg_len
=
skb
->
tail
-
b
;
return
skb
->
len
;
}
...
...
@@ -120,7 +118,6 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk,
r
->
id
.
tcpdiag_src
[
0
]
=
inet
->
rcv_saddr
;
r
->
id
.
tcpdiag_dst
[
0
]
=
inet
->
daddr
;
#ifdef CONFIG_IPV6
if
(
r
->
tcpdiag_family
==
AF_INET6
)
{
struct
ipv6_pinfo
*
np
=
inet6_sk
(
sk
);
...
...
@@ -129,7 +126,6 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk,
ipv6_addr_copy
((
struct
in6_addr
*
)
r
->
id
.
tcpdiag_dst
,
&
np
->
daddr
);
}
#endif
#define EXPIRES_IN_MS(tmo) ((tmo-jiffies)*1000+HZ-1)/HZ
...
...
@@ -188,11 +184,19 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk,
return
-
1
;
}
extern
struct
sock
*
tcp_v4_lookup
(
u32
saddr
,
u16
sport
,
u32
daddr
,
u16
dport
,
int
dif
);
#ifdef CONFIG_IPV6
extern
struct
sock
*
tcp_v4_lookup
(
u32
saddr
,
u16
sport
,
u32
daddr
,
u16
dport
,
int
dif
);
#ifdef CONFIG_IP_TCPDIAG_IPV6
extern
struct
sock
*
tcp_v6_lookup
(
struct
in6_addr
*
saddr
,
u16
sport
,
struct
in6_addr
*
daddr
,
u16
dport
,
int
dif
);
#else
static
inline
struct
sock
*
tcp_v6_lookup
(
struct
in6_addr
*
saddr
,
u16
sport
,
struct
in6_addr
*
daddr
,
u16
dport
,
int
dif
)
{
return
NULL
;
}
#endif
static
int
tcpdiag_get_exact
(
struct
sk_buff
*
in_skb
,
const
struct
nlmsghdr
*
nlh
)
...
...
@@ -207,13 +211,11 @@ static int tcpdiag_get_exact(struct sk_buff *in_skb, const struct nlmsghdr *nlh)
req
->
id
.
tcpdiag_src
[
0
],
req
->
id
.
tcpdiag_sport
,
req
->
id
.
tcpdiag_if
);
}
#ifdef CONFIG_IPV6
else
if
(
req
->
tcpdiag_family
==
AF_INET6
)
{
sk
=
tcp_v6_lookup
((
struct
in6_addr
*
)
req
->
id
.
tcpdiag_dst
,
req
->
id
.
tcpdiag_dport
,
(
struct
in6_addr
*
)
req
->
id
.
tcpdiag_src
,
req
->
id
.
tcpdiag_sport
,
req
->
id
.
tcpdiag_if
);
}
#endif
else
{
return
-
EINVAL
;
}
...
...
@@ -422,14 +424,12 @@ static int tcpdiag_dump_sock(struct sk_buff *skb, struct sock *sk,
struct
inet_opt
*
inet
=
inet_sk
(
sk
);
entry
.
family
=
sk
->
sk_family
;
#ifdef CONFIG_IPV6
if
(
entry
.
family
==
AF_INET6
)
{
struct
ipv6_pinfo
*
np
=
inet6_sk
(
sk
);
entry
.
saddr
=
np
->
rcv_saddr
.
s6_addr32
;
entry
.
daddr
=
np
->
daddr
.
s6_addr32
;
}
else
#endif
{
entry
.
saddr
=
&
inet
->
rcv_saddr
;
entry
.
daddr
=
&
inet
->
daddr
;
...
...
@@ -482,14 +482,12 @@ static int tcpdiag_fill_req(struct sk_buff *skb, struct sock *sk,
r
->
tcpdiag_wqueue
=
0
;
r
->
tcpdiag_uid
=
sock_i_uid
(
sk
);
r
->
tcpdiag_inode
=
0
;
#ifdef CONFIG_IPV6
if
(
r
->
tcpdiag_family
==
AF_INET6
)
{
ipv6_addr_copy
((
struct
in6_addr
*
)
r
->
id
.
tcpdiag_src
,
&
req
->
af
.
v6_req
.
loc_addr
);
ipv6_addr_copy
((
struct
in6_addr
*
)
r
->
id
.
tcpdiag_dst
,
&
req
->
af
.
v6_req
.
rmt_addr
);
}
#endif
nlh
->
nlmsg_len
=
skb
->
tail
-
b
;
return
skb
->
len
;
...
...
@@ -545,16 +543,12 @@ static int tcpdiag_dump_reqs(struct sk_buff *skb, struct sock *sk,
if
(
bc
)
{
entry
.
saddr
=
#ifdef CONFIG_IPV6
(
entry
.
family
==
AF_INET6
)
?
req
->
af
.
v6_req
.
loc_addr
.
s6_addr32
:
#endif
&
req
->
af
.
v4_req
.
loc_addr
;
entry
.
daddr
=
#ifdef CONFIG_IPV6
(
entry
.
family
==
AF_INET6
)
?
req
->
af
.
v6_req
.
rmt_addr
.
s6_addr32
:
#endif
&
req
->
af
.
v4_req
.
rmt_addr
;
entry
.
dport
=
ntohs
(
req
->
rmt_port
);
...
...
net/ipv6/ndisc.c
View file @
276ca536
...
...
@@ -1078,13 +1078,6 @@ static void ndisc_router_discovery(struct sk_buff *skb)
return
;
}
neigh
->
flags
|=
NTF_ROUTER
;
/*
* If we where using an "all destinations on link" route
* delete it
*/
rt6_purge_dflt_routers
();
}
if
(
rt
)
...
...
net/netlink/af_netlink.c
View file @
276ca536
This diff is collapsed.
Click to expand it.
net/sched/act_api.c
View file @
276ca536
...
...
@@ -416,14 +416,37 @@ int tcf_action_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a,
int
tcf_action_copy_stats
(
struct
sk_buff
*
skb
,
struct
tc_action
*
a
)
{
struct
gnet_dump
d
;
struct
tcf_act_hdr
*
h
=
a
->
priv
;
#ifdef CONFIG_KMOD
/* place holder */
#endif
if
(
NULL
==
a
->
ops
||
NULL
==
a
->
ops
->
get_stats
)
return
1
;
if
(
NULL
==
h
)
goto
errout
;
if
(
gnet_stats_start_copy
(
skb
,
TCA_ACT_STATS
,
h
->
stats_lock
,
&
d
)
<
0
)
goto
errout
;
if
(
NULL
!=
a
->
ops
&&
NULL
!=
a
->
ops
->
get_stats
)
if
(
a
->
ops
->
get_stats
(
skb
,
a
)
<
0
)
goto
errout
;
if
(
gnet_stats_copy_basic
(
&
d
,
&
h
->
bstats
)
<
0
||
#ifdef CONFIG_NET_ESTIMATOR
gnet_stats_copy_rate_est
(
&
d
,
&
h
->
rate_est
)
<
0
||
#endif
gnet_stats_copy_queue
(
&
d
,
&
h
->
qstats
)
<
0
)
goto
errout
;
return
a
->
ops
->
get_stats
(
skb
,
a
);
if
(
gnet_stats_finish_copy
(
&
d
)
<
0
)
goto
errout
;
return
0
;
errout:
return
-
1
;
}
...
...
net/sched/cls_fw.c
View file @
276ca536
...
...
@@ -395,11 +395,9 @@ static int fw_dump(struct tcf_proto *tp, unsigned long fh,
}
#else
/* CONFIG_NET_CLS_ACT */
#ifdef CONFIG_NET_CLS_POLICE
if
(
f
->
police
)
{
if
(
qdisc_copy_stats
(
skb
,
&
f
->
police
->
stats
,
f
->
police
->
stats_lock
))
if
(
f
->
police
)
if
(
tcf_police_dump_stats
(
skb
,
f
->
police
)
<
0
)
goto
rtattr_failure
;
}
#endif
/* CONFIG_NET_CLS_POLICE */
#endif
/* CONFIG_NET_CLS_ACT */
return
skb
->
len
;
...
...
net/sched/cls_route.c
View file @
276ca536
...
...
@@ -566,11 +566,9 @@ static int route4_dump(struct tcf_proto *tp, unsigned long fh,
rta
->
rta_len
=
skb
->
tail
-
b
;
#ifdef CONFIG_NET_CLS_POLICE
if
(
f
->
police
)
{
if
(
qdisc_copy_stats
(
skb
,
&
f
->
police
->
stats
,
f
->
police
->
stats_lock
))
if
(
f
->
police
)
if
(
tcf_police_dump_stats
(
skb
,
f
->
police
)
<
0
)
goto
rtattr_failure
;
}
#endif
return
skb
->
len
;
...
...
net/sched/cls_rsvp.h
View file @
276ca536
...
...
@@ -631,11 +631,9 @@ static int rsvp_dump(struct tcf_proto *tp, unsigned long fh,
rta
->
rta_len
=
skb
->
tail
-
b
;
#ifdef CONFIG_NET_CLS_POLICE
if
(
f
->
police
)
{
if
(
qdisc_copy_stats
(
skb
,
&
f
->
police
->
stats
,
f
->
police
->
stats_lock
))
if
(
f
->
police
)
if
(
tcf_police_dump_stats
(
skb
,
f
->
police
)
<
0
)
goto
rtattr_failure
;
}
#endif
return
skb
->
len
;
...
...
net/sched/cls_u32.c
View file @
276ca536
...
...
@@ -775,11 +775,9 @@ static int u32_dump(struct tcf_proto *tp, unsigned long fh,
}
#else
#ifdef CONFIG_NET_CLS_POLICE
if
(
TC_U32_KEY
(
n
->
handle
)
&&
n
->
police
)
{
if
(
qdisc_copy_stats
(
skb
,
&
n
->
police
->
stats
,
n
->
police
->
stats_lock
))
if
(
TC_U32_KEY
(
n
->
handle
)
&&
n
->
police
)
if
(
tcf_police_dump_stats
(
skb
,
n
->
police
)
<
0
)
goto
rtattr_failure
;
}
#endif
#endif
return
skb
->
len
;
...
...
net/sched/gact.c
View file @
276ca536
...
...
@@ -62,7 +62,7 @@ gact_net_rand(struct tcf_gact *p) {
int
gact_determ
(
struct
tcf_gact
*
p
)
{
if
(
p
->
stats
.
packets
%
p
->
pval
)
if
(
p
->
b
stats
.
packets
%
p
->
pval
)
return
p
->
action
;
return
p
->
paction
;
}
...
...
@@ -163,10 +163,10 @@ tcf_gact(struct sk_buff **pskb, struct tc_action *a)
#else
action
=
p
->
action
;
#endif
p
->
stats
.
bytes
+=
skb
->
len
;
p
->
stats
.
packets
++
;
p
->
b
stats
.
bytes
+=
skb
->
len
;
p
->
b
stats
.
packets
++
;
if
(
TC_ACT_SHOT
==
action
)
p
->
stats
.
drops
++
;
p
->
q
stats
.
drops
++
;
p
->
tm
.
lastuse
=
jiffies
;
spin_unlock
(
&
p
->
lock
);
...
...
@@ -214,17 +214,6 @@ tcf_gact_dump(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
return
-
1
;
}
int
tcf_gact_stats
(
struct
sk_buff
*
skb
,
struct
tc_action
*
a
)
{
struct
tcf_gact
*
p
;
p
=
PRIV
(
a
,
gact
);
if
(
NULL
!=
p
)
return
qdisc_copy_stats
(
skb
,
&
p
->
stats
,
p
->
stats_lock
);
return
1
;
}
struct
tc_action_ops
act_gact_ops
=
{
.
next
=
NULL
,
.
kind
=
"gact"
,
...
...
@@ -232,7 +221,6 @@ struct tc_action_ops act_gact_ops = {
.
capab
=
TCA_CAP_NONE
,
.
owner
=
THIS_MODULE
,
.
act
=
tcf_gact
,
.
get_stats
=
tcf_gact_stats
,
.
dump
=
tcf_gact_dump
,
.
cleanup
=
tcf_gact_cleanup
,
.
lookup
=
tcf_hash_search
,
...
...
net/sched/ipt.c
View file @
276ca536
...
...
@@ -218,9 +218,8 @@ tcf_ipt_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a, int ov
*/
p
->
tm
.
install
=
jiffies
;
#ifdef CONFIG_NET_ESTIMATOR
if
(
est
)
{
qdisc_new_estimator
(
&
p
->
stats
,
p
->
stats_lock
,
est
);
}
if
(
est
)
gen_new_estimator
(
&
p
->
bstats
,
&
p
->
rate_est
,
p
->
stats_lock
,
est
);
#endif
h
=
tcf_hash
(
p
->
index
);
write_lock_bh
(
&
ipt_lock
);
...
...
@@ -258,8 +257,8 @@ tcf_ipt(struct sk_buff **pskb, struct tc_action *a)
spin_lock
(
&
p
->
lock
);
p
->
tm
.
lastuse
=
jiffies
;
p
->
stats
.
bytes
+=
skb
->
len
;
p
->
stats
.
packets
++
;
p
->
b
stats
.
bytes
+=
skb
->
len
;
p
->
b
stats
.
packets
++
;
if
(
skb_cloned
(
skb
)
)
{
if
(
pskb_expand_head
(
skb
,
0
,
0
,
GFP_ATOMIC
))
{
...
...
@@ -278,7 +277,7 @@ tcf_ipt(struct sk_buff **pskb, struct tc_action *a)
break
;
case
NF_DROP
:
result
=
TC_ACT_SHOT
;
p
->
stats
.
drops
++
;
p
->
q
stats
.
drops
++
;
break
;
case
IPT_CONTINUE
:
result
=
TC_ACT_PIPE
;
...
...
@@ -346,17 +345,6 @@ tcf_ipt_dump(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
return
-
1
;
}
int
tcf_ipt_stats
(
struct
sk_buff
*
skb
,
struct
tc_action
*
a
)
{
struct
tcf_ipt
*
p
;
p
=
PRIV
(
a
,
ipt
);
if
(
NULL
!=
p
)
return
qdisc_copy_stats
(
skb
,
&
p
->
stats
,
p
->
stats_lock
);
return
1
;
}
struct
tc_action_ops
act_ipt_ops
=
{
.
next
=
NULL
,
.
kind
=
"ipt"
,
...
...
@@ -364,7 +352,6 @@ struct tc_action_ops act_ipt_ops = {
.
capab
=
TCA_CAP_NONE
,
.
owner
=
THIS_MODULE
,
.
act
=
tcf_ipt
,
.
get_stats
=
tcf_ipt_stats
,
.
dump
=
tcf_ipt_dump
,
.
cleanup
=
tcf_ipt_cleanup
,
.
lookup
=
tcf_hash_search
,
...
...
net/sched/mirred.c
View file @
276ca536
...
...
@@ -195,9 +195,9 @@ tcf_mirred(struct sk_buff **pskb, struct tc_action *a)
bad_mirred:
if
(
NULL
!=
skb2
)
kfree_skb
(
skb2
);
p
->
stats
.
overlimits
++
;
p
->
stats
.
bytes
+=
skb
->
len
;
p
->
stats
.
packets
++
;
p
->
q
stats
.
overlimits
++
;
p
->
b
stats
.
bytes
+=
skb
->
len
;
p
->
b
stats
.
packets
++
;
spin_unlock
(
&
p
->
lock
);
/* should we be asking for packet to be dropped?
* may make sense for redirect case only
...
...
@@ -216,8 +216,8 @@ tcf_mirred(struct sk_buff **pskb, struct tc_action *a)
goto
bad_mirred
;
}
p
->
stats
.
bytes
+=
skb2
->
len
;
p
->
stats
.
packets
++
;
p
->
b
stats
.
bytes
+=
skb2
->
len
;
p
->
b
stats
.
packets
++
;
if
(
!
(
at
&
AT_EGRESS
))
{
if
(
p
->
ok_push
)
{
skb_push
(
skb2
,
skb2
->
dev
->
hard_header_len
);
...
...
@@ -268,18 +268,6 @@ tcf_mirred_dump(struct sk_buff *skb, struct tc_action *a,int bind, int ref)
return
-
1
;
}
int
tcf_mirred_stats
(
struct
sk_buff
*
skb
,
struct
tc_action
*
a
)
{
struct
tcf_mirred
*
p
;
p
=
PRIV
(
a
,
mirred
);
if
(
NULL
!=
p
)
return
qdisc_copy_stats
(
skb
,
&
p
->
stats
,
p
->
stats_lock
);
return
1
;
}
static
struct
tc_action_ops
act_mirred_ops
=
{
.
next
=
NULL
,
.
kind
=
"mirred"
,
...
...
@@ -287,7 +275,6 @@ static struct tc_action_ops act_mirred_ops = {
.
capab
=
TCA_CAP_NONE
,
.
owner
=
THIS_MODULE
,
.
act
=
tcf_mirred
,
.
get_stats
=
tcf_mirred_stats
,
.
dump
=
tcf_mirred_dump
,
.
cleanup
=
tcf_mirred_cleanup
,
.
lookup
=
tcf_hash_search
,
...
...
net/sched/pedit.c
View file @
276ca536
...
...
@@ -183,10 +183,10 @@ tcf_pedit(struct sk_buff **pskb, struct tc_action *a)
}
bad:
p
->
stats
.
overlimits
++
;
p
->
q
stats
.
overlimits
++
;
done:
p
->
stats
.
bytes
+=
skb
->
len
;
p
->
stats
.
packets
++
;
p
->
b
stats
.
bytes
+=
skb
->
len
;
p
->
b
stats
.
packets
++
;
spin_unlock
(
&
p
->
lock
);
return
p
->
action
;
}
...
...
@@ -255,17 +255,6 @@ tcf_pedit_dump(struct sk_buff *skb, struct tc_action *a,int bind, int ref)
return
-
1
;
}
int
tcf_pedit_stats
(
struct
sk_buff
*
skb
,
struct
tc_action
*
a
)
{
struct
tcf_pedit
*
p
;
p
=
PRIV
(
a
,
pedit
);
if
(
NULL
!=
p
)
return
qdisc_copy_stats
(
skb
,
&
p
->
stats
,
p
->
stats_lock
);
return
1
;
}
static
struct
tc_action_ops
act_pedit_ops
=
{
.
kind
=
"pedit"
,
...
...
@@ -273,7 +262,6 @@ struct tc_action_ops act_pedit_ops = {
.
capab
=
TCA_CAP_NONE
,
.
owner
=
THIS_MODULE
,
.
act
=
tcf_pedit
,
.
get_stats
=
tcf_pedit_stats
,
.
dump
=
tcf_pedit_dump
,
.
cleanup
=
tcf_pedit_cleanup
,
.
lookup
=
tcf_hash_search
,
...
...
net/sched/police.c
View file @
276ca536
...
...
@@ -149,7 +149,7 @@ void tcf_police_destroy(struct tcf_police *p)
*
p1p
=
p
->
next
;
write_unlock_bh
(
&
police_lock
);
#ifdef CONFIG_NET_ESTIMATOR
qdisc_kill_estimator
(
&
p
->
stats
);
gen_kill_estimator
(
&
p
->
bstats
,
&
p
->
rate_est
);
#endif
if
(
p
->
R_tab
)
qdisc_put_rtab
(
p
->
R_tab
);
...
...
@@ -245,7 +245,7 @@ int tcf_act_police_locate(struct rtattr *rta, struct rtattr *est,struct tc_actio
p
->
index
=
parm
->
index
?
:
tcf_police_new_index
();
#ifdef CONFIG_NET_ESTIMATOR
if
(
est
)
qdisc_new_estimator
(
&
p
->
stats
,
p
->
stats_lock
,
est
);
gen_new_estimator
(
&
p
->
bstats
,
&
p
->
rate_est
,
p
->
stats_lock
,
est
);
#endif
h
=
tcf_police_hash
(
p
->
index
);
write_lock_bh
(
&
police_lock
);
...
...
@@ -275,16 +275,6 @@ int tcf_act_police_cleanup(struct tc_action *a, int bind)
return
0
;
}
int
tcf_act_police_stats
(
struct
sk_buff
*
skb
,
struct
tc_action
*
a
)
{
struct
tcf_police
*
p
;
p
=
PRIV
(
a
);
if
(
NULL
!=
p
)
return
qdisc_copy_stats
(
skb
,
&
p
->
stats
,
p
->
stats_lock
);
return
1
;
}
int
tcf_act_police
(
struct
sk_buff
**
pskb
,
struct
tc_action
*
a
)
{
psched_time_t
now
;
...
...
@@ -302,12 +292,12 @@ int tcf_act_police(struct sk_buff **pskb, struct tc_action *a)
spin_lock
(
&
p
->
lock
);
p
->
stats
.
bytes
+=
skb
->
len
;
p
->
stats
.
packets
++
;
p
->
b
stats
.
bytes
+=
skb
->
len
;
p
->
b
stats
.
packets
++
;
#ifdef CONFIG_NET_ESTIMATOR
if
(
p
->
ewma_rate
&&
p
->
stats
.
bps
>=
p
->
ewma_rate
)
{
p
->
stats
.
overlimits
++
;
if
(
p
->
ewma_rate
&&
p
->
rate_est
.
bps
>=
p
->
ewma_rate
)
{
p
->
q
stats
.
overlimits
++
;
spin_unlock
(
&
p
->
lock
);
return
p
->
action
;
}
...
...
@@ -343,7 +333,7 @@ int tcf_act_police(struct sk_buff **pskb, struct tc_action *a)
}
}
p
->
stats
.
overlimits
++
;
p
->
q
stats
.
overlimits
++
;
spin_unlock
(
&
p
->
lock
);
return
p
->
action
;
}
...
...
@@ -400,7 +390,6 @@ static struct tc_action_ops act_police_ops = {
.
capab
=
TCA_CAP_NONE
,
.
owner
=
THIS_MODULE
,
.
act
=
tcf_act_police
,
.
get_stats
=
tcf_act_police_stats
,
.
dump
=
tcf_act_police_dump
,
.
cleanup
=
tcf_act_police_cleanup
,
.
lookup
=
tcf_hash_search
,
...
...
@@ -480,7 +469,7 @@ struct tcf_police * tcf_police_locate(struct rtattr *rta, struct rtattr *est)
p
->
action
=
parm
->
action
;
#ifdef CONFIG_NET_ESTIMATOR
if
(
est
)
qdisc_new_estimator
(
&
p
->
stats
,
p
->
stats_lock
,
est
);
gen_new_estimator
(
&
p
->
bstats
,
&
p
->
rate_est
,
p
->
stats_lock
,
est
);
#endif
h
=
tcf_police_hash
(
p
->
index
);
write_lock_bh
(
&
police_lock
);
...
...
@@ -504,12 +493,12 @@ int tcf_police(struct sk_buff *skb, struct tcf_police *p)
spin_lock
(
&
p
->
lock
);
p
->
stats
.
bytes
+=
skb
->
len
;
p
->
stats
.
packets
++
;
p
->
b
stats
.
bytes
+=
skb
->
len
;
p
->
b
stats
.
packets
++
;
#ifdef CONFIG_NET_ESTIMATOR
if
(
p
->
ewma_rate
&&
p
->
stats
.
bps
>=
p
->
ewma_rate
)
{
p
->
stats
.
overlimits
++
;
if
(
p
->
ewma_rate
&&
p
->
rate_est
.
bps
>=
p
->
ewma_rate
)
{
p
->
q
stats
.
overlimits
++
;
spin_unlock
(
&
p
->
lock
);
return
p
->
action
;
}
...
...
@@ -545,7 +534,7 @@ int tcf_police(struct sk_buff *skb, struct tcf_police *p)
}
}
p
->
stats
.
overlimits
++
;
p
->
q
stats
.
overlimits
++
;
spin_unlock
(
&
p
->
lock
);
return
p
->
action
;
}
...
...
@@ -581,9 +570,34 @@ int tcf_police_dump(struct sk_buff *skb, struct tcf_police *p)
return
-
1
;
}
int
tcf_police_dump_stats
(
struct
sk_buff
*
skb
,
struct
tcf_police
*
p
)
{
struct
gnet_dump
d
;
if
(
gnet_stats_start_copy_compat
(
skb
,
TCA_STATS2
,
TCA_STATS
,
TCA_XSTATS
,
p
->
stats_lock
,
&
d
)
<
0
)
if
(
gnet_stats_copy_basic
(
&
d
,
&
p
->
bstats
)
<
0
||
#ifdef CONFIG_NET_ESTIMATOR
gnet_stats_copy_rate_est
(
&
d
,
&
p
->
rate_est
)
<
0
||
#endif
gnet_stats_copy_queue
(
&
d
,
&
p
->
qstats
)
<
0
)
goto
errout
;
if
(
gnet_stats_finish_copy
(
&
d
)
<
0
)
goto
errout
;
return
0
;
errout:
return
-
1
;
}
EXPORT_SYMBOL
(
tcf_police
);
EXPORT_SYMBOL
(
tcf_police_destroy
);
EXPORT_SYMBOL
(
tcf_police_dump
);
EXPORT_SYMBOL
(
tcf_police_dump_stats
);
EXPORT_SYMBOL
(
tcf_police_hash
);
EXPORT_SYMBOL
(
tcf_police_ht
);
EXPORT_SYMBOL
(
tcf_police_locate
);
...
...
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