Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
985834a1
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
985834a1
编写于
11月 10, 2005
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
上级
b8cbfa69
f3b84ec2
变更
24
隐藏空白更改
内联
并排
Showing
24 changed file
with
240 addition
and
149 deletion
+240
-149
Documentation/networking/dccp.txt
Documentation/networking/dccp.txt
+56
-0
MAINTAINERS
MAINTAINERS
+1
-1
drivers/atm/horizon.c
drivers/atm/horizon.c
+2
-2
drivers/net/bnx2.c
drivers/net/bnx2.c
+5
-11
include/linux/if_ether.h
include/linux/if_ether.h
+3
-1
include/linux/netdevice.h
include/linux/netdevice.h
+7
-0
include/linux/skbuff.h
include/linux/skbuff.h
+25
-2
include/net/tcp.h
include/net/tcp.h
+2
-1
net/core/datagram.c
net/core/datagram.c
+18
-3
net/core/dev.c
net/core/dev.c
+12
-0
net/core/netpoll.c
net/core/netpoll.c
+11
-7
net/ipv4/icmp.c
net/ipv4/icmp.c
+3
-3
net/ipv4/igmp.c
net/ipv4/igmp.c
+14
-5
net/ipv4/ip_gre.c
net/ipv4/ip_gre.c
+8
-7
net/ipv4/netfilter/ip_conntrack_proto_icmp.c
net/ipv4/netfilter/ip_conntrack_proto_icmp.c
+4
-7
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_ipv4.c
+9
-15
net/ipv4/udp.c
net/ipv4/udp.c
+2
-5
net/ipv6/icmp.c
net/ipv6/icmp.c
+10
-11
net/ipv6/raw.c
net/ipv6/raw.c
+16
-26
net/ipv6/tcp_ipv6.c
net/ipv6/tcp_ipv6.c
+9
-11
net/ipv6/udp.c
net/ipv6/udp.c
+9
-16
net/rxrpc/transport.c
net/rxrpc/transport.c
+6
-9
net/sunrpc/socklib.c
net/sunrpc/socklib.c
+5
-0
net/sunrpc/svcsock.c
net/sunrpc/svcsock.c
+3
-6
未找到文件。
Documentation/networking/dccp.txt
0 → 100644
浏览文件 @
985834a1
DCCP protocol
============
Last updated: 10 November 2005
Contents
========
- Introduction
- Missing features
- Socket options
- Notes
Introduction
============
Datagram Congestion Control Protocol (DCCP) is an unreliable, connection
based protocol designed to solve issues present in UDP and TCP particularly
for real time and multimedia traffic.
It has a base protocol and pluggable congestion control IDs (CCIDs).
It is at draft RFC status and the homepage for DCCP as a protocol is at:
http://www.icir.org/kohler/dcp/
Missing features
================
The DCCP implementation does not currently have all the features that are in
the draft RFC.
In particular the following are missing:
- CCID2 support
- feature negotiation
When testing against other implementations it appears that elapsed time
options are not coded compliant to the specification.
Socket options
==============
DCCP_SOCKOPT_PACKET_SIZE is used for CCID3 to set default packet size for
calculations.
DCCP_SOCKOPT_SERVICE sets the service. This is compulsory as per the
specification. If you don't set it you will get EPROTO.
Notes
=====
SELinux does not yet have support for DCCP. You will need to turn it off or
else you will get EACCES.
DCCP does not travel through NAT successfully at present. This is because
the checksum covers the psuedo-header as per TCP and UDP. It should be
relatively trivial to add Linux NAT support for DCCP.
MAINTAINERS
浏览文件 @
985834a1
...
...
@@ -707,7 +707,7 @@ DCCP PROTOCOL
P: Arnaldo Carvalho de Melo
M: acme@mandriva.com
L: dccp@vger.kernel.org
W: http://
www.wlug.org.nz
/DCCP
W: http://
linux-net.osdl.org/index.php
/DCCP
S: Maintained
DECnet NETWORK LAYER
...
...
drivers/atm/horizon.c
浏览文件 @
985834a1
...
...
@@ -1511,8 +1511,8 @@ static inline short setup_idle_tx_channel (hrz_dev * dev, hrz_vcc * vcc) {
// a.k.a. prepare the channel and remember that we have done so.
tx_ch_desc
*
tx_desc
=
&
memmap
->
tx_descs
[
tx_channel
];
u
16
rd_ptr
;
u
16
wr_ptr
;
u
32
rd_ptr
;
u
32
wr_ptr
;
u16
channel
=
vcc
->
channel
;
unsigned
long
flags
;
...
...
drivers/net/bnx2.c
浏览文件 @
985834a1
...
...
@@ -2707,7 +2707,7 @@ bnx2_init_nvram(struct bnx2 *bp)
if
(
j
==
entry_count
)
{
bp
->
flash_info
=
NULL
;
printk
(
KERN_ALERT
"Unknown flash/EEPROM type.
\n
"
);
printk
(
KERN_ALERT
PFX
"Unknown flash/EEPROM type.
\n
"
);
rc
=
-
ENODEV
;
}
...
...
@@ -3903,6 +3903,8 @@ bnx2_test_loopback(struct bnx2 *bp)
pkt_size
=
1514
;
skb
=
dev_alloc_skb
(
pkt_size
);
if
(
!
skb
)
return
-
ENOMEM
;
packet
=
skb_put
(
skb
,
pkt_size
);
memcpy
(
packet
,
bp
->
mac_addr
,
6
);
memset
(
packet
+
6
,
0x0
,
8
);
...
...
@@ -4798,11 +4800,7 @@ bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
struct
bnx2
*
bp
=
dev
->
priv
;
int
rc
;
if
(
eeprom
->
offset
>
bp
->
flash_info
->
total_size
)
return
-
EINVAL
;
if
((
eeprom
->
offset
+
eeprom
->
len
)
>
bp
->
flash_info
->
total_size
)
eeprom
->
len
=
bp
->
flash_info
->
total_size
-
eeprom
->
offset
;
/* parameters already validated in ethtool_get_eeprom */
rc
=
bnx2_nvram_read
(
bp
,
eeprom
->
offset
,
eebuf
,
eeprom
->
len
);
...
...
@@ -4816,11 +4814,7 @@ bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
struct
bnx2
*
bp
=
dev
->
priv
;
int
rc
;
if
(
eeprom
->
offset
>
bp
->
flash_info
->
total_size
)
return
-
EINVAL
;
if
((
eeprom
->
offset
+
eeprom
->
len
)
>
bp
->
flash_info
->
total_size
)
eeprom
->
len
=
bp
->
flash_info
->
total_size
-
eeprom
->
offset
;
/* parameters already validated in ethtool_set_eeprom */
rc
=
bnx2_nvram_write
(
bp
,
eeprom
->
offset
,
eebuf
,
eeprom
->
len
);
...
...
include/linux/if_ether.h
浏览文件 @
985834a1
...
...
@@ -21,6 +21,8 @@
#ifndef _LINUX_IF_ETHER_H
#define _LINUX_IF_ETHER_H
#include <linux/types.h>
/*
* IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble
* and FCS/CRC (frame check sequence).
...
...
@@ -100,7 +102,7 @@
struct
ethhdr
{
unsigned
char
h_dest
[
ETH_ALEN
];
/* destination eth addr */
unsigned
char
h_source
[
ETH_ALEN
];
/* source ether addr */
unsigned
short
h_proto
;
/* packet type ID field */
__be16
h_proto
;
/* packet type ID field */
}
__attribute__
((
packed
));
#ifdef __KERNEL__
...
...
include/linux/netdevice.h
浏览文件 @
985834a1
...
...
@@ -927,6 +927,13 @@ extern int netdev_max_backlog;
extern
int
weight_p
;
extern
int
netdev_set_master
(
struct
net_device
*
dev
,
struct
net_device
*
master
);
extern
int
skb_checksum_help
(
struct
sk_buff
*
skb
,
int
inward
);
#ifdef CONFIG_BUG
extern
void
netdev_rx_csum_fault
(
struct
net_device
*
dev
);
#else
static
inline
void
netdev_rx_csum_fault
(
struct
net_device
*
dev
)
{
}
#endif
/* rx skb timestamps */
extern
void
net_enable_timestamp
(
void
);
extern
void
net_disable_timestamp
(
void
);
...
...
include/linux/skbuff.h
浏览文件 @
985834a1
...
...
@@ -1236,8 +1236,7 @@ extern unsigned int datagram_poll(struct file *file, struct socket *sock,
extern
int
skb_copy_datagram_iovec
(
const
struct
sk_buff
*
from
,
int
offset
,
struct
iovec
*
to
,
int
size
);
extern
int
skb_copy_and_csum_datagram_iovec
(
const
struct
sk_buff
*
skb
,
extern
int
skb_copy_and_csum_datagram_iovec
(
struct
sk_buff
*
skb
,
int
hlen
,
struct
iovec
*
iov
);
extern
void
skb_free_datagram
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
);
...
...
@@ -1305,6 +1304,30 @@ static inline void skb_set_timestamp(struct sk_buff *skb, const struct timeval *
extern
void
__net_timestamp
(
struct
sk_buff
*
skb
);
extern
unsigned
int
__skb_checksum_complete
(
struct
sk_buff
*
skb
);
/**
* skb_checksum_complete - Calculate checksum of an entire packet
* @skb: packet to process
*
* This function calculates the checksum over the entire packet plus
* the value of skb->csum. The latter can be used to supply the
* checksum of a pseudo header as used by TCP/UDP. It returns the
* checksum.
*
* For protocols that contain complete checksums such as ICMP/TCP/UDP,
* this function can be used to verify that checksum on received
* packets. In that case the function should return zero if the
* checksum is correct. In particular, this function will return zero
* if skb->ip_summed is CHECKSUM_UNNECESSARY which indicates that the
* hardware has already verified the correctness of the checksum.
*/
static
inline
unsigned
int
skb_checksum_complete
(
struct
sk_buff
*
skb
)
{
return
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
&&
__skb_checksum_complete
(
skb
);
}
#ifdef CONFIG_NETFILTER
static
inline
void
nf_conntrack_put
(
struct
nf_conntrack
*
nfct
)
{
...
...
include/net/tcp.h
浏览文件 @
985834a1
...
...
@@ -27,6 +27,7 @@
#include <linux/slab.h>
#include <linux/cache.h>
#include <linux/percpu.h>
#include <linux/skbuff.h>
#include <net/inet_connection_sock.h>
#include <net/inet_timewait_sock.h>
...
...
@@ -852,7 +853,7 @@ static __inline__ u16 tcp_v4_check(struct tcphdr *th, int len,
static
__inline__
int
__tcp_checksum_complete
(
struct
sk_buff
*
skb
)
{
return
(
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)
);
return
__skb_checksum_complete
(
skb
);
}
static
__inline__
int
tcp_checksum_complete
(
struct
sk_buff
*
skb
)
...
...
net/core/datagram.c
浏览文件 @
985834a1
...
...
@@ -350,6 +350,20 @@ static int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset,
return
-
EFAULT
;
}
unsigned
int
__skb_checksum_complete
(
struct
sk_buff
*
skb
)
{
unsigned
int
sum
;
sum
=
(
u16
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
));
if
(
likely
(
!
sum
))
{
if
(
unlikely
(
skb
->
ip_summed
==
CHECKSUM_HW
))
netdev_rx_csum_fault
(
skb
->
dev
);
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
}
return
sum
;
}
EXPORT_SYMBOL
(
__skb_checksum_complete
);
/**
* skb_copy_and_csum_datagram_iovec - Copy and checkum skb to user iovec.
* @skb: skbuff
...
...
@@ -363,7 +377,7 @@ static int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset,
* -EFAULT - fault during copy. Beware, in this case iovec
* can be modified!
*/
int
skb_copy_and_csum_datagram_iovec
(
const
struct
sk_buff
*
skb
,
int
skb_copy_and_csum_datagram_iovec
(
struct
sk_buff
*
skb
,
int
hlen
,
struct
iovec
*
iov
)
{
unsigned
int
csum
;
...
...
@@ -376,8 +390,7 @@ int skb_copy_and_csum_datagram_iovec(const struct sk_buff *skb,
iov
++
;
if
(
iov
->
iov_len
<
chunk
)
{
if
((
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
chunk
+
hlen
,
skb
->
csum
)))
if
(
__skb_checksum_complete
(
skb
))
goto
csum_error
;
if
(
skb_copy_datagram_iovec
(
skb
,
hlen
,
iov
,
chunk
))
goto
fault
;
...
...
@@ -388,6 +401,8 @@ int skb_copy_and_csum_datagram_iovec(const struct sk_buff *skb,
goto
fault
;
if
((
unsigned
short
)
csum_fold
(
csum
))
goto
csum_error
;
if
(
unlikely
(
skb
->
ip_summed
==
CHECKSUM_HW
))
netdev_rx_csum_fault
(
skb
->
dev
);
iov
->
iov_len
-=
chunk
;
iov
->
iov_base
+=
chunk
;
}
...
...
net/core/dev.c
浏览文件 @
985834a1
...
...
@@ -1108,6 +1108,18 @@ int skb_checksum_help(struct sk_buff *skb, int inward)
return
ret
;
}
/* Take action when hardware reception checksum errors are detected. */
#ifdef CONFIG_BUG
void
netdev_rx_csum_fault
(
struct
net_device
*
dev
)
{
if
(
net_ratelimit
())
{
printk
(
KERN_ERR
"%s: hw csum failure.
\n
"
,
dev
->
name
);
dump_stack
();
}
}
EXPORT_SYMBOL
(
netdev_rx_csum_fault
);
#endif
#ifdef CONFIG_HIGHMEM
/* Actually, we should eliminate this check as soon as we know, that:
* 1. IOMMU is present and allows to map all the memory.
...
...
net/core/netpoll.c
浏览文件 @
985834a1
...
...
@@ -101,16 +101,20 @@ void netpoll_queue(struct sk_buff *skb)
static
int
checksum_udp
(
struct
sk_buff
*
skb
,
struct
udphdr
*
uh
,
unsigned
short
ulen
,
u32
saddr
,
u32
daddr
)
{
if
(
uh
->
check
==
0
)
unsigned
int
psum
;
if
(
uh
->
check
==
0
||
skb
->
ip_summed
==
CHECKSUM_UNNECESSARY
)
return
0
;
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
return
csum_tcpudp_magic
(
saddr
,
daddr
,
ulen
,
IPPROTO_UDP
,
skb
->
csum
);
psum
=
csum_tcpudp_nofold
(
saddr
,
daddr
,
ulen
,
IPPROTO_UDP
,
0
);
if
(
skb
->
ip_summed
==
CHECKSUM_HW
&&
!
(
u16
)
csum_fold
(
csum_add
(
psum
,
skb
->
csum
)))
return
0
;
skb
->
csum
=
csum_tcpudp_nofold
(
saddr
,
daddr
,
ulen
,
IPPROTO_UDP
,
0
)
;
skb
->
csum
=
psum
;
return
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)
);
return
__skb_checksum_complete
(
skb
);
}
/*
...
...
@@ -489,7 +493,7 @@ int __netpoll_rx(struct sk_buff *skb)
if
(
ulen
!=
len
)
goto
out
;
if
(
checksum_udp
(
skb
,
uh
,
ulen
,
iph
->
saddr
,
iph
->
daddr
)
<
0
)
if
(
checksum_udp
(
skb
,
uh
,
ulen
,
iph
->
saddr
,
iph
->
daddr
))
goto
out
;
if
(
np
->
local_ip
&&
np
->
local_ip
!=
ntohl
(
iph
->
daddr
))
goto
out
;
...
...
net/ipv4/icmp.c
浏览文件 @
985834a1
...
...
@@ -934,11 +934,11 @@ int icmp_rcv(struct sk_buff *skb)
case
CHECKSUM_HW
:
if
(
!
(
u16
)
csum_fold
(
skb
->
csum
))
break
;
LIMIT_NETDEBUG
(
KERN_DEBUG
"icmp v4 hw csum failure
\n
"
);
/* fall through */
case
CHECKSUM_NONE
:
if
((
u16
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
0
)))
skb
->
csum
=
0
;
if
(
__skb_checksum_complete
(
skb
))
goto
error
;
default:
;
}
if
(
!
pskb_pull
(
skb
,
sizeof
(
struct
icmphdr
)))
...
...
net/ipv4/igmp.c
浏览文件 @
985834a1
...
...
@@ -872,11 +872,18 @@ int igmp_rcv(struct sk_buff *skb)
return
0
;
}
if
(
!
pskb_may_pull
(
skb
,
sizeof
(
struct
igmphdr
))
||
(
u16
)
csum_fold
(
skb_checksum
(
skb
,
0
,
len
,
0
)))
{
in_dev_put
(
in_dev
);
kfree_skb
(
skb
);
return
0
;
if
(
!
pskb_may_pull
(
skb
,
sizeof
(
struct
igmphdr
)))
goto
drop
;
switch
(
skb
->
ip_summed
)
{
case
CHECKSUM_HW
:
if
(
!
(
u16
)
csum_fold
(
skb
->
csum
))
break
;
/* fall through */
case
CHECKSUM_NONE
:
skb
->
csum
=
0
;
if
(
__skb_checksum_complete
(
skb
))
goto
drop
;
}
ih
=
skb
->
h
.
igmph
;
...
...
@@ -906,6 +913,8 @@ int igmp_rcv(struct sk_buff *skb)
default:
NETDEBUG
(
KERN_DEBUG
"New IGMP type=%d, why we do not know about it?
\n
"
,
ih
->
type
);
}
drop:
in_dev_put
(
in_dev
);
kfree_skb
(
skb
);
return
0
;
...
...
net/ipv4/ip_gre.c
浏览文件 @
985834a1
...
...
@@ -577,15 +577,16 @@ static int ipgre_rcv(struct sk_buff *skb)
goto
drop_nolock
;
if
(
flags
&
GRE_CSUM
)
{
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
{
switch
(
skb
->
ip_summed
)
{
case
CHECKSUM_HW
:
csum
=
(
u16
)
csum_fold
(
skb
->
csum
);
if
(
csum
)
skb
->
ip_summed
=
CHECKSUM_NONE
;
}
if
(
skb
->
ip_summed
==
CHECKSUM_NONE
)
{
skb
->
csum
=
skb_checksum
(
skb
,
0
,
skb
->
len
,
0
);
if
(
!
csum
)
break
;
/* fall through */
case
CHECKSUM_NONE
:
skb
->
csum
=
0
;
csum
=
__skb_checksum_complete
(
skb
);
skb
->
ip_summed
=
CHECKSUM_HW
;
csum
=
(
u16
)
csum_fold
(
skb
->
csum
);
}
offset
+=
4
;
}
...
...
net/ipv4/netfilter/ip_conntrack_proto_icmp.c
浏览文件 @
985834a1
...
...
@@ -13,6 +13,7 @@
#include <linux/in.h>
#include <linux/icmp.h>
#include <linux/seq_file.h>
#include <linux/skbuff.h>
#include <net/ip.h>
#include <net/checksum.h>
#include <linux/netfilter.h>
...
...
@@ -230,19 +231,15 @@ icmp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo,
case
CHECKSUM_HW
:
if
(
!
(
u16
)
csum_fold
(
skb
->
csum
))
break
;
if
(
LOG_INVALID
(
IPPROTO_ICMP
))
nf_log_packet
(
PF_INET
,
0
,
skb
,
NULL
,
NULL
,
NULL
,
"ip_ct_icmp: bad HW ICMP checksum "
);
return
-
NF_ACCEPT
;
/* fall through */
case
CHECKSUM_NONE
:
if
((
u16
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
0
)))
{
skb
->
csum
=
0
;
if
(
__skb_checksum_complete
(
skb
))
{
if
(
LOG_INVALID
(
IPPROTO_ICMP
))
nf_log_packet
(
PF_INET
,
0
,
skb
,
NULL
,
NULL
,
NULL
,
"ip_ct_icmp: bad ICMP checksum "
);
return
-
NF_ACCEPT
;
}
default:
break
;
}
checksum_skipped:
...
...
net/ipv4/tcp_ipv4.c
浏览文件 @
985834a1
...
...
@@ -1110,24 +1110,18 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
static
int
tcp_v4_checksum_init
(
struct
sk_buff
*
skb
)
{
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
{
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
if
(
!
tcp_v4_check
(
skb
->
h
.
th
,
skb
->
len
,
skb
->
nh
.
iph
->
saddr
,
skb
->
nh
.
iph
->
daddr
,
skb
->
csum
))
skb
->
nh
.
iph
->
daddr
,
skb
->
csum
))
{
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
return
0
;
LIMIT_NETDEBUG
(
KERN_DEBUG
"hw tcp v4 csum failed
\n
"
);
skb
->
ip_summed
=
CHECKSUM_NONE
;
}
}
skb
->
csum
=
csum_tcpudp_nofold
(
skb
->
nh
.
iph
->
saddr
,
skb
->
nh
.
iph
->
daddr
,
skb
->
len
,
IPPROTO_TCP
,
0
);
if
(
skb
->
len
<=
76
)
{
if
(
tcp_v4_check
(
skb
->
h
.
th
,
skb
->
len
,
skb
->
nh
.
iph
->
saddr
,
skb
->
nh
.
iph
->
daddr
,
skb_checksum
(
skb
,
0
,
skb
->
len
,
0
)))
return
-
1
;
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
}
else
{
skb
->
csum
=
~
tcp_v4_check
(
skb
->
h
.
th
,
skb
->
len
,
skb
->
nh
.
iph
->
saddr
,
skb
->
nh
.
iph
->
daddr
,
0
);
return
__skb_checksum_complete
(
skb
);
}
return
0
;
}
...
...
@@ -1219,7 +1213,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
* provided case of th->doff==0 is elimineted.
* So, we defer the checks. */
if
((
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
&&
tcp_v4_checksum_init
(
skb
)
<
0
))
tcp_v4_checksum_init
(
skb
)))
goto
bad_packet
;
th
=
skb
->
h
.
th
;
...
...
net/ipv4/udp.c
浏览文件 @
985834a1
...
...
@@ -761,7 +761,7 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
static
__inline__
int
__udp_checksum_complete
(
struct
sk_buff
*
skb
)
{
return
(
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)
);
return
__skb_checksum_complete
(
skb
);
}
static
__inline__
int
udp_checksum_complete
(
struct
sk_buff
*
skb
)
...
...
@@ -1100,11 +1100,8 @@ static int udp_checksum_init(struct sk_buff *skb, struct udphdr *uh,
if
(
uh
->
check
==
0
)
{
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
}
else
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
{
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
if
(
!
udp_check
(
uh
,
ulen
,
saddr
,
daddr
,
skb
->
csum
))
return
0
;
LIMIT_NETDEBUG
(
KERN_DEBUG
"udp v4 hw csum failure.
\n
"
);
skb
->
ip_summed
=
CHECKSUM_NONE
;
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
}
if
(
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
)
skb
->
csum
=
csum_tcpudp_nofold
(
saddr
,
daddr
,
ulen
,
IPPROTO_UDP
,
0
);
...
...
net/ipv6/icmp.c
浏览文件 @
985834a1
...
...
@@ -585,17 +585,16 @@ static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
daddr
=
&
skb
->
nh
.
ipv6h
->
daddr
;
/* Perform checksum. */
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
{
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
if
(
csum_ipv6_magic
(
saddr
,
daddr
,
skb
->
len
,
IPPROTO_ICMPV6
,
skb
->
csum
))
{
LIMIT_NETDEBUG
(
KERN_DEBUG
"ICMPv6 hw checksum failed
\n
"
);
skb
->
ip_summed
=
CHECKSUM_NONE
;
}
}
if
(
skb
->
ip_summed
==
CHECKSUM_NONE
)
{
if
(
csum_ipv6_magic
(
saddr
,
daddr
,
skb
->
len
,
IPPROTO_ICMPV6
,
skb_checksum
(
skb
,
0
,
skb
->
len
,
0
)))
{
switch
(
skb
->
ip_summed
)
{
case
CHECKSUM_HW
:
if
(
!
csum_ipv6_magic
(
saddr
,
daddr
,
skb
->
len
,
IPPROTO_ICMPV6
,
skb
->
csum
))
break
;
/* fall through */
case
CHECKSUM_NONE
:
skb
->
csum
=
~
csum_ipv6_magic
(
saddr
,
daddr
,
skb
->
len
,
IPPROTO_ICMPV6
,
0
);
if
(
__skb_checksum_complete
(
skb
))
{
LIMIT_NETDEBUG
(
KERN_DEBUG
"ICMPv6 checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]
\n
"
,
NIP6
(
*
saddr
),
NIP6
(
*
daddr
));
goto
discard_it
;
...
...
net/ipv6/raw.c
浏览文件 @
985834a1
...
...
@@ -298,13 +298,10 @@ void rawv6_err(struct sock *sk, struct sk_buff *skb,
static
inline
int
rawv6_rcv_skb
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
)
{
if
((
raw6_sk
(
sk
)
->
checksum
||
sk
->
sk_filter
)
&&
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
)
{
if
((
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)))
{
/* FIXME: increment a raw6 drops counter here */
kfree_skb
(
skb
);
return
0
;
}
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
skb_checksum_complete
(
skb
))
{
/* FIXME: increment a raw6 drops counter here */
kfree_skb
(
skb
);
return
0
;
}
/* Charge it to the socket. */
...
...
@@ -337,32 +334,25 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
if
(
!
rp
->
checksum
)
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
if
(
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
)
{
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
{
skb_postpull_rcsum
(
skb
,
skb
->
nh
.
raw
,
skb
->
h
.
raw
-
skb
->
nh
.
raw
);
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
{
skb_postpull_rcsum
(
skb
,
skb
->
nh
.
raw
,
skb
->
h
.
raw
-
skb
->
nh
.
raw
);
if
(
!
csum_ipv6_magic
(
&
skb
->
nh
.
ipv6h
->
saddr
,
&
skb
->
nh
.
ipv6h
->
daddr
,
skb
->
len
,
inet
->
num
,
skb
->
csum
))
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
if
(
csum_ipv6_magic
(
&
skb
->
nh
.
ipv6h
->
saddr
,
&
skb
->
nh
.
ipv6h
->
daddr
,
skb
->
len
,
inet
->
num
,
skb
->
csum
))
{
LIMIT_NETDEBUG
(
KERN_DEBUG
"raw v6 hw csum failure.
\n
"
);
skb
->
ip_summed
=
CHECKSUM_NONE
;
}
}
if
(
skb
->
ip_summed
==
CHECKSUM_NONE
)
skb
->
csum
=
~
csum_ipv6_magic
(
&
skb
->
nh
.
ipv6h
->
saddr
,
&
skb
->
nh
.
ipv6h
->
daddr
,
skb
->
len
,
inet
->
num
,
0
);
}
if
(
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
)
skb
->
csum
=
~
csum_ipv6_magic
(
&
skb
->
nh
.
ipv6h
->
saddr
,
&
skb
->
nh
.
ipv6h
->
daddr
,
skb
->
len
,
inet
->
num
,
0
);
if
(
inet
->
hdrincl
)
{
if
(
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
&&
(
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)))
{
if
(
skb_checksum_complete
(
skb
))
{
/* FIXME: increment a raw6 drops counter here */
kfree_skb
(
skb
);
return
0
;
}
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
}
rawv6_rcv_skb
(
sk
,
skb
);
...
...
@@ -407,7 +397,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
if
(
skb
->
ip_summed
==
CHECKSUM_UNNECESSARY
)
{
err
=
skb_copy_datagram_iovec
(
skb
,
0
,
msg
->
msg_iov
,
copied
);
}
else
if
(
msg
->
msg_flags
&
MSG_TRUNC
)
{
if
(
(
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)
))
if
(
__skb_checksum_complete
(
skb
))
goto
csum_copy_err
;
err
=
skb_copy_datagram_iovec
(
skb
,
0
,
msg
->
msg_iov
,
copied
);
}
else
{
...
...
net/ipv6/tcp_ipv6.c
浏览文件 @
985834a1
...
...
@@ -1401,20 +1401,18 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
static
int
tcp_v6_checksum_init
(
struct
sk_buff
*
skb
)
{
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
{
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
if
(
!
tcp_v6_check
(
skb
->
h
.
th
,
skb
->
len
,
&
skb
->
nh
.
ipv6h
->
saddr
,
&
skb
->
nh
.
ipv6h
->
daddr
,
skb
->
csum
))
&
skb
->
nh
.
ipv6h
->
daddr
,
skb
->
csum
))
{
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
return
0
;
LIMIT_NETDEBUG
(
KERN_DEBUG
"hw tcp v6 csum failed
\n
"
);
}
}
skb
->
csum
=
~
tcp_v6_check
(
skb
->
h
.
th
,
skb
->
len
,
&
skb
->
nh
.
ipv6h
->
saddr
,
&
skb
->
nh
.
ipv6h
->
daddr
,
0
);
if
(
skb
->
len
<=
76
)
{
if
(
tcp_v6_check
(
skb
->
h
.
th
,
skb
->
len
,
&
skb
->
nh
.
ipv6h
->
saddr
,
&
skb
->
nh
.
ipv6h
->
daddr
,
skb_checksum
(
skb
,
0
,
skb
->
len
,
0
)))
return
-
1
;
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
}
else
{
skb
->
csum
=
~
tcp_v6_check
(
skb
->
h
.
th
,
skb
->
len
,
&
skb
->
nh
.
ipv6h
->
saddr
,
&
skb
->
nh
.
ipv6h
->
daddr
,
0
);
return
__skb_checksum_complete
(
skb
);
}
return
0
;
}
...
...
@@ -1575,7 +1573,7 @@ static int tcp_v6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
goto
discard_it
;
if
((
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
&&
tcp_v6_checksum_init
(
skb
)
<
0
))
tcp_v6_checksum_init
(
skb
)))
goto
bad_packet
;
th
=
skb
->
h
.
th
;
...
...
net/ipv6/udp.c
浏览文件 @
985834a1
...
...
@@ -248,7 +248,7 @@ static int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
err
=
skb_copy_datagram_iovec
(
skb
,
sizeof
(
struct
udphdr
),
msg
->
msg_iov
,
copied
);
}
else
if
(
msg
->
msg_flags
&
MSG_TRUNC
)
{
if
(
(
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)
))
if
(
__skb_checksum_complete
(
skb
))
goto
csum_copy_err
;
err
=
skb_copy_datagram_iovec
(
skb
,
sizeof
(
struct
udphdr
),
msg
->
msg_iov
,
copied
);
...
...
@@ -363,13 +363,10 @@ static inline int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
return
-
1
;
}
if
(
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
)
{
if
((
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)))
{
UDP6_INC_STATS_BH
(
UDP_MIB_INERRORS
);
kfree_skb
(
skb
);
return
0
;
}
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
if
(
skb_checksum_complete
(
skb
))
{
UDP6_INC_STATS_BH
(
UDP_MIB_INERRORS
);
kfree_skb
(
skb
);
return
0
;
}
if
(
sock_queue_rcv_skb
(
sk
,
skb
)
<
0
)
{
...
...
@@ -491,13 +488,10 @@ static int udpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
uh
=
skb
->
h
.
uh
;
}
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
{
if
(
skb
->
ip_summed
==
CHECKSUM_HW
&&
!
csum_ipv6_magic
(
saddr
,
daddr
,
ulen
,
IPPROTO_UDP
,
skb
->
csum
))
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
if
(
csum_ipv6_magic
(
saddr
,
daddr
,
ulen
,
IPPROTO_UDP
,
skb
->
csum
))
{
LIMIT_NETDEBUG
(
KERN_DEBUG
"udp v6 hw csum failure.
\n
"
);
skb
->
ip_summed
=
CHECKSUM_NONE
;
}
}
if
(
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
)
skb
->
csum
=
~
csum_ipv6_magic
(
saddr
,
daddr
,
ulen
,
IPPROTO_UDP
,
0
);
...
...
@@ -521,8 +515,7 @@ static int udpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
if
(
!
xfrm6_policy_check
(
NULL
,
XFRM_POLICY_IN
,
skb
))
goto
discard
;
if
(
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
&&
(
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)))
if
(
skb_checksum_complete
(
skb
))
goto
discard
;
UDP6_INC_STATS_BH
(
UDP_MIB_NOPORTS
);
...
...
net/rxrpc/transport.c
浏览文件 @
985834a1
...
...
@@ -23,6 +23,7 @@
#include <linux/in.h>
#include <linux/in6.h>
#include <linux/icmp.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <net/ip.h>
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
...
...
@@ -475,15 +476,11 @@ void rxrpc_trans_receive_packet(struct rxrpc_transport *trans)
/* we'll probably need to checksum it (didn't call
* sock_recvmsg) */
if
(
pkt
->
ip_summed
!=
CHECKSUM_UNNECESSARY
)
{
if
((
unsigned
short
)
csum_fold
(
skb_checksum
(
pkt
,
0
,
pkt
->
len
,
pkt
->
csum
)))
{
kfree_skb
(
pkt
);
rxrpc_krxiod_queue_transport
(
trans
);
_leave
(
" CSUM failed"
);
return
;
}
if
(
skb_checksum_complete
(
pkt
))
{
kfree_skb
(
pkt
);
rxrpc_krxiod_queue_transport
(
trans
);
_leave
(
" CSUM failed"
);
return
;
}
addr
=
pkt
->
nh
.
iph
->
saddr
;
...
...
net/sunrpc/socklib.c
浏览文件 @
985834a1
...
...
@@ -6,6 +6,9 @@
* Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
*/
#include <linux/compiler.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/types.h>
#include <linux/pagemap.h>
#include <linux/udp.h>
...
...
@@ -165,6 +168,8 @@ int csum_partial_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb)
return
-
1
;
if
((
unsigned
short
)
csum_fold
(
desc
.
csum
))
return
-
1
;
if
(
unlikely
(
skb
->
ip_summed
==
CHECKSUM_HW
))
netdev_rx_csum_fault
(
skb
->
dev
);
return
0
;
no_checksum:
if
(
xdr_partial_copy_from_skb
(
xdr
,
0
,
&
desc
,
skb_read_bits
)
<
0
)
...
...
net/sunrpc/svcsock.c
浏览文件 @
985834a1
...
...
@@ -623,12 +623,9 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
/* we can use it in-place */
rqstp
->
rq_arg
.
head
[
0
].
iov_base
=
skb
->
data
+
sizeof
(
struct
udphdr
);
rqstp
->
rq_arg
.
head
[
0
].
iov_len
=
len
;
if
(
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
)
{
if
((
unsigned
short
)
csum_fold
(
skb_checksum
(
skb
,
0
,
skb
->
len
,
skb
->
csum
)))
{
skb_free_datagram
(
svsk
->
sk_sk
,
skb
);
return
0
;
}
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
if
(
skb_checksum_complete
(
skb
))
{
skb_free_datagram
(
svsk
->
sk_sk
,
skb
);
return
0
;
}
rqstp
->
rq_skbuff
=
skb
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录