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
60279944
Commit
60279944
authored
Nov 17, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
parents
d0fa7e9f
4a59a810
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
31 additions
and
52 deletions
+31
-52
net/ipv4/ip_fragment.c
net/ipv4/ip_fragment.c
+14
-26
net/ipv6/reassembly.c
net/ipv6/reassembly.c
+16
-25
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_core.c
+1
-1
No files found.
net/ipv4/ip_fragment.c
View file @
60279944
...
@@ -71,7 +71,7 @@ struct ipfrag_skb_cb
...
@@ -71,7 +71,7 @@ struct ipfrag_skb_cb
/* Describe an entry in the "incomplete datagrams" queue. */
/* Describe an entry in the "incomplete datagrams" queue. */
struct
ipq
{
struct
ipq
{
struct
ipq
*
next
;
/* linked list pointers */
struct
hlist_node
list
;
struct
list_head
lru_list
;
/* lru list member */
struct
list_head
lru_list
;
/* lru list member */
u32
user
;
u32
user
;
u32
saddr
;
u32
saddr
;
...
@@ -89,7 +89,6 @@ struct ipq {
...
@@ -89,7 +89,6 @@ struct ipq {
spinlock_t
lock
;
spinlock_t
lock
;
atomic_t
refcnt
;
atomic_t
refcnt
;
struct
timer_list
timer
;
/* when will this queue expire? */
struct
timer_list
timer
;
/* when will this queue expire? */
struct
ipq
**
pprev
;
int
iif
;
int
iif
;
struct
timeval
stamp
;
struct
timeval
stamp
;
};
};
...
@@ -99,7 +98,7 @@ struct ipq {
...
@@ -99,7 +98,7 @@ struct ipq {
#define IPQ_HASHSZ 64
#define IPQ_HASHSZ 64
/* Per-bucket lock is easy to add now. */
/* Per-bucket lock is easy to add now. */
static
struct
ipq
*
ipq_hash
[
IPQ_HASHSZ
];
static
struct
hlist_head
ipq_hash
[
IPQ_HASHSZ
];
static
DEFINE_RWLOCK
(
ipfrag_lock
);
static
DEFINE_RWLOCK
(
ipfrag_lock
);
static
u32
ipfrag_hash_rnd
;
static
u32
ipfrag_hash_rnd
;
static
LIST_HEAD
(
ipq_lru_list
);
static
LIST_HEAD
(
ipq_lru_list
);
...
@@ -107,9 +106,7 @@ int ip_frag_nqueues = 0;
...
@@ -107,9 +106,7 @@ int ip_frag_nqueues = 0;
static
__inline__
void
__ipq_unlink
(
struct
ipq
*
qp
)
static
__inline__
void
__ipq_unlink
(
struct
ipq
*
qp
)
{
{
if
(
qp
->
next
)
hlist_del
(
&
qp
->
list
);
qp
->
next
->
pprev
=
qp
->
pprev
;
*
qp
->
pprev
=
qp
->
next
;
list_del
(
&
qp
->
lru_list
);
list_del
(
&
qp
->
lru_list
);
ip_frag_nqueues
--
;
ip_frag_nqueues
--
;
}
}
...
@@ -139,27 +136,18 @@ static void ipfrag_secret_rebuild(unsigned long dummy)
...
@@ -139,27 +136,18 @@ static void ipfrag_secret_rebuild(unsigned long dummy)
get_random_bytes
(
&
ipfrag_hash_rnd
,
sizeof
(
u32
));
get_random_bytes
(
&
ipfrag_hash_rnd
,
sizeof
(
u32
));
for
(
i
=
0
;
i
<
IPQ_HASHSZ
;
i
++
)
{
for
(
i
=
0
;
i
<
IPQ_HASHSZ
;
i
++
)
{
struct
ipq
*
q
;
struct
ipq
*
q
;
struct
hlist_node
*
p
,
*
n
;
q
=
ipq_hash
[
i
];
hlist_for_each_entry_safe
(
q
,
p
,
n
,
&
ipq_hash
[
i
],
list
)
{
while
(
q
)
{
struct
ipq
*
next
=
q
->
next
;
unsigned
int
hval
=
ipqhashfn
(
q
->
id
,
q
->
saddr
,
unsigned
int
hval
=
ipqhashfn
(
q
->
id
,
q
->
saddr
,
q
->
daddr
,
q
->
protocol
);
q
->
daddr
,
q
->
protocol
);
if
(
hval
!=
i
)
{
if
(
hval
!=
i
)
{
/* Unlink. */
hlist_del
(
&
q
->
list
);
if
(
q
->
next
)
q
->
next
->
pprev
=
q
->
pprev
;
*
q
->
pprev
=
q
->
next
;
/* Relink to new hash chain. */
/* Relink to new hash chain. */
if
((
q
->
next
=
ipq_hash
[
hval
])
!=
NULL
)
hlist_add_head
(
&
q
->
list
,
&
ipq_hash
[
hval
]);
q
->
next
->
pprev
=
&
q
->
next
;
ipq_hash
[
hval
]
=
q
;
q
->
pprev
=
&
ipq_hash
[
hval
];
}
}
q
=
next
;
}
}
}
}
write_unlock
(
&
ipfrag_lock
);
write_unlock
(
&
ipfrag_lock
);
...
@@ -310,14 +298,16 @@ static void ip_expire(unsigned long arg)
...
@@ -310,14 +298,16 @@ static void ip_expire(unsigned long arg)
static
struct
ipq
*
ip_frag_intern
(
unsigned
int
hash
,
struct
ipq
*
qp_in
)
static
struct
ipq
*
ip_frag_intern
(
unsigned
int
hash
,
struct
ipq
*
qp_in
)
{
{
struct
ipq
*
qp
;
struct
ipq
*
qp
;
#ifdef CONFIG_SMP
struct
hlist_node
*
n
;
#endif
write_lock
(
&
ipfrag_lock
);
write_lock
(
&
ipfrag_lock
);
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
/* With SMP race we have to recheck hash table, because
/* With SMP race we have to recheck hash table, because
* such entry could be created on other cpu, while we
* such entry could be created on other cpu, while we
* promoted read lock to write lock.
* promoted read lock to write lock.
*/
*/
for
(
qp
=
ipq_hash
[
hash
];
qp
;
qp
=
qp
->
nex
t
)
{
hlist_for_each_entry
(
qp
,
n
,
&
ipq_hash
[
hash
],
lis
t
)
{
if
(
qp
->
id
==
qp_in
->
id
&&
if
(
qp
->
id
==
qp_in
->
id
&&
qp
->
saddr
==
qp_in
->
saddr
&&
qp
->
saddr
==
qp_in
->
saddr
&&
qp
->
daddr
==
qp_in
->
daddr
&&
qp
->
daddr
==
qp_in
->
daddr
&&
...
@@ -337,10 +327,7 @@ static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in)
...
@@ -337,10 +327,7 @@ static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in)
atomic_inc
(
&
qp
->
refcnt
);
atomic_inc
(
&
qp
->
refcnt
);
atomic_inc
(
&
qp
->
refcnt
);
atomic_inc
(
&
qp
->
refcnt
);
if
((
qp
->
next
=
ipq_hash
[
hash
])
!=
NULL
)
hlist_add_head
(
&
qp
->
list
,
&
ipq_hash
[
hash
]);
qp
->
next
->
pprev
=
&
qp
->
next
;
ipq_hash
[
hash
]
=
qp
;
qp
->
pprev
=
&
ipq_hash
[
hash
];
INIT_LIST_HEAD
(
&
qp
->
lru_list
);
INIT_LIST_HEAD
(
&
qp
->
lru_list
);
list_add_tail
(
&
qp
->
lru_list
,
&
ipq_lru_list
);
list_add_tail
(
&
qp
->
lru_list
,
&
ipq_lru_list
);
ip_frag_nqueues
++
;
ip_frag_nqueues
++
;
...
@@ -392,9 +379,10 @@ static inline struct ipq *ip_find(struct iphdr *iph, u32 user)
...
@@ -392,9 +379,10 @@ static inline struct ipq *ip_find(struct iphdr *iph, u32 user)
__u8
protocol
=
iph
->
protocol
;
__u8
protocol
=
iph
->
protocol
;
unsigned
int
hash
=
ipqhashfn
(
id
,
saddr
,
daddr
,
protocol
);
unsigned
int
hash
=
ipqhashfn
(
id
,
saddr
,
daddr
,
protocol
);
struct
ipq
*
qp
;
struct
ipq
*
qp
;
struct
hlist_node
*
n
;
read_lock
(
&
ipfrag_lock
);
read_lock
(
&
ipfrag_lock
);
for
(
qp
=
ipq_hash
[
hash
];
qp
;
qp
=
qp
->
nex
t
)
{
hlist_for_each_entry
(
qp
,
n
,
&
ipq_hash
[
hash
],
lis
t
)
{
if
(
qp
->
id
==
id
&&
if
(
qp
->
id
==
id
&&
qp
->
saddr
==
saddr
&&
qp
->
saddr
==
saddr
&&
qp
->
daddr
==
daddr
&&
qp
->
daddr
==
daddr
&&
...
...
net/ipv6/reassembly.c
View file @
60279944
...
@@ -74,7 +74,7 @@ struct ip6frag_skb_cb
...
@@ -74,7 +74,7 @@ struct ip6frag_skb_cb
struct
frag_queue
struct
frag_queue
{
{
struct
frag_queue
*
nex
t
;
struct
hlist_node
lis
t
;
struct
list_head
lru_list
;
/* lru list member */
struct
list_head
lru_list
;
/* lru list member */
__u32
id
;
/* fragment id */
__u32
id
;
/* fragment id */
...
@@ -95,14 +95,13 @@ struct frag_queue
...
@@ -95,14 +95,13 @@ struct frag_queue
#define FIRST_IN 2
#define FIRST_IN 2
#define LAST_IN 1
#define LAST_IN 1
__u16
nhoffset
;
__u16
nhoffset
;
struct
frag_queue
**
pprev
;
};
};
/* Hash table. */
/* Hash table. */
#define IP6Q_HASHSZ 64
#define IP6Q_HASHSZ 64
static
struct
frag_queue
*
ip6_frag_hash
[
IP6Q_HASHSZ
];
static
struct
hlist_head
ip6_frag_hash
[
IP6Q_HASHSZ
];
static
DEFINE_RWLOCK
(
ip6_frag_lock
);
static
DEFINE_RWLOCK
(
ip6_frag_lock
);
static
u32
ip6_frag_hash_rnd
;
static
u32
ip6_frag_hash_rnd
;
static
LIST_HEAD
(
ip6_frag_lru_list
);
static
LIST_HEAD
(
ip6_frag_lru_list
);
...
@@ -110,9 +109,7 @@ int ip6_frag_nqueues = 0;
...
@@ -110,9 +109,7 @@ int ip6_frag_nqueues = 0;
static
__inline__
void
__fq_unlink
(
struct
frag_queue
*
fq
)
static
__inline__
void
__fq_unlink
(
struct
frag_queue
*
fq
)
{
{
if
(
fq
->
next
)
hlist_del
(
&
fq
->
list
);
fq
->
next
->
pprev
=
fq
->
pprev
;
*
fq
->
pprev
=
fq
->
next
;
list_del
(
&
fq
->
lru_list
);
list_del
(
&
fq
->
lru_list
);
ip6_frag_nqueues
--
;
ip6_frag_nqueues
--
;
}
}
...
@@ -163,28 +160,21 @@ static void ip6_frag_secret_rebuild(unsigned long dummy)
...
@@ -163,28 +160,21 @@ static void ip6_frag_secret_rebuild(unsigned long dummy)
get_random_bytes
(
&
ip6_frag_hash_rnd
,
sizeof
(
u32
));
get_random_bytes
(
&
ip6_frag_hash_rnd
,
sizeof
(
u32
));
for
(
i
=
0
;
i
<
IP6Q_HASHSZ
;
i
++
)
{
for
(
i
=
0
;
i
<
IP6Q_HASHSZ
;
i
++
)
{
struct
frag_queue
*
q
;
struct
frag_queue
*
q
;
struct
hlist_node
*
p
,
*
n
;
q
=
ip6_frag_hash
[
i
];
hlist_for_each_entry_safe
(
q
,
p
,
n
,
&
ip6_frag_hash
[
i
],
list
)
{
while
(
q
)
{
struct
frag_queue
*
next
=
q
->
next
;
unsigned
int
hval
=
ip6qhashfn
(
q
->
id
,
unsigned
int
hval
=
ip6qhashfn
(
q
->
id
,
&
q
->
saddr
,
&
q
->
saddr
,
&
q
->
daddr
);
&
q
->
daddr
);
if
(
hval
!=
i
)
{
if
(
hval
!=
i
)
{
/* Unlink. */
hlist_del
(
&
q
->
list
);
if
(
q
->
next
)
q
->
next
->
pprev
=
q
->
pprev
;
*
q
->
pprev
=
q
->
next
;
/* Relink to new hash chain. */
/* Relink to new hash chain. */
if
((
q
->
next
=
ip6_frag_hash
[
hval
])
!=
NULL
)
hlist_add_head
(
&
q
->
list
,
q
->
next
->
pprev
=
&
q
->
next
;
&
ip6_frag_hash
[
hval
]);
ip6_frag_hash
[
hval
]
=
q
;
q
->
pprev
=
&
ip6_frag_hash
[
hval
];
}
q
=
next
;
}
}
}
}
}
write_unlock
(
&
ip6_frag_lock
);
write_unlock
(
&
ip6_frag_lock
);
...
@@ -337,10 +327,13 @@ static struct frag_queue *ip6_frag_intern(unsigned int hash,
...
@@ -337,10 +327,13 @@ static struct frag_queue *ip6_frag_intern(unsigned int hash,
struct
frag_queue
*
fq_in
)
struct
frag_queue
*
fq_in
)
{
{
struct
frag_queue
*
fq
;
struct
frag_queue
*
fq
;
#ifdef CONFIG_SMP
struct
hlist_node
*
n
;
#endif
write_lock
(
&
ip6_frag_lock
);
write_lock
(
&
ip6_frag_lock
);
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
for
(
fq
=
ip6_frag_hash
[
hash
];
fq
;
fq
=
fq
->
nex
t
)
{
hlist_for_each_entry
(
fq
,
n
,
&
ip6_frag_hash
[
hash
],
lis
t
)
{
if
(
fq
->
id
==
fq_in
->
id
&&
if
(
fq
->
id
==
fq_in
->
id
&&
ipv6_addr_equal
(
&
fq_in
->
saddr
,
&
fq
->
saddr
)
&&
ipv6_addr_equal
(
&
fq_in
->
saddr
,
&
fq
->
saddr
)
&&
ipv6_addr_equal
(
&
fq_in
->
daddr
,
&
fq
->
daddr
))
{
ipv6_addr_equal
(
&
fq_in
->
daddr
,
&
fq
->
daddr
))
{
...
@@ -358,10 +351,7 @@ static struct frag_queue *ip6_frag_intern(unsigned int hash,
...
@@ -358,10 +351,7 @@ static struct frag_queue *ip6_frag_intern(unsigned int hash,
atomic_inc
(
&
fq
->
refcnt
);
atomic_inc
(
&
fq
->
refcnt
);
atomic_inc
(
&
fq
->
refcnt
);
atomic_inc
(
&
fq
->
refcnt
);
if
((
fq
->
next
=
ip6_frag_hash
[
hash
])
!=
NULL
)
hlist_add_head
(
&
fq
->
list
,
&
ip6_frag_hash
[
hash
]);
fq
->
next
->
pprev
=
&
fq
->
next
;
ip6_frag_hash
[
hash
]
=
fq
;
fq
->
pprev
=
&
ip6_frag_hash
[
hash
];
INIT_LIST_HEAD
(
&
fq
->
lru_list
);
INIT_LIST_HEAD
(
&
fq
->
lru_list
);
list_add_tail
(
&
fq
->
lru_list
,
&
ip6_frag_lru_list
);
list_add_tail
(
&
fq
->
lru_list
,
&
ip6_frag_lru_list
);
ip6_frag_nqueues
++
;
ip6_frag_nqueues
++
;
...
@@ -401,10 +391,11 @@ static __inline__ struct frag_queue *
...
@@ -401,10 +391,11 @@ static __inline__ struct frag_queue *
fq_find
(
u32
id
,
struct
in6_addr
*
src
,
struct
in6_addr
*
dst
)
fq_find
(
u32
id
,
struct
in6_addr
*
src
,
struct
in6_addr
*
dst
)
{
{
struct
frag_queue
*
fq
;
struct
frag_queue
*
fq
;
struct
hlist_node
*
n
;
unsigned
int
hash
=
ip6qhashfn
(
id
,
src
,
dst
);
unsigned
int
hash
=
ip6qhashfn
(
id
,
src
,
dst
);
read_lock
(
&
ip6_frag_lock
);
read_lock
(
&
ip6_frag_lock
);
for
(
fq
=
ip6_frag_hash
[
hash
];
fq
;
fq
=
fq
->
nex
t
)
{
hlist_for_each_entry
(
fq
,
n
,
&
ip6_frag_hash
[
hash
],
lis
t
)
{
if
(
fq
->
id
==
id
&&
if
(
fq
->
id
==
id
&&
ipv6_addr_equal
(
src
,
&
fq
->
saddr
)
&&
ipv6_addr_equal
(
src
,
&
fq
->
saddr
)
&&
ipv6_addr_equal
(
dst
,
&
fq
->
daddr
))
{
ipv6_addr_equal
(
dst
,
&
fq
->
daddr
))
{
...
...
net/netfilter/nf_conntrack_core.c
View file @
60279944
...
@@ -387,7 +387,7 @@ nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,
...
@@ -387,7 +387,7 @@ nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,
static
void
nf_ct_unlink_expect
(
struct
nf_conntrack_expect
*
exp
)
static
void
nf_ct_unlink_expect
(
struct
nf_conntrack_expect
*
exp
)
{
{
ASSERT_WRITE_LOCK
(
&
nf_conntrack_lock
);
ASSERT_WRITE_LOCK
(
&
nf_conntrack_lock
);
NF_CT_ASSERT
(
!
timer_pending
(
&
exp
_
timeout
));
NF_CT_ASSERT
(
!
timer_pending
(
&
exp
->
timeout
));
list_del
(
&
exp
->
list
);
list_del
(
&
exp
->
list
);
NF_CT_STAT_INC
(
expect_delete
);
NF_CT_STAT_INC
(
expect_delete
);
exp
->
master
->
expecting
--
;
exp
->
master
->
expecting
--
;
...
...
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