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
Kirill Smelkov
linux
Commits
913f2d79
Commit
913f2d79
authored
Dec 11, 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
fe3f2053
73d4f84f
Changes
19
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
299 additions
and
219 deletions
+299
-219
drivers/net/tg3.c
drivers/net/tg3.c
+9
-6
include/linux/sysctl.h
include/linux/sysctl.h
+3
-0
include/net/dn.h
include/net/dn.h
+4
-0
net/core/dev.c
net/core/dev.c
+2
-1
net/core/skbuff.c
net/core/skbuff.c
+1
-1
net/decnet/af_decnet.c
net/decnet/af_decnet.c
+22
-3
net/decnet/sysctl_net_decnet.c
net/decnet/sysctl_net_decnet.c
+33
-0
net/ipv4/netfilter/Kconfig
net/ipv4/netfilter/Kconfig
+4
-4
net/ipv4/netfilter/ip_conntrack_core.c
net/ipv4/netfilter/ip_conntrack_core.c
+11
-9
net/ipv4/netfilter/ip_conntrack_netlink.c
net/ipv4/netfilter/ip_conntrack_netlink.c
+5
-7
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
+2
-1
net/ipv4/tcp_output.c
net/ipv4/tcp_output.c
+124
-109
net/ipv4/tcp_vegas.c
net/ipv4/tcp_vegas.c
+4
-12
net/ipv6/esp6.c
net/ipv6/esp6.c
+1
-1
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
+6
-6
net/netfilter/Kconfig
net/netfilter/Kconfig
+2
-2
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_core.c
+3
-0
net/netfilter/nfnetlink.c
net/netfilter/nfnetlink.c
+2
-3
net/packet/af_packet.c
net/packet/af_packet.c
+61
-54
No files found.
drivers/net/tg3.c
View file @
913f2d79
...
...
@@ -68,8 +68,8 @@
#define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": "
#define DRV_MODULE_VERSION "3.4
3
"
#define DRV_MODULE_RELDATE "
Oct 24
, 2005"
#define DRV_MODULE_VERSION "3.4
4
"
#define DRV_MODULE_RELDATE "
Dec 6
, 2005"
#define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0
...
...
@@ -3565,12 +3565,15 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
if
(
!
spin_trylock
(
&
tp
->
tx_lock
))
return
NETDEV_TX_LOCKED
;
/* This is a hard error, log it. */
if
(
unlikely
(
TX_BUFFS_AVAIL
(
tp
)
<=
(
skb_shinfo
(
skb
)
->
nr_frags
+
1
)))
{
netif_stop_queue
(
dev
);
if
(
!
netif_queue_stopped
(
dev
))
{
netif_stop_queue
(
dev
);
/* This is a hard error, log it. */
printk
(
KERN_ERR
PFX
"%s: BUG! Tx Ring full when "
"queue awake!
\n
"
,
dev
->
name
);
}
spin_unlock
(
&
tp
->
tx_lock
);
printk
(
KERN_ERR
PFX
"%s: BUG! Tx Ring full when queue awake!
\n
"
,
dev
->
name
);
return
NETDEV_TX_BUSY
;
}
...
...
include/linux/sysctl.h
View file @
913f2d79
...
...
@@ -670,6 +670,9 @@ enum {
NET_DECNET_DST_GC_INTERVAL
=
9
,
NET_DECNET_CONF
=
10
,
NET_DECNET_NO_FC_MAX_CWND
=
11
,
NET_DECNET_MEM
=
12
,
NET_DECNET_RMEM
=
13
,
NET_DECNET_WMEM
=
14
,
NET_DECNET_DEBUG_LEVEL
=
255
};
...
...
include/net/dn.h
View file @
913f2d79
...
...
@@ -234,4 +234,8 @@ extern int decnet_di_count;
extern
int
decnet_dr_count
;
extern
int
decnet_no_fc_max_cwnd
;
extern
int
sysctl_decnet_mem
[
3
];
extern
int
sysctl_decnet_wmem
[
3
];
extern
int
sysctl_decnet_rmem
[
3
];
#endif
/* _NET_DN_H */
net/core/dev.c
View file @
913f2d79
...
...
@@ -1113,7 +1113,8 @@ int skb_checksum_help(struct sk_buff *skb, int inward)
void
netdev_rx_csum_fault
(
struct
net_device
*
dev
)
{
if
(
net_ratelimit
())
{
printk
(
KERN_ERR
"%s: hw csum failure.
\n
"
,
dev
->
name
);
printk
(
KERN_ERR
"%s: hw csum failure.
\n
"
,
dev
?
dev
->
name
:
"<unknown>"
);
dump_stack
();
}
}
...
...
net/core/skbuff.c
View file @
913f2d79
...
...
@@ -1725,7 +1725,7 @@ unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
* of the skb if any page alloc fails user this procedure returns -ENOMEM
*/
int
skb_append_datato_frags
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
,
int
getfrag
(
void
*
from
,
char
*
to
,
int
offset
,
int
(
*
getfrag
)
(
void
*
from
,
char
*
to
,
int
offset
,
int
len
,
int
odd
,
struct
sk_buff
*
skb
),
void
*
from
,
int
length
)
{
...
...
net/decnet/af_decnet.c
View file @
913f2d79
...
...
@@ -153,6 +153,7 @@ static struct proto_ops dn_proto_ops;
static
DEFINE_RWLOCK
(
dn_hash_lock
);
static
struct
hlist_head
dn_sk_hash
[
DN_SK_HASH_SIZE
];
static
struct
hlist_head
dn_wild_sk
;
static
atomic_t
decnet_memory_allocated
;
static
int
__dn_setsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
optlen
,
int
flags
);
static
int
__dn_getsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
__user
*
optlen
,
int
flags
);
...
...
@@ -446,10 +447,26 @@ static void dn_destruct(struct sock *sk)
dst_release
(
xchg
(
&
sk
->
sk_dst_cache
,
NULL
));
}
static
int
dn_memory_pressure
;
static
void
dn_enter_memory_pressure
(
void
)
{
if
(
!
dn_memory_pressure
)
{
dn_memory_pressure
=
1
;
}
}
static
struct
proto
dn_proto
=
{
.
name
=
"DECNET"
,
.
owner
=
THIS_MODULE
,
.
obj_size
=
sizeof
(
struct
dn_sock
),
.
name
=
"NSP"
,
.
owner
=
THIS_MODULE
,
.
enter_memory_pressure
=
dn_enter_memory_pressure
,
.
memory_pressure
=
&
dn_memory_pressure
,
.
memory_allocated
=
&
decnet_memory_allocated
,
.
sysctl_mem
=
sysctl_decnet_mem
,
.
sysctl_wmem
=
sysctl_decnet_wmem
,
.
sysctl_rmem
=
sysctl_decnet_rmem
,
.
max_header
=
DN_MAX_NSP_DATA_HEADER
+
64
,
.
obj_size
=
sizeof
(
struct
dn_sock
),
};
static
struct
sock
*
dn_alloc_sock
(
struct
socket
*
sock
,
gfp_t
gfp
)
...
...
@@ -470,6 +487,8 @@ static struct sock *dn_alloc_sock(struct socket *sock, gfp_t gfp)
sk
->
sk_family
=
PF_DECnet
;
sk
->
sk_protocol
=
0
;
sk
->
sk_allocation
=
gfp
;
sk
->
sk_sndbuf
=
sysctl_decnet_wmem
[
1
];
sk
->
sk_rcvbuf
=
sysctl_decnet_rmem
[
1
];
/* Initialization of DECnet Session Control Port */
scp
=
DN_SK
(
sk
);
...
...
net/decnet/sysctl_net_decnet.c
View file @
913f2d79
...
...
@@ -10,6 +10,7 @@
*
* Changes:
* Steve Whitehouse - C99 changes and default device handling
* Steve Whitehouse - Memory buffer settings, like the tcp ones
*
*/
#include <linux/config.h>
...
...
@@ -37,6 +38,11 @@ int decnet_dr_count = 3;
int
decnet_log_martians
=
1
;
int
decnet_no_fc_max_cwnd
=
NSP_MIN_WINDOW
;
/* Reasonable defaults, I hope, based on tcp's defaults */
int
sysctl_decnet_mem
[
3
]
=
{
768
<<
3
,
1024
<<
3
,
1536
<<
3
};
int
sysctl_decnet_wmem
[
3
]
=
{
4
*
1024
,
16
*
1024
,
128
*
1024
};
int
sysctl_decnet_rmem
[
3
]
=
{
4
*
1024
,
87380
,
87380
*
2
};
#ifdef CONFIG_SYSCTL
extern
int
decnet_dst_gc_interval
;
static
int
min_decnet_time_wait
[]
=
{
5
};
...
...
@@ -428,6 +434,33 @@ static ctl_table dn_table[] = {
.
extra1
=
&
min_decnet_no_fc_max_cwnd
,
.
extra2
=
&
max_decnet_no_fc_max_cwnd
},
{
.
ctl_name
=
NET_DECNET_MEM
,
.
procname
=
"decnet_mem"
,
.
data
=
&
sysctl_decnet_mem
,
.
maxlen
=
sizeof
(
sysctl_decnet_mem
),
.
mode
=
0644
,
.
proc_handler
=
&
proc_dointvec
,
.
strategy
=
&
sysctl_intvec
,
},
{
.
ctl_name
=
NET_DECNET_RMEM
,
.
procname
=
"decnet_rmem"
,
.
data
=
&
sysctl_decnet_rmem
,
.
maxlen
=
sizeof
(
sysctl_decnet_rmem
),
.
mode
=
0644
,
.
proc_handler
=
&
proc_dointvec
,
.
strategy
=
&
sysctl_intvec
,
},
{
.
ctl_name
=
NET_DECNET_WMEM
,
.
procname
=
"decnet_wmem"
,
.
data
=
&
sysctl_decnet_wmem
,
.
maxlen
=
sizeof
(
sysctl_decnet_wmem
),
.
mode
=
0644
,
.
proc_handler
=
&
proc_dointvec
,
.
strategy
=
&
sysctl_intvec
,
},
{
.
ctl_name
=
NET_DECNET_DEBUG_LEVEL
,
.
procname
=
"debug"
,
...
...
net/ipv4/netfilter/Kconfig
View file @
913f2d79
...
...
@@ -56,8 +56,8 @@ config IP_NF_CONNTRACK_MARK
instead of the individual packets.
config IP_NF_CONNTRACK_EVENTS
bool "Connection tracking events"
depends on IP_NF_CONNTRACK
bool "Connection tracking events
(EXPERIMENTAL)
"
depends on
EXPERIMENTAL &&
IP_NF_CONNTRACK
help
If this option is enabled, the connection tracking code will
provide a notifier chain that can be used by other kernel code
...
...
@@ -66,8 +66,8 @@ config IP_NF_CONNTRACK_EVENTS
IF unsure, say `N'.
config IP_NF_CONNTRACK_NETLINK
tristate 'Connection tracking netlink interface'
depends on IP_NF_CONNTRACK && NETFILTER_NETLINK
tristate 'Connection tracking netlink interface
(EXPERIMENTAL)
'
depends on
EXPERIMENTAL &&
IP_NF_CONNTRACK && NETFILTER_NETLINK
depends on IP_NF_CONNTRACK!=y || NETFILTER_NETLINK!=m
help
This option enables support for a netlink-based userspace interface
...
...
net/ipv4/netfilter/ip_conntrack_core.c
View file @
913f2d79
...
...
@@ -1345,6 +1345,11 @@ static int kill_all(struct ip_conntrack *i, void *data)
return
1
;
}
void
ip_conntrack_flush
(
void
)
{
ip_ct_iterate_cleanup
(
kill_all
,
NULL
);
}
static
void
free_conntrack_hash
(
struct
list_head
*
hash
,
int
vmalloced
,
int
size
)
{
if
(
vmalloced
)
...
...
@@ -1354,8 +1359,12 @@ static void free_conntrack_hash(struct list_head *hash, int vmalloced,int size)
get_order
(
sizeof
(
struct
list_head
)
*
size
));
}
void
ip_conntrack_flush
(
void
)
/* Mishearing the voices in his head, our hero wonders how he's
supposed to kill the mall. */
void
ip_conntrack_cleanup
(
void
)
{
ip_ct_attach
=
NULL
;
/* This makes sure all current packets have passed through
netfilter framework. Roll on, two-stage module
delete... */
...
...
@@ -1363,7 +1372,7 @@ void ip_conntrack_flush(void)
ip_ct_event_cache_flush
();
i_see_dead_people:
ip_c
t_iterate_cleanup
(
kill_all
,
NULL
);
ip_c
onntrack_flush
(
);
if
(
atomic_read
(
&
ip_conntrack_count
)
!=
0
)
{
schedule
();
goto
i_see_dead_people
;
...
...
@@ -1371,14 +1380,7 @@ void ip_conntrack_flush(void)
/* wait until all references to ip_conntrack_untracked are dropped */
while
(
atomic_read
(
&
ip_conntrack_untracked
.
ct_general
.
use
)
>
1
)
schedule
();
}
/* Mishearing the voices in his head, our hero wonders how he's
supposed to kill the mall. */
void
ip_conntrack_cleanup
(
void
)
{
ip_ct_attach
=
NULL
;
ip_conntrack_flush
();
kmem_cache_destroy
(
ip_conntrack_cachep
);
kmem_cache_destroy
(
ip_conntrack_expect_cachep
);
free_conntrack_hash
(
ip_conntrack_hash
,
ip_conntrack_vmalloc
,
...
...
net/ipv4/netfilter/ip_conntrack_netlink.c
View file @
913f2d79
...
...
@@ -503,7 +503,7 @@ ctnetlink_parse_tuple_ip(struct nfattr *attr, struct ip_conntrack_tuple *tuple)
}
static
const
size_t
cta_min_proto
[
CTA_PROTO_MAX
]
=
{
[
CTA_PROTO_NUM
-
1
]
=
sizeof
(
u_int
16
_t
),
[
CTA_PROTO_NUM
-
1
]
=
sizeof
(
u_int
8
_t
),
[
CTA_PROTO_SRC_PORT
-
1
]
=
sizeof
(
u_int16_t
),
[
CTA_PROTO_DST_PORT
-
1
]
=
sizeof
(
u_int16_t
),
[
CTA_PROTO_ICMP_TYPE
-
1
]
=
sizeof
(
u_int8_t
),
...
...
@@ -528,7 +528,7 @@ ctnetlink_parse_tuple_proto(struct nfattr *attr,
if
(
!
tb
[
CTA_PROTO_NUM
-
1
])
return
-
EINVAL
;
tuple
->
dst
.
protonum
=
*
(
u_int
16
_t
*
)
NFA_DATA
(
tb
[
CTA_PROTO_NUM
-
1
]);
tuple
->
dst
.
protonum
=
*
(
u_int
8
_t
*
)
NFA_DATA
(
tb
[
CTA_PROTO_NUM
-
1
]);
proto
=
ip_conntrack_proto_find_get
(
tuple
->
dst
.
protonum
);
...
...
@@ -728,11 +728,9 @@ ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
return
-
ENOENT
;
}
}
if
(
del_timer
(
&
ct
->
timeout
))
{
ip_conntrack_put
(
ct
);
if
(
del_timer
(
&
ct
->
timeout
))
ct
->
timeout
.
function
((
unsigned
long
)
ct
);
return
0
;
}
ip_conntrack_put
(
ct
);
DEBUGP
(
"leaving
\n
"
);
...
...
@@ -877,7 +875,7 @@ ctnetlink_change_status(struct ip_conntrack *ct, struct nfattr *cda[])
DEBUGP
(
"NAT status: %lu
\n
"
,
status
&
(
IPS_NAT_MASK
|
IPS_NAT_DONE_MASK
));
if
(
ip_nat_initialized
(
ct
,
hooknum
))
if
(
ip_nat_initialized
(
ct
,
HOOK2MANIP
(
hooknum
)
))
return
-
EEXIST
;
ip_nat_setup_info
(
ct
,
&
range
,
hooknum
);
...
...
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
View file @
913f2d79
...
...
@@ -341,9 +341,10 @@ static int tcp_print_conntrack(struct seq_file *s,
static
int
tcp_to_nfattr
(
struct
sk_buff
*
skb
,
struct
nfattr
*
nfa
,
const
struct
ip_conntrack
*
ct
)
{
struct
nfattr
*
nest_parms
=
NFA_NEST
(
skb
,
CTA_PROTOINFO_TCP
)
;
struct
nfattr
*
nest_parms
;
read_lock_bh
(
&
tcp_lock
);
nest_parms
=
NFA_NEST
(
skb
,
CTA_PROTOINFO_TCP
);
NFA_PUT
(
skb
,
CTA_PROTOINFO_TCP_STATE
,
sizeof
(
u_int8_t
),
&
ct
->
proto
.
tcp
.
state
);
read_unlock_bh
(
&
tcp_lock
);
...
...
net/ipv4/tcp_output.c
View file @
913f2d79
This diff is collapsed.
Click to expand it.
net/ipv4/tcp_vegas.c
View file @
913f2d79
...
...
@@ -215,14 +215,6 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
vegas
->
beg_snd_nxt
=
tp
->
snd_nxt
;
vegas
->
beg_snd_cwnd
=
tp
->
snd_cwnd
;
/* Take into account the current RTT sample too, to
* decrease the impact of delayed acks. This double counts
* this sample since we count it for the next window as well,
* but that's not too awful, since we're taking the min,
* rather than averaging.
*/
tcp_vegas_rtt_calc
(
sk
,
seq_rtt
*
1000
);
/* We do the Vegas calculations only if we got enough RTT
* samples that we can be reasonably sure that we got
* at least one RTT sample that wasn't from a delayed ACK.
...
...
@@ -333,11 +325,11 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
else
if
(
tp
->
snd_cwnd
>
tp
->
snd_cwnd_clamp
)
tp
->
snd_cwnd
=
tp
->
snd_cwnd_clamp
;
}
}
/* Wipe the slate clean for the next RTT. */
vegas
->
cntRTT
=
0
;
vegas
->
minRTT
=
0x7fffffff
;
/* Wipe the slate clean for the next RTT. */
vegas
->
cntRTT
=
0
;
vegas
->
minRTT
=
0x7fffffff
;
}
}
/* Extract info for Tcp socket info provided via netlink. */
...
...
net/ipv6/esp6.c
View file @
913f2d79
...
...
@@ -248,7 +248,7 @@ static u32 esp6_get_max_size(struct xfrm_state *x, int mtu)
if
(
esp
->
conf
.
padlen
)
mtu
=
ALIGN
(
mtu
,
esp
->
conf
.
padlen
);
return
mtu
+
x
->
props
.
header_len
+
esp
->
auth
.
icv_
full
_len
;
return
mtu
+
x
->
props
.
header_len
+
esp
->
auth
.
icv_
trunc
_len
;
}
static
void
esp6_err
(
struct
sk_buff
*
skb
,
struct
inet6_skb_parm
*
opt
,
...
...
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
View file @
913f2d79
...
...
@@ -68,8 +68,8 @@ static int icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple,
[
ICMPV6_NI_REPLY
-
128
]
=
ICMPV6_NI_REPLY
+
1
};
__u8
type
=
orig
->
dst
.
u
.
icmp
.
type
-
128
;
if
(
type
>=
sizeof
(
invmap
)
||
!
invmap
[
type
])
int
type
=
orig
->
dst
.
u
.
icmp
.
type
-
128
;
if
(
type
<
0
||
type
>=
sizeof
(
invmap
)
||
!
invmap
[
type
])
return
0
;
tuple
->
src
.
u
.
icmp
.
id
=
orig
->
src
.
u
.
icmp
.
id
;
...
...
@@ -129,12 +129,12 @@ static int icmpv6_new(struct nf_conn *conntrack,
[
ICMPV6_ECHO_REQUEST
-
128
]
=
1
,
[
ICMPV6_NI_QUERY
-
128
]
=
1
};
int
type
=
conntrack
->
tuplehash
[
0
].
tuple
.
dst
.
u
.
icmp
.
type
-
128
;
if
(
conntrack
->
tuplehash
[
0
].
tuple
.
dst
.
u
.
icmp
.
type
-
128
>=
sizeof
(
valid_new
)
||
!
valid_new
[
conntrack
->
tuplehash
[
0
].
tuple
.
dst
.
u
.
icmp
.
type
-
128
])
{
if
(
type
<
0
||
type
>=
sizeof
(
valid_new
)
||
!
valid_new
[
type
])
{
/* Can't create a new ICMPv6 `conn' with this. */
DEBUGP
(
"icmp: can't create new conn with type %u
\n
"
,
conntrack
->
tuplehash
[
0
].
tuple
.
dst
.
u
.
icmp
.
type
);
DEBUGP
(
"icmp
v6
: can't create new conn with type %u
\n
"
,
type
+
128
);
NF_CT_DUMP_TUPLE
(
&
conntrack
->
tuplehash
[
0
].
tuple
);
return
0
;
}
...
...
net/netfilter/Kconfig
View file @
913f2d79
...
...
@@ -61,8 +61,8 @@ config NF_CONNTRACK_MARK
instead of the individual packets.
config NF_CONNTRACK_EVENTS
bool "Connection tracking events"
depends on NF_CONNTRACK
bool "Connection tracking events
(EXPERIMENTAL)
"
depends on
EXPERIMENTAL &&
NF_CONNTRACK
help
If this option is enabled, the connection tracking code will
provide a notifier chain that can be used by other kernel code
...
...
net/netfilter/nf_conntrack_core.c
View file @
913f2d79
...
...
@@ -1383,6 +1383,9 @@ void nf_conntrack_cleanup(void)
schedule
();
goto
i_see_dead_people
;
}
/* wait until all references to nf_conntrack_untracked are dropped */
while
(
atomic_read
(
&
nf_conntrack_untracked
.
ct_general
.
use
)
>
1
)
schedule
();
for
(
i
=
0
;
i
<
NF_CT_F_NUM
;
i
++
)
{
if
(
nf_ct_cache
[
i
].
use
==
0
)
...
...
net/netfilter/nfnetlink.c
View file @
913f2d79
...
...
@@ -162,7 +162,7 @@ nfnetlink_check_attributes(struct nfnetlink_subsystem *subsys,
return
-
EINVAL
;
}
min_len
=
NLMSG_
ALIGN
(
sizeof
(
struct
nfgenmsg
));
min_len
=
NLMSG_
SPACE
(
sizeof
(
struct
nfgenmsg
));
if
(
unlikely
(
nlh
->
nlmsg_len
<
min_len
))
return
-
EINVAL
;
...
...
@@ -236,8 +236,7 @@ static inline int nfnetlink_rcv_msg(struct sk_buff *skb,
}
/* All the messages must at least contain nfgenmsg */
if
(
nlh
->
nlmsg_len
<
NLMSG_LENGTH
(
NLMSG_ALIGN
(
sizeof
(
struct
nfgenmsg
))))
{
if
(
nlh
->
nlmsg_len
<
NLMSG_SPACE
(
sizeof
(
struct
nfgenmsg
)))
{
DEBUGP
(
"received message was too short
\n
"
);
return
0
;
}
...
...
net/packet/af_packet.c
View file @
913f2d79
...
...
@@ -1587,23 +1587,47 @@ static inline struct page *pg_vec_endpage(char *one_pg_vec, unsigned int order)
return
virt_to_page
(
one_pg_vec
+
(
PAGE_SIZE
<<
order
)
-
1
);
}
static
void
free_pg_vec
(
char
**
pg_vec
,
unsigned
order
,
unsigned
len
)
static
void
free_pg_vec
(
char
**
pg_vec
,
unsigned
int
order
,
unsigned
int
len
)
{
int
i
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
if
(
pg_vec
[
i
])
{
struct
page
*
page
,
*
pend
;
pend
=
pg_vec_endpage
(
pg_vec
[
i
],
order
);
for
(
page
=
virt_to_page
(
pg_vec
[
i
]);
page
<=
pend
;
page
++
)
ClearPageReserved
(
page
);
free_pages
((
unsigned
long
)
pg_vec
[
i
],
order
);
}
for
(
i
=
0
;
i
<
len
;
i
++
)
{
if
(
likely
(
pg_vec
[
i
]))
free_pages
((
unsigned
long
)
pg_vec
[
i
],
order
);
}
kfree
(
pg_vec
);
}
static
inline
char
*
alloc_one_pg_vec_page
(
unsigned
long
order
)
{
return
(
char
*
)
__get_free_pages
(
GFP_KERNEL
|
__GFP_COMP
|
__GFP_ZERO
,
order
);
}
static
char
**
alloc_pg_vec
(
struct
tpacket_req
*
req
,
int
order
)
{
unsigned
int
block_nr
=
req
->
tp_block_nr
;
char
**
pg_vec
;
int
i
;
pg_vec
=
kzalloc
(
block_nr
*
sizeof
(
char
*
),
GFP_KERNEL
);
if
(
unlikely
(
!
pg_vec
))
goto
out
;
for
(
i
=
0
;
i
<
block_nr
;
i
++
)
{
pg_vec
[
i
]
=
alloc_one_pg_vec_page
(
order
);
if
(
unlikely
(
!
pg_vec
[
i
]))
goto
out_free_pgvec
;
}
out:
return
pg_vec
;
out_free_pgvec:
free_pg_vec
(
pg_vec
,
order
,
block_nr
);
pg_vec
=
NULL
;
goto
out
;
}
static
int
packet_set_ring
(
struct
sock
*
sk
,
struct
tpacket_req
*
req
,
int
closing
)
{
...
...
@@ -1617,64 +1641,46 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
/* Sanity tests and some calculations */
if
(
po
->
pg_vec
)
if
(
unlikely
(
po
->
pg_vec
)
)
return
-
EBUSY
;
if
(
(
int
)
req
->
tp_block_size
<=
0
)
if
(
unlikely
((
int
)
req
->
tp_block_size
<=
0
)
)
return
-
EINVAL
;
if
(
req
->
tp_block_size
&
(
PAGE_SIZE
-
1
))
if
(
unlikely
(
req
->
tp_block_size
&
(
PAGE_SIZE
-
1
)
))
return
-
EINVAL
;
if
(
req
->
tp_frame_size
<
TPACKET_HDRLEN
)
if
(
unlikely
(
req
->
tp_frame_size
<
TPACKET_HDRLEN
)
)
return
-
EINVAL
;
if
(
req
->
tp_frame_size
&
(
TPACKET_ALIGNMENT
-
1
))
if
(
unlikely
(
req
->
tp_frame_size
&
(
TPACKET_ALIGNMENT
-
1
)
))
return
-
EINVAL
;
po
->
frames_per_block
=
req
->
tp_block_size
/
req
->
tp_frame_size
;
if
(
po
->
frames_per_block
<=
0
)
if
(
unlikely
(
po
->
frames_per_block
<=
0
)
)
return
-
EINVAL
;
if
(
po
->
frames_per_block
*
req
->
tp_block_nr
!=
req
->
tp_frame_nr
)
if
(
unlikely
((
po
->
frames_per_block
*
req
->
tp_block_nr
)
!=
req
->
tp_frame_nr
))
return
-
EINVAL
;
/* OK! */
/* Allocate page vector */
while
((
PAGE_SIZE
<<
order
)
<
req
->
tp_block_size
)
order
++
;
err
=
-
ENOMEM
;
pg_vec
=
kmalloc
(
req
->
tp_block_nr
*
sizeof
(
char
*
),
GFP_KERNEL
);
if
(
pg_vec
==
NULL
)
order
=
get_order
(
req
->
tp_block_size
);
pg_vec
=
alloc_pg_vec
(
req
,
order
);
if
(
unlikely
(
!
pg_vec
)
)
goto
out
;
memset
(
pg_vec
,
0
,
req
->
tp_block_nr
*
sizeof
(
char
**
));
for
(
i
=
0
;
i
<
req
->
tp_block_nr
;
i
++
)
{
struct
page
*
page
,
*
pend
;
pg_vec
[
i
]
=
(
char
*
)
__get_free_pages
(
GFP_KERNEL
,
order
);
if
(
!
pg_vec
[
i
])
goto
out_free_pgvec
;
pend
=
pg_vec_endpage
(
pg_vec
[
i
],
order
);
for
(
page
=
virt_to_page
(
pg_vec
[
i
]);
page
<=
pend
;
page
++
)
SetPageReserved
(
page
);
}
/* Page vector is allocated */
l
=
0
;
for
(
i
=
0
;
i
<
req
->
tp_block_nr
;
i
++
)
{
for
(
i
=
0
;
i
<
req
->
tp_block_nr
;
i
++
)
{
char
*
ptr
=
pg_vec
[
i
];
struct
tpacket_hdr
*
header
;
int
k
;
for
(
k
=
0
;
k
<
po
->
frames_per_block
;
k
++
)
{
header
=
(
struct
tpacket_hdr
*
)
ptr
;
for
(
k
=
0
;
k
<
po
->
frames_per_block
;
k
++
)
{
header
=
(
struct
tpacket_hdr
*
)
ptr
;
header
->
tp_status
=
TP_STATUS_KERNEL
;
ptr
+=
req
->
tp_frame_size
;
}
}
/* Done */
}
else
{
if
(
req
->
tp_frame_nr
)
if
(
unlikely
(
req
->
tp_frame_nr
)
)
return
-
EINVAL
;
}
...
...
@@ -1701,7 +1707,7 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
spin_lock_bh
(
&
sk
->
sk_receive_queue
.
lock
);
pg_vec
=
XC
(
po
->
pg_vec
,
pg_vec
);
po
->
frame_max
=
req
->
tp_frame_nr
-
1
;
po
->
frame_max
=
(
req
->
tp_frame_nr
-
1
)
;
po
->
head
=
0
;
po
->
frame_size
=
req
->
tp_frame_size
;
spin_unlock_bh
(
&
sk
->
sk_receive_queue
.
lock
);
...
...
@@ -1728,7 +1734,6 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
release_sock
(
sk
);
out_free_pgvec:
if
(
pg_vec
)
free_pg_vec
(
pg_vec
,
order
,
req
->
tp_block_nr
);
out:
...
...
@@ -1755,17 +1760,19 @@ static int packet_mmap(struct file *file, struct socket *sock, struct vm_area_st
if
(
size
!=
po
->
pg_vec_len
*
po
->
pg_vec_pages
*
PAGE_SIZE
)
goto
out
;
atomic_inc
(
&
po
->
mapped
);
start
=
vma
->
vm_start
;
err
=
-
EAGAIN
;
for
(
i
=
0
;
i
<
po
->
pg_vec_len
;
i
++
)
{
if
(
remap_pfn_range
(
vma
,
start
,
__pa
(
po
->
pg_vec
[
i
])
>>
PAGE_SHIFT
,
po
->
pg_vec_pages
*
PAGE_SIZE
,
vma
->
vm_page_prot
))
goto
out
;
start
+=
po
->
pg_vec_pages
*
PAGE_SIZE
;
for
(
i
=
0
;
i
<
po
->
pg_vec_len
;
i
++
)
{
struct
page
*
page
=
virt_to_page
(
po
->
pg_vec
[
i
]);
int
pg_num
;
for
(
pg_num
=
0
;
pg_num
<
po
->
pg_vec_pages
;
pg_num
++
,
page
++
)
{
err
=
vm_insert_page
(
vma
,
start
,
page
);
if
(
unlikely
(
err
))
goto
out
;
start
+=
PAGE_SIZE
;
}
}
atomic_inc
(
&
po
->
mapped
);
vma
->
vm_ops
=
&
packet_mmap_ops
;
err
=
0
;
...
...
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