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
nexedi
linux
Commits
992d6a32
Commit
992d6a32
authored
Jun 12, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/net-2.6
into evo.osdl.org:/home/torvalds/v2.6/linux
parents
bd8f3917
0daefd17
Changes
29
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
216 additions
and
175 deletions
+216
-175
Documentation/networking/packet_mmap.txt
Documentation/networking/packet_mmap.txt
+0
-13
crypto/digest.c
crypto/digest.c
+21
-6
include/linux/ipv6.h
include/linux/ipv6.h
+2
-0
include/net/dst.h
include/net/dst.h
+1
-0
include/net/ipv6.h
include/net/ipv6.h
+0
-1
include/net/sock.h
include/net/sock.h
+48
-0
include/net/tcp.h
include/net/tcp.h
+5
-26
net/bluetooth/l2cap.c
net/bluetooth/l2cap.c
+2
-6
net/bluetooth/sco.c
net/bluetooth/sco.c
+2
-6
net/core/dst.c
net/core/dst.c
+3
-1
net/core/sock.c
net/core/sock.c
+42
-0
net/ipv4/netfilter/arp_tables.c
net/ipv4/netfilter/arp_tables.c
+4
-5
net/ipv4/route.c
net/ipv4/route.c
+12
-0
net/ipv4/tcp.c
net/ipv4/tcp.c
+8
-46
net/ipv4/tcp_input.c
net/ipv4/tcp_input.c
+9
-1
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_ipv4.c
+2
-2
net/ipv4/tcp_output.c
net/ipv4/tcp_output.c
+1
-2
net/ipv4/tcp_timer.c
net/ipv4/tcp_timer.c
+9
-20
net/ipv6/ah6.c
net/ipv6/ah6.c
+1
-1
net/ipv6/datagram.c
net/ipv6/datagram.c
+5
-9
net/ipv6/esp6.c
net/ipv6/esp6.c
+1
-1
net/ipv6/exthdrs.c
net/ipv6/exthdrs.c
+5
-5
net/ipv6/ip6_input.c
net/ipv6/ip6_input.c
+1
-1
net/ipv6/ip6_output.c
net/ipv6/ip6_output.c
+2
-2
net/ipv6/ndisc.c
net/ipv6/ndisc.c
+3
-3
net/ipv6/raw.c
net/ipv6/raw.c
+2
-4
net/ipv6/route.c
net/ipv6/route.c
+17
-3
net/ipv6/tcp_ipv6.c
net/ipv6/tcp_ipv6.c
+6
-7
net/ipv6/udp.c
net/ipv6/udp.c
+2
-4
No files found.
Documentation/networking/packet_mmap.txt
View file @
992d6a32
DaveM:
If you agree with it I will send two small patches to modify
kernel's configure help.
Ulisses
--------------------------------------------------------------------------------
+ ABSTRACT
--------------------------------------------------------------------------------
...
...
@@ -405,8 +397,3 @@ then poll for frames.
Jesse Brandeburg, for fixing my grammathical/spelling errors
>>> EOF
-
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
\ No newline at end of file
crypto/digest.c
View file @
992d6a32
...
...
@@ -27,13 +27,28 @@ static void update(struct crypto_tfm *tfm,
struct
scatterlist
*
sg
,
unsigned
int
nsg
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
nsg
;
i
++
)
{
char
*
p
=
crypto_kmap
(
sg
[
i
].
page
,
0
)
+
sg
[
i
].
offset
;
tfm
->
__crt_alg
->
cra_digest
.
dia_update
(
crypto_tfm_ctx
(
tfm
),
p
,
sg
[
i
].
length
);
crypto_kunmap
(
p
,
0
);
crypto_yield
(
tfm
);
struct
page
*
pg
=
sg
[
i
].
page
;
unsigned
int
offset
=
sg
[
i
].
offset
;
unsigned
int
l
=
sg
[
i
].
length
;
do
{
unsigned
int
bytes_from_page
=
min
(
l
,
((
unsigned
int
)
(
PAGE_SIZE
))
-
offset
);
char
*
p
=
crypto_kmap
(
pg
,
0
)
+
offset
;
tfm
->
__crt_alg
->
cra_digest
.
dia_update
(
crypto_tfm_ctx
(
tfm
),
p
,
bytes_from_page
);
crypto_kunmap
(
p
,
0
);
crypto_yield
(
tfm
);
offset
=
0
;
pg
++
;
l
-=
bytes_from_page
;
}
while
(
l
>
0
);
}
}
...
...
include/linux/ipv6.h
View file @
992d6a32
...
...
@@ -192,6 +192,8 @@ struct inet6_skb_parm
__u16
dst1
;
};
#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb))
struct
ipv6_pinfo
{
struct
in6_addr
saddr
;
struct
in6_addr
rcv_saddr
;
...
...
include/net/dst.h
View file @
992d6a32
...
...
@@ -89,6 +89,7 @@ struct dst_ops
int
(
*
gc
)(
void
);
struct
dst_entry
*
(
*
check
)(
struct
dst_entry
*
,
__u32
cookie
);
void
(
*
destroy
)(
struct
dst_entry
*
);
void
(
*
ifdown
)(
struct
dst_entry
*
,
int
how
);
struct
dst_entry
*
(
*
negative_advice
)(
struct
dst_entry
*
);
void
(
*
link_failure
)(
struct
sk_buff
*
);
void
(
*
update_pmtu
)(
struct
dst_entry
*
dst
,
u32
mtu
);
...
...
include/net/ipv6.h
View file @
992d6a32
...
...
@@ -356,7 +356,6 @@ extern int ip6_dst_lookup(struct sock *sk,
*/
extern
int
ip6_output
(
struct
sk_buff
**
pskb
);
extern
int
ip6_output2
(
struct
sk_buff
**
pskb
);
extern
int
ip6_forward
(
struct
sk_buff
*
skb
);
extern
int
ip6_input
(
struct
sk_buff
*
skb
);
extern
int
ip6_mc_input
(
struct
sk_buff
*
skb
);
...
...
include/net/sock.h
View file @
992d6a32
...
...
@@ -398,6 +398,21 @@ static inline int sock_flag(struct sock *sk, enum sock_flags flag)
return
test_bit
(
flag
,
&
sk
->
sk_flags
);
}
static
inline
void
sk_acceptq_removed
(
struct
sock
*
sk
)
{
sk
->
sk_ack_backlog
--
;
}
static
inline
void
sk_acceptq_added
(
struct
sock
*
sk
)
{
sk
->
sk_ack_backlog
++
;
}
static
inline
int
sk_acceptq_is_full
(
struct
sock
*
sk
)
{
return
sk
->
sk_ack_backlog
>
sk
->
sk_max_ack_backlog
;
}
/* The per-socket spinlock must be held here. */
#define sk_add_backlog(__sk, __skb) \
do { if (!(__sk)->sk_backlog.tail) { \
...
...
@@ -410,6 +425,20 @@ do { if (!(__sk)->sk_backlog.tail) { \
(__skb)->next = NULL; \
} while(0)
#define sk_wait_event(__sk, __timeo, __condition) \
({ int rc; \
release_sock(__sk); \
rc = __condition; \
if (!rc) { \
*(__timeo) = schedule_timeout(*(__timeo)); \
rc = __condition; \
} \
lock_sock(__sk); \
rc; \
})
extern
int
sk_wait_data
(
struct
sock
*
sk
,
long
*
timeo
);
/* IP protocol blocks we attach to sockets.
* socket layer -> transport layer interface
* transport -> network interface is defined by struct inet_proto
...
...
@@ -898,6 +927,11 @@ static inline void skb_set_owner_r(struct sk_buff *skb, struct sock *sk)
atomic_add
(
skb
->
truesize
,
&
sk
->
sk_rmem_alloc
);
}
extern
void
sk_reset_timer
(
struct
sock
*
sk
,
struct
timer_list
*
timer
,
unsigned
long
expires
);
extern
void
sk_stop_timer
(
struct
sock
*
sk
,
struct
timer_list
*
timer
);
static
inline
int
sock_queue_rcv_skb
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
)
{
int
err
=
0
;
...
...
@@ -1035,6 +1069,20 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
sk
->
sk_stamp
=
*
stamp
;
}
/**
* sk_eat_skb - Release a skb if it is no longer needed
* @sk - socket to eat this skb from
* @skb - socket buffer to eat
*
* This routine must be called with interrupts disabled or with the socket
* locked so that the sk_buff queue operation is ok.
*/
static
inline
void
sk_eat_skb
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
)
{
__skb_unlink
(
skb
,
&
sk
->
sk_receive_queue
);
__kfree_skb
(
skb
);
}
extern
atomic_t
netstamp_needed
;
extern
void
sock_enable_timestamp
(
struct
sock
*
sk
);
extern
void
sock_disable_timestamp
(
struct
sock
*
sk
);
...
...
include/net/tcp.h
View file @
992d6a32
...
...
@@ -989,9 +989,7 @@ static inline void tcp_clear_xmit_timer(struct sock *sk, int what)
tp
->
pending
=
0
;
#ifdef TCP_CLEAR_TIMERS
if
(
timer_pending
(
&
tp
->
retransmit_timer
)
&&
del_timer
(
&
tp
->
retransmit_timer
))
__sock_put
(
sk
);
sk_stop_timer
(
sk
,
&
tp
->
retransmit_timer
);
#endif
break
;
case
TCP_TIME_DACK
:
...
...
@@ -999,9 +997,7 @@ static inline void tcp_clear_xmit_timer(struct sock *sk, int what)
tp
->
ack
.
pending
=
0
;
#ifdef TCP_CLEAR_TIMERS
if
(
timer_pending
(
&
tp
->
delack_timer
)
&&
del_timer
(
&
tp
->
delack_timer
))
__sock_put
(
sk
);
sk_stop_timer
(
sk
,
&
tp
->
delack_timer
);
#endif
break
;
default:
...
...
@@ -1030,15 +1026,13 @@ static inline void tcp_reset_xmit_timer(struct sock *sk, int what, unsigned long
case
TCP_TIME_PROBE0
:
tp
->
pending
=
what
;
tp
->
timeout
=
jiffies
+
when
;
if
(
!
mod_timer
(
&
tp
->
retransmit_timer
,
tp
->
timeout
))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
tp
->
retransmit_timer
,
tp
->
timeout
);
break
;
case
TCP_TIME_DACK
:
tp
->
ack
.
pending
|=
TCP_ACK_TIMER
;
tp
->
ack
.
timeout
=
jiffies
+
when
;
if
(
!
mod_timer
(
&
tp
->
delack_timer
,
tp
->
ack
.
timeout
))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
tp
->
delack_timer
,
tp
->
ack
.
timeout
);
break
;
default:
...
...
@@ -1800,28 +1794,13 @@ static inline int tcp_full_space( struct sock *sk)
return
tcp_win_from_space
(
sk
->
sk_rcvbuf
);
}
static
inline
void
tcp_acceptq_removed
(
struct
sock
*
sk
)
{
sk
->
sk_ack_backlog
--
;
}
static
inline
void
tcp_acceptq_added
(
struct
sock
*
sk
)
{
sk
->
sk_ack_backlog
++
;
}
static
inline
int
tcp_acceptq_is_full
(
struct
sock
*
sk
)
{
return
sk
->
sk_ack_backlog
>
sk
->
sk_max_ack_backlog
;
}
static
inline
void
tcp_acceptq_queue
(
struct
sock
*
sk
,
struct
open_request
*
req
,
struct
sock
*
child
)
{
struct
tcp_opt
*
tp
=
tcp_sk
(
sk
);
req
->
sk
=
child
;
tcp
_acceptq_added
(
sk
);
sk
_acceptq_added
(
sk
);
if
(
!
tp
->
accept_queue_tail
)
{
tp
->
accept_queue
=
req
;
...
...
net/bluetooth/l2cap.c
View file @
992d6a32
...
...
@@ -95,17 +95,13 @@ static void l2cap_sock_timeout(unsigned long arg)
static
void
l2cap_sock_set_timer
(
struct
sock
*
sk
,
long
timeout
)
{
BT_DBG
(
"sk %p state %d timeout %ld"
,
sk
,
sk
->
sk_state
,
timeout
);
if
(
!
mod_timer
(
&
sk
->
sk_timer
,
jiffies
+
timeout
))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
sk
->
sk_timer
,
jiffies
+
timeout
);
}
static
void
l2cap_sock_clear_timer
(
struct
sock
*
sk
)
{
BT_DBG
(
"sock %p state %d"
,
sk
,
sk
->
sk_state
);
if
(
timer_pending
(
&
sk
->
sk_timer
)
&&
del_timer
(
&
sk
->
sk_timer
))
__sock_put
(
sk
);
sk_stop_timer
(
sk
,
&
sk
->
sk_timer
);
}
static
void
l2cap_sock_init_timer
(
struct
sock
*
sk
)
...
...
net/bluetooth/sco.c
View file @
992d6a32
...
...
@@ -91,17 +91,13 @@ static void sco_sock_timeout(unsigned long arg)
static
void
sco_sock_set_timer
(
struct
sock
*
sk
,
long
timeout
)
{
BT_DBG
(
"sock %p state %d timeout %ld"
,
sk
,
sk
->
sk_state
,
timeout
);
if
(
!
mod_timer
(
&
sk
->
sk_timer
,
jiffies
+
timeout
))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
sk
->
sk_timer
,
jiffies
+
timeout
);
}
static
void
sco_sock_clear_timer
(
struct
sock
*
sk
)
{
BT_DBG
(
"sock %p state %d"
,
sk
,
sk
->
sk_state
);
if
(
timer_pending
(
&
sk
->
sk_timer
)
&&
del_timer
(
&
sk
->
sk_timer
))
__sock_put
(
sk
);
sk_stop_timer
(
sk
,
&
sk
->
sk_timer
);
}
static
void
sco_sock_init_timer
(
struct
sock
*
sk
)
...
...
net/core/dst.c
View file @
992d6a32
...
...
@@ -230,8 +230,8 @@ static int dst_dev_event(struct notifier_block *this, unsigned long event, void
if
(
event
!=
NETDEV_DOWN
&&
dst
->
output
==
dst_discard_out
)
{
dst
->
dev
=
&
loopback_dev
;
dev_put
(
dev
);
dev_hold
(
&
loopback_dev
);
dev_put
(
dev
);
dst
->
output
=
dst_discard_out
;
if
(
dst
->
neighbour
&&
dst
->
neighbour
->
dev
==
dev
)
{
dst
->
neighbour
->
dev
=
&
loopback_dev
;
...
...
@@ -242,6 +242,8 @@ static int dst_dev_event(struct notifier_block *this, unsigned long event, void
dst
->
input
=
dst_discard_in
;
dst
->
output
=
dst_discard_out
;
}
if
(
dst
->
ops
->
ifdown
)
dst
->
ops
->
ifdown
(
dst
,
event
!=
NETDEV_DOWN
);
}
}
spin_unlock_bh
(
&
dst_lock
);
...
...
net/core/sock.c
View file @
992d6a32
...
...
@@ -917,6 +917,31 @@ void __release_sock(struct sock *sk)
}
while
((
skb
=
sk
->
sk_backlog
.
head
)
!=
NULL
);
}
/**
* sk_wait_data - wait for data to arrive at sk_receive_queue
* sk - sock to wait on
* timeo - for how long
*
* Now socket state including sk->sk_err is changed only under lock,
* hence we may omit checks after joining wait queue.
* We check receive queue before schedule() only as optimization;
* it is very likely that release_sock() added new data.
*/
int
sk_wait_data
(
struct
sock
*
sk
,
long
*
timeo
)
{
int
rc
;
DEFINE_WAIT
(
wait
);
prepare_to_wait
(
sk
->
sk_sleep
,
&
wait
,
TASK_INTERRUPTIBLE
);
set_bit
(
SOCK_ASYNC_WAITDATA
,
&
sk
->
sk_socket
->
flags
);
rc
=
sk_wait_event
(
sk
,
timeo
,
!
skb_queue_empty
(
&
sk
->
sk_receive_queue
));
clear_bit
(
SOCK_ASYNC_WAITDATA
,
&
sk
->
sk_socket
->
flags
);
finish_wait
(
sk
->
sk_sleep
,
&
wait
);
return
rc
;
}
EXPORT_SYMBOL
(
sk_wait_data
);
/*
* Set of default routines for initialising struct proto_ops when
* the protocol does not support a particular function. In certain
...
...
@@ -1099,6 +1124,23 @@ void sk_send_sigurg(struct sock *sk)
sk_wake_async
(
sk
,
3
,
POLL_PRI
);
}
void
sk_reset_timer
(
struct
sock
*
sk
,
struct
timer_list
*
timer
,
unsigned
long
expires
)
{
if
(
!
mod_timer
(
timer
,
expires
))
sock_hold
(
sk
);
}
EXPORT_SYMBOL
(
sk_reset_timer
);
void
sk_stop_timer
(
struct
sock
*
sk
,
struct
timer_list
*
timer
)
{
if
(
timer_pending
(
timer
)
&&
del_timer
(
timer
))
__sock_put
(
sk
);
}
EXPORT_SYMBOL
(
sk_stop_timer
);
void
sock_init_data
(
struct
socket
*
sock
,
struct
sock
*
sk
)
{
skb_queue_head_init
(
&
sk
->
sk_receive_queue
);
...
...
net/ipv4/netfilter/arp_tables.c
View file @
992d6a32
...
...
@@ -179,11 +179,10 @@ static inline int arp_packet_match(const struct arphdr *arphdr,
return
0
;
}
/* Look for ifname matches; this should unroll nicely. */
for
(
i
=
0
,
ret
=
0
;
i
<
IFNAMSIZ
/
sizeof
(
unsigned
long
);
i
++
)
{
ret
|=
(((
const
unsigned
long
*
)
indev
)[
i
]
^
((
const
unsigned
long
*
)
arpinfo
->
iniface
)[
i
])
&
((
const
unsigned
long
*
)
arpinfo
->
iniface_mask
)[
i
];
/* Look for ifname matches. */
for
(
i
=
0
,
ret
=
0
;
i
<
IFNAMSIZ
;
i
++
)
{
ret
|=
(
indev
[
i
]
^
arpinfo
->
iniface
[
i
])
&
arpinfo
->
iniface_mask
[
i
];
}
if
(
FWINV
(
ret
!=
0
,
ARPT_INV_VIA_IN
))
{
...
...
net/ipv4/route.c
View file @
992d6a32
...
...
@@ -138,6 +138,7 @@ static struct timer_list rt_secret_timer;
static
struct
dst_entry
*
ipv4_dst_check
(
struct
dst_entry
*
dst
,
u32
cookie
);
static
void
ipv4_dst_destroy
(
struct
dst_entry
*
dst
);
static
void
ipv4_dst_ifdown
(
struct
dst_entry
*
dst
,
int
how
);
static
struct
dst_entry
*
ipv4_negative_advice
(
struct
dst_entry
*
dst
);
static
void
ipv4_link_failure
(
struct
sk_buff
*
skb
);
static
void
ip_rt_update_pmtu
(
struct
dst_entry
*
dst
,
u32
mtu
);
...
...
@@ -150,6 +151,7 @@ static struct dst_ops ipv4_dst_ops = {
.
gc
=
rt_garbage_collect
,
.
check
=
ipv4_dst_check
,
.
destroy
=
ipv4_dst_destroy
,
.
ifdown
=
ipv4_dst_ifdown
,
.
negative_advice
=
ipv4_negative_advice
,
.
link_failure
=
ipv4_link_failure
,
.
update_pmtu
=
ip_rt_update_pmtu
,
...
...
@@ -1336,6 +1338,16 @@ static void ipv4_dst_destroy(struct dst_entry *dst)
}
}
static
void
ipv4_dst_ifdown
(
struct
dst_entry
*
dst
,
int
how
)
{
struct
rtable
*
rt
=
(
struct
rtable
*
)
dst
;
struct
in_device
*
idev
=
rt
->
idev
;
if
(
idev
)
{
rt
->
idev
=
NULL
;
in_dev_put
(
idev
);
}
}
static
void
ipv4_link_failure
(
struct
sk_buff
*
skb
)
{
struct
rtable
*
rt
;
...
...
net/ipv4/tcp.c
View file @
992d6a32
...
...
@@ -648,7 +648,7 @@ static void tcp_listen_stop (struct sock *sk)
local_bh_enable
();
sock_put
(
child
);
tcp
_acceptq_removed
(
sk
);
sk
_acceptq_removed
(
sk
);
tcp_openreq_fastfree
(
req
);
}
BUG_TRAP
(
!
sk
->
sk_ack_backlog
);
...
...
@@ -1296,18 +1296,6 @@ static int tcp_recv_urg(struct sock *sk, long timeo,
return
-
EAGAIN
;
}
/*
* Release a skb if it is no longer needed. This routine
* must be called with interrupts disabled or with the
* socket locked so that the sk_buff queue operation is ok.
*/
static
inline
void
tcp_eat_skb
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
)
{
__skb_unlink
(
skb
,
&
sk
->
sk_receive_queue
);
__kfree_skb
(
skb
);
}
/* Clean up the receive buffer for full frames taken by the user,
* then send an ACK if necessary. COPIED is the number of bytes
* tcp_recvmsg has given to the user so far, it speeds up the
...
...
@@ -1368,31 +1356,6 @@ static void cleanup_rbuf(struct sock *sk, int copied)
tcp_send_ack
(
sk
);
}
/* Now socket state including sk->sk_err is changed only under lock,
* hence we may omit checks after joining wait queue.
* We check receive queue before schedule() only as optimization;
* it is very likely that release_sock() added new data.
*/
static
long
tcp_data_wait
(
struct
sock
*
sk
,
long
timeo
)
{
DEFINE_WAIT
(
wait
);
prepare_to_wait
(
sk
->
sk_sleep
,
&
wait
,
TASK_INTERRUPTIBLE
);
set_bit
(
SOCK_ASYNC_WAITDATA
,
&
sk
->
sk_socket
->
flags
);
release_sock
(
sk
);
if
(
skb_queue_empty
(
&
sk
->
sk_receive_queue
))
timeo
=
schedule_timeout
(
timeo
);
lock_sock
(
sk
);
clear_bit
(
SOCK_ASYNC_WAITDATA
,
&
sk
->
sk_socket
->
flags
);
finish_wait
(
sk
->
sk_sleep
,
&
wait
);
return
timeo
;
}
static
void
tcp_prequeue_process
(
struct
sock
*
sk
)
{
struct
sk_buff
*
skb
;
...
...
@@ -1473,11 +1436,11 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
break
;
}
if
(
skb
->
h
.
th
->
fin
)
{
tcp
_eat_skb
(
sk
,
skb
);
sk
_eat_skb
(
sk
,
skb
);
++
seq
;
break
;
}
tcp
_eat_skb
(
sk
,
skb
);
sk
_eat_skb
(
sk
,
skb
);
if
(
!
desc
->
count
)
break
;
}
...
...
@@ -1672,9 +1635,8 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
/* Do not sleep, just process backlog. */
release_sock
(
sk
);
lock_sock
(
sk
);
}
else
{
timeo
=
tcp_data_wait
(
sk
,
timeo
);
}
}
else
sk_wait_data
(
sk
,
&
timeo
);
if
(
user_recv
)
{
int
chunk
;
...
...
@@ -1758,14 +1720,14 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
if
(
skb
->
h
.
th
->
fin
)
goto
found_fin_ok
;
if
(
!
(
flags
&
MSG_PEEK
))
tcp
_eat_skb
(
sk
,
skb
);
sk
_eat_skb
(
sk
,
skb
);
continue
;
found_fin_ok:
/* Process the FIN. */
++*
seq
;
if
(
!
(
flags
&
MSG_PEEK
))
tcp
_eat_skb
(
sk
,
skb
);
sk
_eat_skb
(
sk
,
skb
);
break
;
}
while
(
len
>
0
);
...
...
@@ -2263,7 +2225,7 @@ struct sock *tcp_accept(struct sock *sk, int flags, int *err)
tp
->
accept_queue_tail
=
NULL
;
newsk
=
req
->
sk
;
tcp
_acceptq_removed
(
sk
);
sk
_acceptq_removed
(
sk
);
tcp_openreq_fastfree
(
req
);
BUG_TRAP
(
newsk
->
sk_state
!=
TCP_SYN_RECV
);
release_sock
(
sk
);
...
...
net/ipv4/tcp_input.c
View file @
992d6a32
...
...
@@ -463,6 +463,8 @@ void tcp_rcv_space_adjust(struct sock *sk)
tp
->
rcvq_space
.
space
=
space
;
if
(
sysctl_tcp_moderate_rcvbuf
)
{
int
new_clamp
=
space
;
/* Receive space grows, normalize in order to
* take into account packet headers and sk_buff
* structure overhead.
...
...
@@ -472,10 +474,16 @@ void tcp_rcv_space_adjust(struct sock *sk)
space
=
1
;
rcvmem
=
(
tp
->
advmss
+
MAX_TCP_HEADER
+
16
+
sizeof
(
struct
sk_buff
));
while
(
tcp_win_from_space
(
rcvmem
)
<
tp
->
advmss
)
rcvmem
+=
128
;
space
*=
rcvmem
;
space
=
min
(
space
,
sysctl_tcp_rmem
[
2
]);
if
(
space
>
sk
->
sk_rcvbuf
)
if
(
space
>
sk
->
sk_rcvbuf
)
{
sk
->
sk_rcvbuf
=
space
;
/* Make the window clamp follow along. */
tp
->
window_clamp
=
new_clamp
;
}
}
}
...
...
net/ipv4/tcp_ipv4.c
View file @
992d6a32
...
...
@@ -1442,7 +1442,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
* clogging syn queue with openreqs with exponentially increasing
* timeout.
*/
if
(
tcp
_acceptq_is_full
(
sk
)
&&
tcp_synq_young
(
sk
)
>
1
)
if
(
sk
_acceptq_is_full
(
sk
)
&&
tcp_synq_young
(
sk
)
>
1
)
goto
drop
;
req
=
tcp_openreq_alloc
();
...
...
@@ -1567,7 +1567,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
struct
tcp_opt
*
newtp
;
struct
sock
*
newsk
;
if
(
tcp
_acceptq_is_full
(
sk
))
if
(
sk
_acceptq_is_full
(
sk
))
goto
exit_overflow
;
if
(
!
dst
&&
(
dst
=
tcp_v4_route_req
(
sk
,
req
))
==
NULL
)
...
...
net/ipv4/tcp_output.c
View file @
992d6a32
...
...
@@ -1389,8 +1389,7 @@ void tcp_send_delayed_ack(struct sock *sk)
}
tp
->
ack
.
pending
|=
TCP_ACK_SCHED
|
TCP_ACK_TIMER
;
tp
->
ack
.
timeout
=
timeout
;
if
(
!
mod_timer
(
&
tp
->
delack_timer
,
timeout
))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
tp
->
delack_timer
,
timeout
);
}
/* This routine sends an ack and also updates the window. */
...
...
net/ipv4/tcp_timer.c
View file @
992d6a32
...
...
@@ -68,18 +68,13 @@ void tcp_clear_xmit_timers(struct sock *sk)
struct
tcp_opt
*
tp
=
tcp_sk
(
sk
);
tp
->
pending
=
0
;
if
(
timer_pending
(
&
tp
->
retransmit_timer
)
&&
del_timer
(
&
tp
->
retransmit_timer
))
__sock_put
(
sk
);
sk_stop_timer
(
sk
,
&
tp
->
retransmit_timer
);
tp
->
ack
.
pending
=
0
;
tp
->
ack
.
blocked
=
0
;
if
(
timer_pending
(
&
tp
->
delack_timer
)
&&
del_timer
(
&
tp
->
delack_timer
))
__sock_put
(
sk
);
sk_stop_timer
(
sk
,
&
tp
->
delack_timer
);
if
(
timer_pending
(
&
sk
->
sk_timer
)
&&
del_timer
(
&
sk
->
sk_timer
))
__sock_put
(
sk
);
sk_stop_timer
(
sk
,
&
sk
->
sk_timer
);
}
static
void
tcp_write_err
(
struct
sock
*
sk
)
...
...
@@ -218,8 +213,7 @@ static void tcp_delack_timer(unsigned long data)
/* Try again later. */
tp
->
ack
.
blocked
=
1
;
NET_INC_STATS_BH
(
DelayedACKLocked
);
if
(
!
mod_timer
(
&
tp
->
delack_timer
,
jiffies
+
TCP_DELACK_MIN
))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
tp
->
delack_timer
,
jiffies
+
TCP_DELACK_MIN
);
goto
out_unlock
;
}
...
...
@@ -229,8 +223,7 @@ static void tcp_delack_timer(unsigned long data)
goto
out
;
if
(
time_after
(
tp
->
ack
.
timeout
,
jiffies
))
{
if
(
!
mod_timer
(
&
tp
->
delack_timer
,
tp
->
ack
.
timeout
))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
tp
->
delack_timer
,
tp
->
ack
.
timeout
);
goto
out
;
}
tp
->
ack
.
pending
&=
~
TCP_ACK_TIMER
;
...
...
@@ -429,8 +422,7 @@ static void tcp_write_timer(unsigned long data)
bh_lock_sock
(
sk
);
if
(
sock_owned_by_user
(
sk
))
{
/* Try again later */
if
(
!
mod_timer
(
&
tp
->
retransmit_timer
,
jiffies
+
(
HZ
/
20
)))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
tp
->
retransmit_timer
,
jiffies
+
(
HZ
/
20
));
goto
out_unlock
;
}
...
...
@@ -438,8 +430,7 @@ static void tcp_write_timer(unsigned long data)
goto
out
;
if
(
time_after
(
tp
->
timeout
,
jiffies
))
{
if
(
!
mod_timer
(
&
tp
->
retransmit_timer
,
tp
->
timeout
))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
tp
->
retransmit_timer
,
tp
->
timeout
);
goto
out
;
}
...
...
@@ -557,14 +548,12 @@ static void tcp_synack_timer(struct sock *sk)
void
tcp_delete_keepalive_timer
(
struct
sock
*
sk
)
{
if
(
timer_pending
(
&
sk
->
sk_timer
)
&&
del_timer
(
&
sk
->
sk_timer
))
__sock_put
(
sk
);
sk_stop_timer
(
sk
,
&
sk
->
sk_timer
);
}
void
tcp_reset_keepalive_timer
(
struct
sock
*
sk
,
unsigned
long
len
)
{
if
(
!
mod_timer
(
&
sk
->
sk_timer
,
jiffies
+
len
))
sock_hold
(
sk
);
sk_reset_timer
(
sk
,
&
sk
->
sk_timer
,
jiffies
+
len
);
}
void
tcp_set_keepalive
(
struct
sock
*
sk
,
int
val
)
...
...
net/ipv6/ah6.c
View file @
992d6a32
...
...
@@ -363,7 +363,7 @@ void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
struct
ip_auth_hdr
*
ah
=
(
struct
ip_auth_hdr
*
)(
skb
->
data
+
offset
);
struct
xfrm_state
*
x
;
if
(
type
!=
ICMPV6_DEST_UNREACH
||
if
(
type
!=
ICMPV6_DEST_UNREACH
&&
type
!=
ICMPV6_PKT_TOOBIG
)
return
;
...
...
net/ipv6/datagram.c
View file @
992d6a32
...
...
@@ -145,10 +145,8 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
(
struct
in6_addr
*
)(
skb
->
nh
.
raw
+
serr
->
addr_offset
));
if
(
np
->
sndflow
)
sin
->
sin6_flowinfo
=
*
(
u32
*
)(
skb
->
nh
.
raw
+
serr
->
addr_offset
-
24
)
&
IPV6_FLOWINFO_MASK
;
if
(
ipv6_addr_type
(
&
sin
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
{
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
sin
->
sin6_scope_id
=
opt
->
iif
;
}
if
(
ipv6_addr_type
(
&
sin
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
sin
->
sin6_scope_id
=
IP6CB
(
skb
)
->
iif
;
}
else
{
ipv6_addr_set
(
&
sin
->
sin6_addr
,
0
,
0
,
htonl
(
0xffff
),
...
...
@@ -167,10 +165,8 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
ipv6_addr_copy
(
&
sin
->
sin6_addr
,
&
skb
->
nh
.
ipv6h
->
saddr
);
if
(
np
->
rxopt
.
all
)
datagram_recv_ctl
(
sk
,
msg
,
skb
);
if
(
ipv6_addr_type
(
&
sin
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
{
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
sin
->
sin6_scope_id
=
opt
->
iif
;
}
if
(
ipv6_addr_type
(
&
sin
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
sin
->
sin6_scope_id
=
IP6CB
(
skb
)
->
iif
;
}
else
{
struct
inet_opt
*
inet
=
inet_sk
(
sk
);
...
...
@@ -211,7 +207,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
int
datagram_recv_ctl
(
struct
sock
*
sk
,
struct
msghdr
*
msg
,
struct
sk_buff
*
skb
)
{
struct
ipv6_pinfo
*
np
=
inet6_sk
(
sk
);
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
struct
inet6_skb_parm
*
opt
=
IP6CB
(
skb
)
;
if
(
np
->
rxopt
.
bits
.
rxinfo
)
{
struct
in6_pktinfo
src_info
;
...
...
net/ipv6/esp6.c
View file @
992d6a32
...
...
@@ -324,7 +324,7 @@ void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
struct
ipv6_esp_hdr
*
esph
=
(
struct
ipv6_esp_hdr
*
)(
skb
->
data
+
offset
);
struct
xfrm_state
*
x
;
if
(
type
!=
ICMPV6_DEST_UNREACH
||
if
(
type
!=
ICMPV6_DEST_UNREACH
&&
type
!=
ICMPV6_PKT_TOOBIG
)
return
;
...
...
net/ipv6/exthdrs.c
View file @
992d6a32
...
...
@@ -155,7 +155,7 @@ static struct tlvtype_proc tlvprocdestopt_lst[] = {
static
int
ipv6_destopt_rcv
(
struct
sk_buff
**
skbp
,
unsigned
int
*
nhoffp
)
{
struct
sk_buff
*
skb
=
*
skbp
;
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
struct
inet6_skb_parm
*
opt
=
IP6CB
(
skb
)
;
if
(
!
pskb_may_pull
(
skb
,
(
skb
->
h
.
raw
-
skb
->
data
)
+
8
)
||
!
pskb_may_pull
(
skb
,
(
skb
->
h
.
raw
-
skb
->
data
)
+
((
skb
->
h
.
raw
[
1
]
+
1
)
<<
3
)))
{
...
...
@@ -217,7 +217,7 @@ void __init ipv6_nodata_init(void)
static
int
ipv6_rthdr_rcv
(
struct
sk_buff
**
skbp
,
unsigned
int
*
nhoffp
)
{
struct
sk_buff
*
skb
=
*
skbp
;
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
struct
inet6_skb_parm
*
opt
=
IP6CB
(
skb
)
;
struct
in6_addr
*
addr
;
struct
in6_addr
daddr
;
int
n
,
i
;
...
...
@@ -288,7 +288,7 @@ static int ipv6_rthdr_rcv(struct sk_buff **skbp, unsigned int *nhoffp)
return
-
1
;
}
*
skbp
=
skb
=
skb2
;
opt
=
(
struct
inet6_skb_parm
*
)
skb2
->
cb
;
opt
=
IP6CB
(
skb2
)
;
hdr
=
(
struct
ipv6_rt_hdr
*
)
skb2
->
h
.
raw
;
}
...
...
@@ -418,7 +418,7 @@ ipv6_invert_rthdr(struct sock *sk, struct ipv6_rt_hdr *hdr)
static
int
ipv6_hop_ra
(
struct
sk_buff
*
skb
,
int
optoff
)
{
if
(
skb
->
nh
.
raw
[
optoff
+
1
]
==
2
)
{
((
struct
inet6_skb_parm
*
)
skb
->
c
b
)
->
ra
=
optoff
;
IP6CB
(
sk
b
)
->
ra
=
optoff
;
return
1
;
}
LIMIT_NETDEBUG
(
...
...
@@ -482,7 +482,7 @@ static struct tlvtype_proc tlvprochopopt_lst[] = {
int
ipv6_parse_hopopts
(
struct
sk_buff
*
skb
,
int
nhoff
)
{
((
struct
inet6_skb_parm
*
)
skb
->
c
b
)
->
hop
=
sizeof
(
struct
ipv6hdr
);
IP6CB
(
sk
b
)
->
hop
=
sizeof
(
struct
ipv6hdr
);
if
(
ip6_parse_tlv
(
tlvprochopopt_lst
,
skb
))
return
sizeof
(
struct
ipv6hdr
);
return
-
1
;
...
...
net/ipv6/ip6_input.c
View file @
992d6a32
...
...
@@ -74,7 +74,7 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt
/* Store incoming device index. When the packet will
be queued, we cannot refer to skb->dev anymore.
*/
((
struct
inet6_skb_parm
*
)
skb
->
c
b
)
->
iif
=
dev
->
ifindex
;
IP6CB
(
sk
b
)
->
iif
=
dev
->
ifindex
;
if
(
skb
->
len
<
sizeof
(
struct
ipv6hdr
))
goto
err
;
...
...
net/ipv6/ip6_output.c
View file @
992d6a32
...
...
@@ -107,7 +107,7 @@ static int ip6_dev_loopback_xmit(struct sk_buff *newskb)
}
int
ip6_output2
(
struct
sk_buff
**
pskb
)
static
int
ip6_output2
(
struct
sk_buff
**
pskb
)
{
struct
sk_buff
*
skb
=
*
pskb
;
struct
dst_entry
*
dst
=
skb
->
dst
;
...
...
@@ -349,7 +349,7 @@ int ip6_forward(struct sk_buff *skb)
{
struct
dst_entry
*
dst
=
skb
->
dst
;
struct
ipv6hdr
*
hdr
=
skb
->
nh
.
ipv6h
;
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
struct
inet6_skb_parm
*
opt
=
IP6CB
(
skb
)
;
if
(
ipv6_devconf
.
forwarding
==
0
)
goto
error
;
...
...
net/ipv6/ndisc.c
View file @
992d6a32
...
...
@@ -395,7 +395,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
ndisc_flow_init
(
&
fl
,
NDISC_NEIGHBOUR_ADVERTISEMENT
,
src_addr
,
daddr
);
dst
=
ndisc_dst_alloc
(
dev
,
neigh
,
daddr
,
ip6_output
2
);
dst
=
ndisc_dst_alloc
(
dev
,
neigh
,
daddr
,
ip6_output
);
if
(
!
dst
)
return
;
...
...
@@ -486,7 +486,7 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
ndisc_flow_init
(
&
fl
,
NDISC_NEIGHBOUR_SOLICITATION
,
saddr
,
daddr
);
dst
=
ndisc_dst_alloc
(
dev
,
neigh
,
daddr
,
ip6_output
2
);
dst
=
ndisc_dst_alloc
(
dev
,
neigh
,
daddr
,
ip6_output
);
if
(
!
dst
)
return
;
...
...
@@ -562,7 +562,7 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
ndisc_flow_init
(
&
fl
,
NDISC_ROUTER_SOLICITATION
,
saddr
,
daddr
);
dst
=
ndisc_dst_alloc
(
dev
,
NULL
,
daddr
,
ip6_output
2
);
dst
=
ndisc_dst_alloc
(
dev
,
NULL
,
daddr
,
ip6_output
);
if
(
!
dst
)
return
;
...
...
net/ipv6/raw.c
View file @
992d6a32
...
...
@@ -409,10 +409,8 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
ipv6_addr_copy
(
&
sin6
->
sin6_addr
,
&
skb
->
nh
.
ipv6h
->
saddr
);
sin6
->
sin6_flowinfo
=
0
;
sin6
->
sin6_scope_id
=
0
;
if
(
ipv6_addr_type
(
&
sin6
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
{
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
sin6
->
sin6_scope_id
=
opt
->
iif
;
}
if
(
ipv6_addr_type
(
&
sin6
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
sin6
->
sin6_scope_id
=
IP6CB
(
skb
)
->
iif
;
}
sock_recv_timestamp
(
msg
,
sk
,
skb
);
...
...
net/ipv6/route.c
View file @
992d6a32
...
...
@@ -84,6 +84,7 @@ static struct rt6_info * ip6_rt_copy(struct rt6_info *ort);
static
struct
dst_entry
*
ip6_dst_check
(
struct
dst_entry
*
dst
,
u32
cookie
);
static
struct
dst_entry
*
ip6_negative_advice
(
struct
dst_entry
*
);
static
void
ip6_dst_destroy
(
struct
dst_entry
*
);
static
void
ip6_dst_ifdown
(
struct
dst_entry
*
,
int
how
);
static
int
ip6_dst_gc
(
void
);
static
int
ip6_pkt_discard
(
struct
sk_buff
*
skb
);
...
...
@@ -98,6 +99,7 @@ static struct dst_ops ip6_dst_ops = {
.
gc_thresh
=
1024
,
.
check
=
ip6_dst_check
,
.
destroy
=
ip6_dst_destroy
,
.
ifdown
=
ip6_dst_ifdown
,
.
negative_advice
=
ip6_negative_advice
,
.
link_failure
=
ip6_link_failure
,
.
update_pmtu
=
ip6_rt_update_pmtu
,
...
...
@@ -143,9 +145,17 @@ static __inline__ struct rt6_info *ip6_dst_alloc(void)
static
void
ip6_dst_destroy
(
struct
dst_entry
*
dst
)
{
struct
rt6_info
*
rt
=
(
struct
rt6_info
*
)
dst
;
if
(
rt
->
rt6i_idev
!=
NULL
)
in6_dev_put
(
rt
->
rt6i_idev
);
struct
inet6_dev
*
idev
=
rt
->
rt6i_idev
;
if
(
idev
!=
NULL
)
{
rt
->
rt6i_idev
=
NULL
;
in6_dev_put
(
idev
);
}
}
static
void
ip6_dst_ifdown
(
struct
dst_entry
*
dst
,
int
how
)
{
ip6_dst_destroy
(
dst
);
}
/*
...
...
@@ -573,6 +583,8 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, u32 mtu)
/* Protected by rt6_lock. */
static
struct
dst_entry
*
ndisc_dst_gc_list
;
static
int
ipv6_get_mtu
(
struct
net_device
*
dev
);
static
inline
unsigned
int
ipv6_advmss
(
unsigned
int
mtu
);
struct
dst_entry
*
ndisc_dst_alloc
(
struct
net_device
*
dev
,
struct
neighbour
*
neigh
,
...
...
@@ -598,6 +610,8 @@ struct dst_entry *ndisc_dst_alloc(struct net_device *dev,
rt
->
rt6i_metric
=
0
;
atomic_set
(
&
rt
->
u
.
dst
.
__refcnt
,
1
);
rt
->
u
.
dst
.
metrics
[
RTAX_HOPLIMIT
-
1
]
=
255
;
rt
->
u
.
dst
.
metrics
[
RTAX_MTU
-
1
]
=
ipv6_get_mtu
(
rt
->
rt6i_dev
);
rt
->
u
.
dst
.
metrics
[
RTAX_ADVMSS
-
1
]
=
ipv6_advmss
(
dst_pmtu
(
&
rt
->
u
.
dst
));
rt
->
u
.
dst
.
output
=
output
;
write_lock_bh
(
&
rt6_lock
);
...
...
net/ipv6/tcp_ipv6.c
View file @
992d6a32
...
...
@@ -536,8 +536,7 @@ static int tcp_v6_hash_connect(struct sock *sk)
static
__inline__
int
tcp_v6_iif
(
struct
sk_buff
*
skb
)
{
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
return
opt
->
iif
;
return
IP6CB
(
skb
)
->
iif
;
}
static
int
tcp_v6_connect
(
struct
sock
*
sk
,
struct
sockaddr
*
uaddr
,
...
...
@@ -879,7 +878,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct open_request *req,
np
->
rxopt
.
bits
.
srcrt
==
2
&&
req
->
af
.
v6_req
.
pktopts
)
{
struct
sk_buff
*
pktopts
=
req
->
af
.
v6_req
.
pktopts
;
struct
inet6_skb_parm
*
rxopt
=
(
struct
inet6_skb_parm
*
)
pktopts
->
cb
;
struct
inet6_skb_parm
*
rxopt
=
IP6CB
(
pktopts
)
;
if
(
rxopt
->
srcrt
)
opt
=
ipv6_invert_rthdr
(
sk
,
(
struct
ipv6_rt_hdr
*
)(
pktopts
->
nh
.
raw
+
rxopt
->
srcrt
));
}
...
...
@@ -932,7 +931,7 @@ static struct or_calltable or_ipv6 = {
static
int
ipv6_opt_accepted
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
)
{
struct
ipv6_pinfo
*
np
=
inet6_sk
(
sk
);
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
struct
inet6_skb_parm
*
opt
=
IP6CB
(
skb
)
;
if
(
np
->
rxopt
.
all
)
{
if
((
opt
->
hop
&&
np
->
rxopt
.
bits
.
hopopts
)
||
...
...
@@ -1183,7 +1182,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
goto
drop
;
}
if
(
tcp
_acceptq_is_full
(
sk
)
&&
tcp_synq_young
(
sk
)
>
1
)
if
(
sk
_acceptq_is_full
(
sk
)
&&
tcp_synq_young
(
sk
)
>
1
)
goto
drop
;
req
=
tcp_openreq_alloc
();
...
...
@@ -1300,12 +1299,12 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
opt
=
np
->
opt
;
if
(
tcp
_acceptq_is_full
(
sk
))
if
(
sk
_acceptq_is_full
(
sk
))
goto
out_overflow
;
if
(
np
->
rxopt
.
bits
.
srcrt
==
2
&&
opt
==
NULL
&&
req
->
af
.
v6_req
.
pktopts
)
{
struct
inet6_skb_parm
*
rxopt
=
(
struct
inet6_skb_parm
*
)
req
->
af
.
v6_req
.
pktopts
->
cb
;
struct
inet6_skb_parm
*
rxopt
=
IP6CB
(
req
->
af
.
v6_req
.
pktopts
)
;
if
(
rxopt
->
srcrt
)
opt
=
ipv6_invert_rthdr
(
sk
,
(
struct
ipv6_rt_hdr
*
)(
req
->
af
.
v6_req
.
pktopts
->
nh
.
raw
+
rxopt
->
srcrt
));
}
...
...
net/ipv6/udp.c
View file @
992d6a32
...
...
@@ -432,10 +432,8 @@ static int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
if
(
np
->
rxopt
.
all
)
datagram_recv_ctl
(
sk
,
msg
,
skb
);
if
(
ipv6_addr_type
(
&
sin6
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
{
struct
inet6_skb_parm
*
opt
=
(
struct
inet6_skb_parm
*
)
skb
->
cb
;
sin6
->
sin6_scope_id
=
opt
->
iif
;
}
if
(
ipv6_addr_type
(
&
sin6
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
sin6
->
sin6_scope_id
=
IP6CB
(
skb
)
->
iif
;
}
}
err
=
copied
;
...
...
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