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
985834a1
Commit
985834a1
authored
Nov 10, 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
b8cbfa69
f3b84ec2
Changes
24
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
240 additions
and
149 deletions
+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
No files found.
Documentation/networking/dccp.txt
0 → 100644
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
;
}
...
...
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