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
7ee0eebf
Commit
7ee0eebf
authored
Nov 21, 2002
by
Jeff Dike
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Merged the IP checksum changes from the skas code.
parent
ca7e435f
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
262 additions
and
2 deletions
+262
-2
arch/um/include/sysdep-i386/checksum.h
arch/um/include/sysdep-i386/checksum.h
+217
-0
arch/um/kernel/checksum.c
arch/um/kernel/checksum.c
+42
-0
arch/um/sys-i386/ksyms.c
arch/um/sys-i386/ksyms.c
+2
-1
include/asm-um/checksum.h
include/asm-um/checksum.h
+1
-1
No files found.
arch/um/include/sysdep-i386/checksum.h
0 → 100644
View file @
7ee0eebf
/*
* Licensed under the GPL
*/
#ifndef __UM_SYSDEP_CHECKSUM_H
#define __UM_SYSDEP_CHECKSUM_H
#include "linux/string.h"
/*
* computes the checksum of a memory block at buff, length len,
* and adds in "sum" (32-bit)
*
* returns a 32-bit number suitable for feeding into itself
* or csum_tcpudp_magic
*
* this function must be called with even lengths, except
* for the last fragment, which may be odd
*
* it's best to have buff aligned on a 32-bit boundary
*/
unsigned
int
csum_partial
(
const
unsigned
char
*
buff
,
int
len
,
unsigned
int
sum
);
/*
* the same as csum_partial, but copies from src while it
* checksums, and handles user-space pointer exceptions correctly, when needed.
*
* here even more important to align src and dst on a 32-bit (or even
* better 64-bit) boundary
*/
unsigned
int
csum_partial_copy_to
(
const
char
*
src
,
char
*
dst
,
int
len
,
int
sum
,
int
*
err_ptr
);
unsigned
int
csum_partial_copy_from
(
const
char
*
src
,
char
*
dst
,
int
len
,
int
sum
,
int
*
err_ptr
);
/*
* Note: when you get a NULL pointer exception here this means someone
* passed in an incorrect kernel address to one of these functions.
*
* If you use these functions directly please don't forget the
* verify_area().
*/
static
__inline__
unsigned
int
csum_partial_copy_nocheck
(
const
char
*
src
,
char
*
dst
,
int
len
,
int
sum
)
{
memcpy
(
dst
,
src
,
len
);
return
(
csum_partial
(
dst
,
len
,
sum
));
}
static
__inline__
unsigned
int
csum_partial_copy_from_user
(
const
char
*
src
,
char
*
dst
,
int
len
,
int
sum
,
int
*
err_ptr
)
{
return
csum_partial_copy_from
(
src
,
dst
,
len
,
sum
,
err_ptr
);
}
/*
* These are the old (and unsafe) way of doing checksums, a warning message
* will be printed if they are used and an exeption occurs.
*
* these functions should go away after some time.
*/
#define csum_partial_copy_fromuser csum_partial_copy_from_user
unsigned
int
csum_partial_copy
(
const
char
*
src
,
char
*
dst
,
int
len
,
int
sum
);
/*
* This is a version of ip_compute_csum() optimized for IP headers,
* which always checksum on 4 octet boundaries.
*
* By Jorge Cwik <jorge@laser.satlink.net>, adapted for linux by
* Arnt Gulbrandsen.
*/
static
inline
unsigned
short
ip_fast_csum
(
unsigned
char
*
iph
,
unsigned
int
ihl
)
{
unsigned
int
sum
;
__asm__
__volatile__
(
"movl (%1), %0 ;
\n
"
"subl $4, %2 ;
\n
"
"jbe 2f ;
\n
"
"addl 4(%1), %0 ;
\n
"
"adcl 8(%1), %0 ;
\n
"
"adcl 12(%1), %0 ;
\n
"
"1: adcl 16(%1), %0 ;
\n
"
"lea 4(%1), %1 ;
\n
"
"decl %2 ;
\n
"
"jne 1b ;
\n
"
"adcl $0, %0 ;
\n
"
"movl %0, %2 ;
\n
"
"shrl $16, %0 ;
\n
"
"addw %w2, %w0 ;
\n
"
"adcl $0, %0 ;
\n
"
"notl %0 ;
\n
"
"2: ;
\n
"
/* Since the input registers which are loaded with iph and ipl
are modified, we must also specify them as outputs, or gcc
will assume they contain their original values. */
:
"=r"
(
sum
),
"=r"
(
iph
),
"=r"
(
ihl
)
:
"1"
(
iph
),
"2"
(
ihl
));
return
(
sum
);
}
/*
* Fold a partial checksum
*/
static
inline
unsigned
int
csum_fold
(
unsigned
int
sum
)
{
__asm__
(
"addl %1, %0 ;
\n
"
"adcl $0xffff, %0 ;
\n
"
:
"=r"
(
sum
)
:
"r"
(
sum
<<
16
),
"0"
(
sum
&
0xffff0000
)
);
return
(
~
sum
)
>>
16
;
}
static
inline
unsigned
long
csum_tcpudp_nofold
(
unsigned
long
saddr
,
unsigned
long
daddr
,
unsigned
short
len
,
unsigned
short
proto
,
unsigned
int
sum
)
{
__asm__
(
"addl %1, %0 ;
\n
"
"adcl %2, %0 ;
\n
"
"adcl %3, %0 ;
\n
"
"adcl $0, %0 ;
\n
"
:
"=r"
(
sum
)
:
"g"
(
daddr
),
"g"
(
saddr
),
"g"
((
ntohs
(
len
)
<<
16
)
+
proto
*
256
),
"0"
(
sum
));
return
sum
;
}
/*
* computes the checksum of the TCP/UDP pseudo-header
* returns a 16-bit checksum, already complemented
*/
static
inline
unsigned
short
int
csum_tcpudp_magic
(
unsigned
long
saddr
,
unsigned
long
daddr
,
unsigned
short
len
,
unsigned
short
proto
,
unsigned
int
sum
)
{
return
csum_fold
(
csum_tcpudp_nofold
(
saddr
,
daddr
,
len
,
proto
,
sum
));
}
/*
* this routine is used for miscellaneous IP-like checksums, mainly
* in icmp.c
*/
static
inline
unsigned
short
ip_compute_csum
(
unsigned
char
*
buff
,
int
len
)
{
return
csum_fold
(
csum_partial
(
buff
,
len
,
0
));
}
#define _HAVE_ARCH_IPV6_CSUM
static
__inline__
unsigned
short
int
csum_ipv6_magic
(
struct
in6_addr
*
saddr
,
struct
in6_addr
*
daddr
,
__u32
len
,
unsigned
short
proto
,
unsigned
int
sum
)
{
__asm__
(
"addl 0(%1), %0 ;
\n
"
"adcl 4(%1), %0 ;
\n
"
"adcl 8(%1), %0 ;
\n
"
"adcl 12(%1), %0 ;
\n
"
"adcl 0(%2), %0 ;
\n
"
"adcl 4(%2), %0 ;
\n
"
"adcl 8(%2), %0 ;
\n
"
"adcl 12(%2), %0 ;
\n
"
"adcl %3, %0 ;
\n
"
"adcl %4, %0 ;
\n
"
"adcl $0, %0 ;
\n
"
:
"=&r"
(
sum
)
:
"r"
(
saddr
),
"r"
(
daddr
),
"r"
(
htonl
(
len
)),
"r"
(
htonl
(
proto
)),
"0"
(
sum
));
return
csum_fold
(
sum
);
}
/*
* Copy and checksum to user
*/
#define HAVE_CSUM_COPY_USER
static
__inline__
unsigned
int
csum_and_copy_to_user
(
const
char
*
src
,
char
*
dst
,
int
len
,
int
sum
,
int
*
err_ptr
)
{
if
(
access_ok
(
VERIFY_WRITE
,
dst
,
len
))
return
(
csum_partial_copy_to
(
src
,
dst
,
len
,
sum
,
err_ptr
));
if
(
len
)
*
err_ptr
=
-
EFAULT
;
return
-
1
;
/* invalid checksum */
}
#endif
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/
arch/um/kernel/checksum.c
0 → 100644
View file @
7ee0eebf
#include "asm/uaccess.h"
#include "linux/errno.h"
extern
unsigned
int
arch_csum_partial
(
const
char
*
buff
,
int
len
,
int
sum
);
extern
unsigned
int
csum_partial
(
char
*
buff
,
int
len
,
int
sum
)
{
return
(
arch_csum_partial
(
buff
,
len
,
sum
));
}
unsigned
int
csum_partial_copy_to
(
const
char
*
src
,
char
*
dst
,
int
len
,
int
sum
,
int
*
err_ptr
)
{
if
(
copy_to_user
(
dst
,
src
,
len
)){
*
err_ptr
=
-
EFAULT
;
return
(
-
1
);
}
return
(
arch_csum_partial
(
src
,
len
,
sum
));
}
unsigned
int
csum_partial_copy_from
(
const
char
*
src
,
char
*
dst
,
int
len
,
int
sum
,
int
*
err_ptr
)
{
if
(
copy_from_user
(
dst
,
src
,
len
)){
*
err_ptr
=
-
EFAULT
;
return
(
-
1
);
}
return
(
arch_csum_partial
(
dst
,
len
,
sum
));
}
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/
arch/um/sys-i386/ksyms.c
View file @
7ee0eebf
...
...
@@ -13,4 +13,5 @@ EXPORT_SYMBOL(__down_failed_trylock);
EXPORT_SYMBOL
(
__up_wakeup
);
/* Networking helper routines. */
EXPORT_SYMBOL
(
csum_partial_copy_generic
);
EXPORT_SYMBOL
(
csum_partial_copy_from
);
EXPORT_SYMBOL
(
csum_partial_copy_to
);
include/asm-um/checksum.h
View file @
7ee0eebf
#ifndef __UM_CHECKSUM_H
#define __UM_CHECKSUM_H
#include "
asm/arch
/checksum.h"
#include "
sysdep
/checksum.h"
#endif
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