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
65d17d59
Commit
65d17d59
authored
Jun 26, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/home/davem/BK/net-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
b19738ae
4bddee2c
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
214 additions
and
239 deletions
+214
-239
include/net/inet_common.h
include/net/inet_common.h
+0
-13
include/net/sock.h
include/net/sock.h
+13
-0
net/core/sock.c
net/core/sock.c
+88
-0
net/ipv4/af_inet.c
net/ipv4/af_inet.c
+8
-95
net/ipv4/esp4.c
net/ipv4/esp4.c
+14
-54
net/ipv4/raw.c
net/ipv4/raw.c
+1
-1
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_ipv4.c
+3
-1
net/ipv4/udp.c
net/ipv4/udp.c
+38
-36
net/ipv6/af_inet6.c
net/ipv6/af_inet6.c
+7
-7
net/ipv6/raw.c
net/ipv6/raw.c
+1
-1
net/ipv6/tcp_ipv6.c
net/ipv6/tcp_ipv6.c
+2
-18
net/ipv6/udp.c
net/ipv6/udp.c
+9
-2
net/key/af_key.c
net/key/af_key.c
+9
-0
net/sched/act_api.c
net/sched/act_api.c
+2
-1
net/sctp/ipv6.c
net/sctp/ipv6.c
+4
-4
net/sctp/protocol.c
net/sctp/protocol.c
+4
-4
net/sctp/socket.c
net/sctp/socket.c
+2
-2
net/xfrm/xfrm_user.c
net/xfrm/xfrm_user.c
+9
-0
No files found.
include/net/inet_common.h
View file @
65d17d59
...
...
@@ -20,27 +20,14 @@ extern int inet_dgram_connect(struct socket *sock,
int
addr_len
,
int
flags
);
extern
int
inet_accept
(
struct
socket
*
sock
,
struct
socket
*
newsock
,
int
flags
);
extern
int
inet_recvmsg
(
struct
kiocb
*
iocb
,
struct
socket
*
sock
,
struct
msghdr
*
ubuf
,
size_t
size
,
int
flags
);
extern
int
inet_sendmsg
(
struct
kiocb
*
iocb
,
struct
socket
*
sock
,
struct
msghdr
*
msg
,
size_t
size
);
extern
int
inet_shutdown
(
struct
socket
*
sock
,
int
how
);
extern
unsigned
int
inet_poll
(
struct
file
*
file
,
struct
socket
*
sock
,
struct
poll_table_struct
*
wait
);
extern
int
inet_setsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
optlen
);
extern
int
inet_getsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
__user
*
optlen
);
extern
int
inet_listen
(
struct
socket
*
sock
,
int
backlog
);
extern
void
inet_sock_release
(
struct
sock
*
sk
);
extern
void
inet_sock_destruct
(
struct
sock
*
sk
);
extern
atomic_t
inet_sock_nr
;
...
...
include/net/sock.h
View file @
65d17d59
...
...
@@ -770,6 +770,19 @@ extern ssize_t sock_no_sendpage(struct socket *sock,
int
offset
,
size_t
size
,
int
flags
);
/*
* Functions to fill in entries in struct proto_ops when a protocol
* uses the inet style.
*/
extern
int
sock_common_getsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
__user
*
optlen
);
extern
int
sock_common_recvmsg
(
struct
kiocb
*
iocb
,
struct
socket
*
sock
,
struct
msghdr
*
msg
,
size_t
size
,
int
flags
);
extern
int
sock_common_setsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
optlen
);
extern
void
sk_common_release
(
struct
sock
*
sk
);
/*
* Default socket callbacks and setup code
*/
...
...
net/core/sock.c
View file @
65d17d59
...
...
@@ -118,6 +118,7 @@
#include <net/protocol.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <net/xfrm.h>
#include <linux/ipsec.h>
#include <linux/filter.h>
...
...
@@ -1259,6 +1260,93 @@ void sock_disable_timestamp(struct sock *sk)
}
EXPORT_SYMBOL
(
sock_disable_timestamp
);
/*
* Get a socket option on an socket.
*
* FIX: POSIX 1003.1g is very ambiguous here. It states that
* asynchronous errors should be reported by getsockopt. We assume
* this means if you specify SO_ERROR (otherwise whats the point of it).
*/
int
sock_common_getsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
__user
*
optlen
)
{
struct
sock
*
sk
=
sock
->
sk
;
return
sk
->
sk_prot
->
getsockopt
(
sk
,
level
,
optname
,
optval
,
optlen
);
}
EXPORT_SYMBOL
(
sock_common_getsockopt
);
int
sock_common_recvmsg
(
struct
kiocb
*
iocb
,
struct
socket
*
sock
,
struct
msghdr
*
msg
,
size_t
size
,
int
flags
)
{
struct
sock
*
sk
=
sock
->
sk
;
int
addr_len
=
0
;
int
err
;
err
=
sk
->
sk_prot
->
recvmsg
(
iocb
,
sk
,
msg
,
size
,
flags
&
MSG_DONTWAIT
,
flags
&
~
MSG_DONTWAIT
,
&
addr_len
);
if
(
err
>=
0
)
msg
->
msg_namelen
=
addr_len
;
return
err
;
}
EXPORT_SYMBOL
(
sock_common_recvmsg
);
/*
* Set socket options on an inet socket.
*/
int
sock_common_setsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
optlen
)
{
struct
sock
*
sk
=
sock
->
sk
;
return
sk
->
sk_prot
->
setsockopt
(
sk
,
level
,
optname
,
optval
,
optlen
);
}
EXPORT_SYMBOL
(
sock_common_setsockopt
);
void
sk_common_release
(
struct
sock
*
sk
)
{
if
(
sk
->
sk_prot
->
destroy
)
sk
->
sk_prot
->
destroy
(
sk
);
/*
* Observation: when sock_common_release is called, processes have
* no access to socket. But net still has.
* Step one, detach it from networking:
*
* A. Remove from hash tables.
*/
sk
->
sk_prot
->
unhash
(
sk
);
/*
* In this point socket cannot receive new packets, but it is possible
* that some packets are in flight because some CPU runs receiver and
* did hash table lookup before we unhashed socket. They will achieve
* receive queue and will be purged by socket destructor.
*
* Also we still have packets pending on receive queue and probably,
* our own packets waiting in device queues. sock_destroy will drain
* receive queue, but transmitted packets will delay socket destruction
* until the last reference will be released.
*/
sock_orphan
(
sk
);
xfrm_sk_free_policy
(
sk
);
#ifdef INET_REFCNT_DEBUG
if
(
atomic_read
(
&
sk
->
sk_refcnt
)
!=
1
)
printk
(
KERN_DEBUG
"Destruction of the socket %p delayed, c=%d
\n
"
,
sk
,
atomic_read
(
&
sk
->
sk_refcnt
));
#endif
sock_put
(
sk
);
}
EXPORT_SYMBOL
(
sk_common_release
);
EXPORT_SYMBOL
(
__lock_sock
);
EXPORT_SYMBOL
(
__release_sock
);
EXPORT_SYMBOL
(
sk_alloc
);
...
...
net/ipv4/af_inet.c
View file @
65d17d59
...
...
@@ -166,79 +166,12 @@ void inet_sock_destruct(struct sock *sk)
#endif
}
void
inet_sock_release
(
struct
sock
*
sk
)
{
if
(
sk
->
sk_prot
->
destroy
)
sk
->
sk_prot
->
destroy
(
sk
);
/* Observation: when inet_sock_release is called, processes have
* no access to socket. But net still has.
* Step one, detach it from networking:
*
* A. Remove from hash tables.
*/
sk
->
sk_prot
->
unhash
(
sk
);
/* In this point socket cannot receive new packets,
* but it is possible that some packets are in flight
* because some CPU runs receiver and did hash table lookup
* before we unhashed socket. They will achieve receive queue
* and will be purged by socket destructor.
*
* Also we still have packets pending on receive
* queue and probably, our own packets waiting in device queues.
* sock_destroy will drain receive queue, but transmitted
* packets will delay socket destruction until the last reference
* will be released.
*/
sock_orphan
(
sk
);
xfrm_sk_free_policy
(
sk
);
#ifdef INET_REFCNT_DEBUG
if
(
atomic_read
(
&
sk
->
sk_refcnt
)
!=
1
)
printk
(
KERN_DEBUG
"Destruction inet %p delayed, c=%d
\n
"
,
sk
,
atomic_read
(
&
sk
->
sk_refcnt
));
#endif
sock_put
(
sk
);
}
/*
* The routines beyond this point handle the behaviour of an AF_INET
* socket object. Mostly it punts to the subprotocols of IP to do
* the work.
*/
/*
* Set socket options on an inet socket.
*/
int
inet_setsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
optlen
)
{
struct
sock
*
sk
=
sock
->
sk
;
return
sk
->
sk_prot
->
setsockopt
(
sk
,
level
,
optname
,
optval
,
optlen
);
}
/*
* Get a socket option on an AF_INET socket.
*
* FIX: POSIX 1003.1g is very ambiguous here. It states that
* asynchronous errors should be reported by getsockopt. We assume
* this means if you specify SO_ERROR (otherwise whats the point of it).
*/
int
inet_getsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
__user
*
optval
,
int
__user
*
optlen
)
{
struct
sock
*
sk
=
sock
->
sk
;
return
sk
->
sk_prot
->
getsockopt
(
sk
,
level
,
optname
,
optval
,
optlen
);
}
/*
* Automatically bind an unbound socket.
*/
...
...
@@ -422,7 +355,7 @@ static int inet_create(struct socket *sock, int protocol)
if
(
sk
->
sk_prot
->
init
)
{
err
=
sk
->
sk_prot
->
init
(
sk
);
if
(
err
)
inet_sock
_release
(
sk
);
sk_common
_release
(
sk
);
}
out:
return
err
;
...
...
@@ -729,22 +662,6 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr,
return
0
;
}
int
inet_recvmsg
(
struct
kiocb
*
iocb
,
struct
socket
*
sock
,
struct
msghdr
*
msg
,
size_t
size
,
int
flags
)
{
struct
sock
*
sk
=
sock
->
sk
;
int
addr_len
=
0
;
int
err
;
err
=
sk
->
sk_prot
->
recvmsg
(
iocb
,
sk
,
msg
,
size
,
flags
&
MSG_DONTWAIT
,
flags
&
~
MSG_DONTWAIT
,
&
addr_len
);
if
(
err
>=
0
)
msg
->
msg_namelen
=
addr_len
;
return
err
;
}
int
inet_sendmsg
(
struct
kiocb
*
iocb
,
struct
socket
*
sock
,
struct
msghdr
*
msg
,
size_t
size
)
{
...
...
@@ -891,10 +808,10 @@ struct proto_ops inet_stream_ops = {
.
ioctl
=
inet_ioctl
,
.
listen
=
inet_listen
,
.
shutdown
=
inet_shutdown
,
.
setsockopt
=
inet
_setsockopt
,
.
getsockopt
=
inet
_getsockopt
,
.
setsockopt
=
sock_common
_setsockopt
,
.
getsockopt
=
sock_common
_getsockopt
,
.
sendmsg
=
inet_sendmsg
,
.
recvmsg
=
inet
_recvmsg
,
.
recvmsg
=
sock_common
_recvmsg
,
.
mmap
=
sock_no_mmap
,
.
sendpage
=
tcp_sendpage
};
...
...
@@ -906,16 +823,16 @@ struct proto_ops inet_dgram_ops = {
.
bind
=
inet_bind
,
.
connect
=
inet_dgram_connect
,
.
socketpair
=
sock_no_socketpair
,
.
accept
=
sock_no
_accept
,
.
accept
=
inet
_accept
,
.
getname
=
inet_getname
,
.
poll
=
datagram_poll
,
.
ioctl
=
inet_ioctl
,
.
listen
=
sock_no_listen
,
.
shutdown
=
inet_shutdown
,
.
setsockopt
=
inet
_setsockopt
,
.
getsockopt
=
inet
_getsockopt
,
.
setsockopt
=
sock_common
_setsockopt
,
.
getsockopt
=
sock_common
_getsockopt
,
.
sendmsg
=
inet_sendmsg
,
.
recvmsg
=
inet
_recvmsg
,
.
recvmsg
=
sock_common
_recvmsg
,
.
mmap
=
sock_no_mmap
,
.
sendpage
=
inet_sendpage
,
};
...
...
@@ -1242,17 +1159,13 @@ EXPORT_SYMBOL(inet_dgram_connect);
EXPORT_SYMBOL
(
inet_dgram_ops
);
EXPORT_SYMBOL
(
inet_family_ops
);
EXPORT_SYMBOL
(
inet_getname
);
EXPORT_SYMBOL
(
inet_getsockopt
);
EXPORT_SYMBOL
(
inet_ioctl
);
EXPORT_SYMBOL
(
inet_listen
);
EXPORT_SYMBOL
(
inet_recvmsg
);
EXPORT_SYMBOL
(
inet_register_protosw
);
EXPORT_SYMBOL
(
inet_release
);
EXPORT_SYMBOL
(
inet_sendmsg
);
EXPORT_SYMBOL
(
inet_setsockopt
);
EXPORT_SYMBOL
(
inet_shutdown
);
EXPORT_SYMBOL
(
inet_sock_destruct
);
EXPORT_SYMBOL
(
inet_sock_release
);
EXPORT_SYMBOL
(
inet_stream_connect
);
EXPORT_SYMBOL
(
inet_stream_ops
);
EXPORT_SYMBOL
(
inet_unregister_protosw
);
...
...
net/ipv4/esp4.c
View file @
65d17d59
...
...
@@ -94,8 +94,9 @@ int esp_output(struct sk_buff **pskb)
if
(
x
->
props
.
mode
)
{
top_iph
=
(
struct
iphdr
*
)
skb_push
(
*
pskb
,
x
->
props
.
header_len
);
esph
=
(
struct
ip_esp_hdr
*
)(
top_iph
+
1
);
if
(
encap
&&
encap
->
encap_type
)
{
if
(
encap
)
{
switch
(
encap
->
encap_type
)
{
default:
case
UDP_ENCAP_ESPINUDP
:
uh
=
(
struct
udphdr
*
)
esph
;
esph
=
(
struct
ip_esp_hdr
*
)(
uh
+
1
);
...
...
@@ -106,15 +107,8 @@ int esp_output(struct sk_buff **pskb)
udpdata32
=
(
u32
*
)(
uh
+
1
);
udpdata32
[
0
]
=
udpdata32
[
1
]
=
0
;
esph
=
(
struct
ip_esp_hdr
*
)(
udpdata32
+
2
);
alen
+=
2
;
top_iph
->
protocol
=
IPPROTO_UDP
;
break
;
default:
printk
(
KERN_INFO
"esp_output(): Unhandled encap: %u
\n
"
,
encap
->
encap_type
);
top_iph
->
protocol
=
IPPROTO_ESP
;
break
;
}
}
else
top_iph
->
protocol
=
IPPROTO_ESP
;
...
...
@@ -137,8 +131,9 @@ int esp_output(struct sk_buff **pskb)
esph
=
(
struct
ip_esp_hdr
*
)
skb_push
(
*
pskb
,
x
->
props
.
header_len
);
top_iph
=
(
struct
iphdr
*
)
skb_push
(
*
pskb
,
iph
->
ihl
*
4
);
memcpy
(
top_iph
,
&
tmp_iph
,
iph
->
ihl
*
4
);
if
(
encap
&&
encap
->
encap_type
)
{
if
(
encap
)
{
switch
(
encap
->
encap_type
)
{
default:
case
UDP_ENCAP_ESPINUDP
:
uh
=
(
struct
udphdr
*
)
esph
;
esph
=
(
struct
ip_esp_hdr
*
)(
uh
+
1
);
...
...
@@ -149,15 +144,8 @@ int esp_output(struct sk_buff **pskb)
udpdata32
=
(
u32
*
)(
uh
+
1
);
udpdata32
[
0
]
=
udpdata32
[
1
]
=
0
;
esph
=
(
struct
ip_esp_hdr
*
)(
udpdata32
+
2
);
alen
+=
2
;
top_iph
->
protocol
=
IPPROTO_UDP
;
break
;
default:
printk
(
KERN_INFO
"esp_output(): Unhandled encap: %u
\n
"
,
encap
->
encap_type
);
top_iph
->
protocol
=
IPPROTO_ESP
;
break
;
}
}
else
top_iph
->
protocol
=
IPPROTO_ESP
;
...
...
@@ -313,28 +301,14 @@ int esp_input(struct xfrm_state *x, struct xfrm_decap_state *decap, struct sk_bu
switch
(
decap
->
decap_type
)
{
case
UDP_ENCAP_ESPINUDP
:
case
UDP_ENCAP_ESPINUDP_NON_IKE
:
if
((
void
*
)
uh
==
(
void
*
)
esph
)
{
printk
(
KERN_DEBUG
"esp_input(): Got ESP; expecting ESPinUDP
\n
"
);
break
;
}
encap_data
->
proto
=
AF_INET
;
encap_data
->
saddr
.
a4
=
iph
->
saddr
;
encap_data
->
sport
=
uh
->
source
;
encap_len
=
(
void
*
)
esph
-
(
void
*
)
uh
;
if
(
encap_len
!=
sizeof
(
*
uh
))
printk
(
KERN_DEBUG
"esp_input(): UDP -> ESP: too much room: %d
\n
"
,
encap_len
);
break
;
default:
printk
(
KERN_INFO
"esp_input(): processing unknown encap type: %u
\n
"
,
decap
->
decap_type
);
break
;
goto
out
;
}
}
...
...
@@ -367,11 +341,8 @@ int esp_post_input(struct xfrm_state *x, struct xfrm_decap_state *decap, struct
if
(
encap
->
encap_type
!=
decap
->
decap_type
)
return
-
EINVAL
;
/* Next, if we don't have an encap type, then ignore it */
if
(
!
encap
->
encap_type
)
return
0
;
switch
(
encap
->
encap_type
)
{
default:
case
UDP_ENCAP_ESPINUDP
:
case
UDP_ENCAP_ESPINUDP_NON_IKE
:
/*
...
...
@@ -408,11 +379,6 @@ int esp_post_input(struct xfrm_state *x, struct xfrm_decap_state *decap, struct
skb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
break
;
default:
printk
(
KERN_INFO
"esp4_post_input(): Unhandled encap type: %u
\n
"
,
encap
->
encap_type
);
break
;
}
}
return
0
;
...
...
@@ -549,20 +515,14 @@ int esp_init_state(struct xfrm_state *x, void *args)
if
(
x
->
encap
)
{
struct
xfrm_encap_tmpl
*
encap
=
x
->
encap
;
if
(
encap
->
encap_type
)
{
switch
(
encap
->
encap_type
)
{
case
UDP_ENCAP_ESPINUDP
:
x
->
props
.
header_len
+=
sizeof
(
struct
udphdr
);
break
;
case
UDP_ENCAP_ESPINUDP_NON_IKE
:
x
->
props
.
header_len
+=
sizeof
(
struct
udphdr
)
+
2
*
sizeof
(
u32
);
break
;
default:
printk
(
KERN_INFO
"esp_init_state(): Unhandled encap type: %u
\n
"
,
encap
->
encap_type
);
break
;
}
switch
(
encap
->
encap_type
)
{
default:
case
UDP_ENCAP_ESPINUDP
:
x
->
props
.
header_len
+=
sizeof
(
struct
udphdr
);
break
;
case
UDP_ENCAP_ESPINUDP_NON_IKE
:
x
->
props
.
header_len
+=
sizeof
(
struct
udphdr
)
+
2
*
sizeof
(
u32
);
break
;
}
}
x
->
data
=
esp
;
...
...
net/ipv4/raw.c
View file @
65d17d59
...
...
@@ -480,7 +480,7 @@ static void raw_close(struct sock *sk, long timeout)
*/
ip_ra_control
(
sk
,
0
,
NULL
);
inet_sock
_release
(
sk
);
sk_common
_release
(
sk
);
}
/* This gets rid of all the nasties in af_inet. -DaveM */
...
...
net/ipv4/tcp_ipv4.c
View file @
65d17d59
...
...
@@ -2094,7 +2094,7 @@ static int tcp_v4_init_sock(struct sock *sk)
return
0
;
}
static
int
tcp_v4_destroy_sock
(
struct
sock
*
sk
)
int
tcp_v4_destroy_sock
(
struct
sock
*
sk
)
{
struct
tcp_opt
*
tp
=
tcp_sk
(
sk
);
...
...
@@ -2118,6 +2118,8 @@ static int tcp_v4_destroy_sock(struct sock *sk)
return
0
;
}
EXPORT_SYMBOL
(
tcp_v4_destroy_sock
);
#ifdef CONFIG_PROC_FS
/* Proc filesystem TCP sock list dumping. */
...
...
net/ipv4/udp.c
View file @
65d17d59
...
...
@@ -931,7 +931,7 @@ int udp_disconnect(struct sock *sk, int flags)
static
void
udp_close
(
struct
sock
*
sk
,
long
timeout
)
{
inet_sock
_release
(
sk
);
sk_common
_release
(
sk
);
}
/* return:
...
...
@@ -964,6 +964,7 @@ static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb)
len
=
skb
->
tail
-
udpdata
;
switch
(
encap_type
)
{
default:
case
UDP_ENCAP_ESPINUDP
:
/* Check if this is a keepalive packet. If so, eat it. */
if
(
len
==
1
&&
udpdata
[
0
]
==
0xff
)
{
...
...
@@ -975,34 +976,6 @@ static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb)
/* Must be an IKE packet.. pass it through */
return
1
;
decaps:
/* At this point we are sure that this is an ESPinUDP packet,
* so we need to remove 'len' bytes from the packet (the UDP
* header and optional ESP marker bytes) and then modify the
* protocol to ESP, and then call into the transform receiver.
*/
/* Now we can update and verify the packet length... */
iph
=
skb
->
nh
.
iph
;
iphlen
=
iph
->
ihl
<<
2
;
iph
->
tot_len
=
htons
(
ntohs
(
iph
->
tot_len
)
-
len
);
if
(
skb
->
len
<
iphlen
+
len
)
{
/* packet is too small!?! */
return
0
;
}
/* pull the data buffer up to the ESP header and set the
* transport header to point to ESP. Keep UDP on the stack
* for later.
*/
skb
->
h
.
raw
=
skb_pull
(
skb
,
len
);
/* modify the protocol (it's ESP!) */
iph
->
protocol
=
IPPROTO_ESP
;
/* and let the caller know to send this into the ESP processor... */
return
-
1
;
case
UDP_ENCAP_ESPINUDP_NON_IKE
:
/* Check if this is a keepalive packet. If so, eat it. */
if
(
len
==
1
&&
udpdata
[
0
]
==
0xff
)
{
...
...
@@ -1012,17 +985,37 @@ static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb)
/* ESP Packet with Non-IKE marker */
len
=
sizeof
(
struct
udphdr
)
+
2
*
sizeof
(
u32
);
goto
decaps
;
}
else
/* Must be an IKE packet.. pass it through */
return
1
;
}
default:
if
(
net_ratelimit
())
printk
(
KERN_INFO
"udp_encap_rcv(): Unhandled UDP encap type: %u
\n
"
,
encap_type
);
return
1
;
/* At this point we are sure that this is an ESPinUDP packet,
* so we need to remove 'len' bytes from the packet (the UDP
* header and optional ESP marker bytes) and then modify the
* protocol to ESP, and then call into the transform receiver.
*/
/* Now we can update and verify the packet length... */
iph
=
skb
->
nh
.
iph
;
iphlen
=
iph
->
ihl
<<
2
;
iph
->
tot_len
=
htons
(
ntohs
(
iph
->
tot_len
)
-
len
);
if
(
skb
->
len
<
iphlen
+
len
)
{
/* packet is too small!?! */
return
0
;
}
/* pull the data buffer up to the ESP header and set the
* transport header to point to ESP. Keep UDP on the stack
* for later.
*/
skb
->
h
.
raw
=
skb_pull
(
skb
,
len
);
/* modify the protocol (it's ESP!) */
iph
->
protocol
=
IPPROTO_ESP
;
/* and let the caller know to send this into the ESP processor... */
return
-
1
;
#endif
}
...
...
@@ -1297,7 +1290,16 @@ static int udp_setsockopt(struct sock *sk, int level, int optname,
break
;
case
UDP_ENCAP
:
up
->
encap_type
=
val
;
switch
(
val
)
{
case
0
:
case
UDP_ENCAP_ESPINUDP
:
case
UDP_ENCAP_ESPINUDP_NON_IKE
:
up
->
encap_type
=
val
;
break
;
default:
err
=
-
ENOPROTOOPT
;
break
;
}
break
;
default:
...
...
net/ipv6/af_inet6.c
View file @
65d17d59
...
...
@@ -250,7 +250,7 @@ static int inet6_create(struct socket *sock, int protocol)
if
(
sk
->
sk_prot
->
init
)
{
int
err
=
sk
->
sk_prot
->
init
(
sk
);
if
(
err
!=
0
)
{
inet_sock
_release
(
sk
);
sk_common
_release
(
sk
);
return
err
;
}
}
...
...
@@ -510,10 +510,10 @@ struct proto_ops inet6_stream_ops = {
.
ioctl
=
inet6_ioctl
,
/* must change */
.
listen
=
inet_listen
,
/* ok */
.
shutdown
=
inet_shutdown
,
/* ok */
.
setsockopt
=
inet
_setsockopt
,
/* ok */
.
getsockopt
=
inet
_getsockopt
,
/* ok */
.
setsockopt
=
sock_common
_setsockopt
,
/* ok */
.
getsockopt
=
sock_common
_getsockopt
,
/* ok */
.
sendmsg
=
inet_sendmsg
,
/* ok */
.
recvmsg
=
inet_recvmsg
,
/* ok */
.
recvmsg
=
sock_common_recvmsg
,
/* ok */
.
mmap
=
sock_no_mmap
,
.
sendpage
=
tcp_sendpage
};
...
...
@@ -531,10 +531,10 @@ struct proto_ops inet6_dgram_ops = {
.
ioctl
=
inet6_ioctl
,
/* must change */
.
listen
=
sock_no_listen
,
/* ok */
.
shutdown
=
inet_shutdown
,
/* ok */
.
setsockopt
=
inet
_setsockopt
,
/* ok */
.
getsockopt
=
inet
_getsockopt
,
/* ok */
.
setsockopt
=
sock_common
_setsockopt
,
/* ok */
.
getsockopt
=
sock_common
_getsockopt
,
/* ok */
.
sendmsg
=
inet_sendmsg
,
/* ok */
.
recvmsg
=
inet_recvmsg
,
/* ok */
.
recvmsg
=
sock_common_recvmsg
,
/* ok */
.
mmap
=
sock_no_mmap
,
.
sendpage
=
sock_no_sendpage
,
};
...
...
net/ipv6/raw.c
View file @
65d17d59
...
...
@@ -900,7 +900,7 @@ static void rawv6_close(struct sock *sk, long timeout)
if
(
inet_sk
(
sk
)
->
num
==
IPPROTO_RAW
)
ip6_ra_control
(
sk
,
-
1
,
NULL
);
inet_sock
_release
(
sk
);
sk_common
_release
(
sk
);
}
static
int
rawv6_init_sk
(
struct
sock
*
sk
)
...
...
net/ipv6/tcp_ipv6.c
View file @
65d17d59
...
...
@@ -1892,25 +1892,9 @@ static int tcp_v6_init_sock(struct sock *sk)
static
int
tcp_v6_destroy_sock
(
struct
sock
*
sk
)
{
struct
tcp_opt
*
tp
=
tcp_sk
(
sk
);
tcp_clear_xmit_timers
(
sk
);
/* Cleanup up the write buffer. */
sk_stream_writequeue_purge
(
sk
);
/* Cleans up our, hopefully empty, out_of_order_queue. */
__skb_queue_purge
(
&
tp
->
out_of_order_queue
);
/* Clean prequeue, it must be empty really */
__skb_queue_purge
(
&
tp
->
ucopy
.
prequeue
);
/* Clean up a referenced TCP bind bucket. */
if
(
tcp_sk
(
sk
)
->
bind_hash
)
tcp_put_port
(
sk
);
atomic_dec
(
&
tcp_sockets_allocated
);
extern
int
tcp_v4_destroy_sock
(
struct
sock
*
sk
);
tcp_v4_destroy_sock
(
sk
);
return
inet6_destroy_sock
(
sk
);
}
...
...
net/ipv6/udp.c
View file @
65d17d59
...
...
@@ -358,7 +358,7 @@ int udpv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
static
void
udpv6_close
(
struct
sock
*
sk
,
long
timeout
)
{
inet_sock
_release
(
sk
);
sk_common
_release
(
sk
);
}
/*
...
...
@@ -1044,7 +1044,14 @@ static int udpv6_setsockopt(struct sock *sk, int level, int optname,
break
;
case
UDP_ENCAP
:
up
->
encap_type
=
val
;
switch
(
val
)
{
case
0
:
up
->
encap_type
=
val
;
break
;
default:
err
=
-
ENOPROTOOPT
;
break
;
}
break
;
default:
...
...
net/key/af_key.c
View file @
65d17d59
...
...
@@ -1075,6 +1075,15 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
n_type
=
ext_hdrs
[
SADB_X_EXT_NAT_T_TYPE
-
1
];
natt
->
encap_type
=
n_type
->
sadb_x_nat_t_type_type
;
switch
(
natt
->
encap_type
)
{
case
UDP_ENCAP_ESPINUDP
:
case
UDP_ENCAP_ESPINUDP_NON_IKE
:
break
;
default:
err
=
-
ENOPROTOOPT
;
goto
out
;
}
if
(
ext_hdrs
[
SADB_X_EXT_NAT_T_SPORT
-
1
])
{
struct
sadb_x_nat_t_port
*
n_port
=
ext_hdrs
[
SADB_X_EXT_NAT_T_SPORT
-
1
];
...
...
net/sched/act_api.c
View file @
65d17d59
...
...
@@ -610,6 +610,7 @@ int tca_action_flush(struct rtattr *rta, struct nlmsghdr *n, u32 pid)
unsigned
char
*
b
;
struct
nlmsghdr
*
nlh
;
struct
tcamsg
*
t
;
struct
netlink_callback
dcb
;
struct
rtattr
*
x
;
struct
rtattr
*
tb
[
TCA_ACT_MAX
+
1
];
struct
rtattr
*
kind
=
NULL
;
...
...
@@ -646,7 +647,7 @@ int tca_action_flush(struct rtattr *rta, struct nlmsghdr *n, u32 pid)
x
=
(
struct
rtattr
*
)
skb
->
tail
;
RTA_PUT
(
skb
,
TCA_ACT_TAB
,
0
,
NULL
);
err
=
a
->
ops
->
walk
(
skb
,
NULL
,
RTM_DELACTION
,
a
);
err
=
a
->
ops
->
walk
(
skb
,
&
dcb
,
RTM_DELACTION
,
a
);
if
(
0
>
err
)
{
goto
rtattr_failure
;
}
...
...
net/sctp/ipv6.c
View file @
65d17d59
...
...
@@ -641,7 +641,7 @@ struct sock *sctp_v6_create_accept_sk(struct sock *sk,
#endif
if
(
newsk
->
sk_prot
->
init
(
newsk
))
{
inet_sock
_release
(
newsk
);
sk_common
_release
(
newsk
);
newsk
=
NULL
;
}
...
...
@@ -882,10 +882,10 @@ static struct proto_ops inet6_seqpacket_ops = {
.
ioctl
=
inet6_ioctl
,
.
listen
=
sctp_inet_listen
,
.
shutdown
=
inet_shutdown
,
.
setsockopt
=
inet
_setsockopt
,
.
getsockopt
=
inet
_getsockopt
,
.
setsockopt
=
sock_common
_setsockopt
,
.
getsockopt
=
sock_common
_getsockopt
,
.
sendmsg
=
inet_sendmsg
,
.
recvmsg
=
inet
_recvmsg
,
.
recvmsg
=
sock_common
_recvmsg
,
.
mmap
=
sock_no_mmap
,
};
...
...
net/sctp/protocol.c
View file @
65d17d59
...
...
@@ -603,7 +603,7 @@ struct sock *sctp_v4_create_accept_sk(struct sock *sk,
#endif
if
(
newsk
->
sk_prot
->
init
(
newsk
))
{
inet_sock
_release
(
newsk
);
sk_common
_release
(
newsk
);
newsk
=
NULL
;
}
...
...
@@ -846,10 +846,10 @@ struct proto_ops inet_seqpacket_ops = {
.
ioctl
=
inet_ioctl
,
.
listen
=
sctp_inet_listen
,
.
shutdown
=
inet_shutdown
,
/* Looks harmless. */
.
setsockopt
=
inet
_setsockopt
,
/* IP_SOL IP_OPTION is a problem. */
.
getsockopt
=
inet
_getsockopt
,
.
setsockopt
=
sock_common
_setsockopt
,
/* IP_SOL IP_OPTION is a problem. */
.
getsockopt
=
sock_common
_getsockopt
,
.
sendmsg
=
inet_sendmsg
,
.
recvmsg
=
inet
_recvmsg
,
.
recvmsg
=
sock_common
_recvmsg
,
.
mmap
=
sock_no_mmap
,
.
sendpage
=
sock_no_sendpage
,
};
...
...
net/sctp/socket.c
View file @
65d17d59
...
...
@@ -945,11 +945,11 @@ SCTP_STATIC void sctp_close(struct sock *sk, long timeout)
sctp_local_bh_disable
();
sctp_bh_lock_sock
(
sk
);
/* Hold the sock, since
inet_sock
_release() will put sock_put()
/* Hold the sock, since
sk_common
_release() will put sock_put()
* and we have just a little more cleanup.
*/
sock_hold
(
sk
);
inet_sock
_release
(
sk
);
sk_common
_release
(
sk
);
sctp_bh_unlock_sock
(
sk
);
sctp_local_bh_enable
();
...
...
net/xfrm/xfrm_user.c
View file @
65d17d59
...
...
@@ -78,6 +78,15 @@ static int verify_encap_tmpl(struct rtattr **xfrma)
if
((
rt
->
rta_len
-
sizeof
(
*
rt
))
<
sizeof
(
*
encap
))
return
-
EINVAL
;
encap
=
RTA_DATA
(
rt
);
switch
(
encap
->
encap_type
)
{
case
UDP_ENCAP_ESPINUDP
:
case
UDP_ENCAP_ESPINUDP_NON_IKE
:
break
;
default:
return
-
ENOPROTOOPT
;
}
return
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