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
8c56a347
Commit
8c56a347
authored
Oct 26, 2007
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/acme/net-2.6
parents
d892afe2
24c667db
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
79 additions
and
43 deletions
+79
-43
include/linux/dccp.h
include/linux/dccp.h
+6
-6
net/dccp/ccids/ccid2.c
net/dccp/ccids/ccid2.c
+0
-4
net/dccp/ccids/ccid3.c
net/dccp/ccids/ccid3.c
+7
-8
net/dccp/input.c
net/dccp/input.c
+39
-9
net/dccp/ipv4.c
net/dccp/ipv4.c
+3
-3
net/dccp/ipv6.c
net/dccp/ipv6.c
+2
-2
net/dccp/options.c
net/dccp/options.c
+22
-11
No files found.
include/linux/dccp.h
View file @
8c56a347
...
...
@@ -144,6 +144,8 @@ enum dccp_reset_codes {
DCCP_RESET_CODE_TOO_BUSY
,
DCCP_RESET_CODE_BAD_INIT_COOKIE
,
DCCP_RESET_CODE_AGGRESSION_PENALTY
,
DCCP_MAX_RESET_CODES
/* Leave at the end! */
};
/* DCCP options */
...
...
@@ -270,10 +272,9 @@ static inline struct dccp_hdr *dccp_zeroed_hdr(struct sk_buff *skb, int headlen)
return
memset
(
skb_transport_header
(
skb
),
0
,
headlen
);
}
static
inline
struct
dccp_hdr_ext
*
dccp_hdrx
(
const
struct
sk_buff
*
skb
)
static
inline
struct
dccp_hdr_ext
*
dccp_hdrx
(
const
struct
dccp_hdr
*
dh
)
{
return
(
struct
dccp_hdr_ext
*
)(
skb_transport_header
(
skb
)
+
sizeof
(
struct
dccp_hdr
));
return
(
struct
dccp_hdr_ext
*
)((
unsigned
char
*
)
dh
+
sizeof
(
*
dh
));
}
static
inline
unsigned
int
__dccp_basic_hdr_len
(
const
struct
dccp_hdr
*
dh
)
...
...
@@ -287,13 +288,12 @@ static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
return
__dccp_basic_hdr_len
(
dh
);
}
static
inline
__u64
dccp_hdr_seq
(
const
struct
sk_buff
*
skb
)
static
inline
__u64
dccp_hdr_seq
(
const
struct
dccp_hdr
*
dh
)
{
const
struct
dccp_hdr
*
dh
=
dccp_hdr
(
skb
);
__u64
seq_nr
=
ntohs
(
dh
->
dccph_seq
);
if
(
dh
->
dccph_x
!=
0
)
seq_nr
=
(
seq_nr
<<
32
)
+
ntohl
(
dccp_hdrx
(
skb
)
->
dccph_seq_low
);
seq_nr
=
(
seq_nr
<<
32
)
+
ntohl
(
dccp_hdrx
(
dh
)
->
dccph_seq_low
);
else
seq_nr
+=
(
u32
)
dh
->
dccph_seq2
<<
16
;
...
...
net/dccp/ccids/ccid2.c
View file @
8c56a347
...
...
@@ -750,20 +750,16 @@ static int ccid2_hc_tx_init(struct ccid *ccid, struct sock *sk)
*/
hctx
->
ccid2hctx_ssthresh
=
~
0
;
hctx
->
ccid2hctx_numdupack
=
3
;
hctx
->
ccid2hctx_seqbufc
=
0
;
/* XXX init ~ to window size... */
if
(
ccid2_hc_tx_alloc_seq
(
hctx
))
return
-
ENOMEM
;
hctx
->
ccid2hctx_sent
=
0
;
hctx
->
ccid2hctx_rto
=
3
*
HZ
;
ccid2_change_srtt
(
hctx
,
-
1
);
hctx
->
ccid2hctx_rttvar
=
-
1
;
hctx
->
ccid2hctx_lastrtt
=
0
;
hctx
->
ccid2hctx_rpdupack
=
-
1
;
hctx
->
ccid2hctx_last_cong
=
jiffies
;
hctx
->
ccid2hctx_high_ack
=
0
;
hctx
->
ccid2hctx_rtotimer
.
function
=
&
ccid2_hc_tx_rto_expire
;
hctx
->
ccid2hctx_rtotimer
.
data
=
(
unsigned
long
)
sk
;
...
...
net/dccp/ccids/ccid3.c
View file @
8c56a347
...
...
@@ -40,6 +40,8 @@
#include "lib/tfrc.h"
#include "ccid3.h"
#include <asm/unaligned.h>
#ifdef CONFIG_IP_DCCP_CCID3_DEBUG
static
int
ccid3_debug
;
#define ccid3_pr_debug(format, a...) DCCP_PR_DEBUG(ccid3_debug, format, ##a)
...
...
@@ -544,6 +546,7 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
const
struct
dccp_sock
*
dp
=
dccp_sk
(
sk
);
struct
ccid3_hc_tx_sock
*
hctx
=
ccid3_hc_tx_sk
(
sk
);
struct
ccid3_options_received
*
opt_recv
;
__be32
opt_val
;
opt_recv
=
&
hctx
->
ccid3hctx_options_received
;
...
...
@@ -563,8 +566,8 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
dccp_role
(
sk
),
sk
,
len
);
rc
=
-
EINVAL
;
}
else
{
opt_
recv
->
ccid3or_loss_event_rate
=
ntohl
(
*
(
__be32
*
)
value
);
opt_
val
=
get_unaligned
((
__be32
*
)
value
);
opt_recv
->
ccid3or_loss_event_rate
=
ntohl
(
opt_val
);
ccid3_pr_debug
(
"%s(%p), LOSS_EVENT_RATE=%u
\n
"
,
dccp_role
(
sk
),
sk
,
opt_recv
->
ccid3or_loss_event_rate
);
...
...
@@ -585,8 +588,8 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
dccp_role
(
sk
),
sk
,
len
);
rc
=
-
EINVAL
;
}
else
{
opt_
recv
->
ccid3or_receive_rate
=
ntohl
(
*
(
__be32
*
)
value
);
opt_
val
=
get_unaligned
((
__be32
*
)
value
);
opt_recv
->
ccid3or_receive_rate
=
ntohl
(
opt_val
);
ccid3_pr_debug
(
"%s(%p), RECEIVE_RATE=%u
\n
"
,
dccp_role
(
sk
),
sk
,
opt_recv
->
ccid3or_receive_rate
);
...
...
@@ -601,8 +604,6 @@ static int ccid3_hc_tx_init(struct ccid *ccid, struct sock *sk)
{
struct
ccid3_hc_tx_sock
*
hctx
=
ccid_priv
(
ccid
);
hctx
->
ccid3hctx_s
=
0
;
hctx
->
ccid3hctx_rtt
=
0
;
hctx
->
ccid3hctx_state
=
TFRC_SSTATE_NO_SENT
;
INIT_LIST_HEAD
(
&
hctx
->
ccid3hctx_hist
);
...
...
@@ -963,8 +964,6 @@ static int ccid3_hc_rx_init(struct ccid *ccid, struct sock *sk)
INIT_LIST_HEAD
(
&
hcrx
->
ccid3hcrx_li_hist
);
hcrx
->
ccid3hcrx_tstamp_last_feedback
=
hcrx
->
ccid3hcrx_tstamp_last_ack
=
ktime_get_real
();
hcrx
->
ccid3hcrx_s
=
0
;
hcrx
->
ccid3hcrx_rtt
=
0
;
return
0
;
}
...
...
net/dccp/input.c
View file @
8c56a347
...
...
@@ -58,6 +58,42 @@ static void dccp_rcv_closereq(struct sock *sk, struct sk_buff *skb)
dccp_send_close
(
sk
,
0
);
}
static
u8
dccp_reset_code_convert
(
const
u8
code
)
{
const
u8
error_code
[]
=
{
[
DCCP_RESET_CODE_CLOSED
]
=
0
,
/* normal termination */
[
DCCP_RESET_CODE_UNSPECIFIED
]
=
0
,
/* nothing known */
[
DCCP_RESET_CODE_ABORTED
]
=
ECONNRESET
,
[
DCCP_RESET_CODE_NO_CONNECTION
]
=
ECONNREFUSED
,
[
DCCP_RESET_CODE_CONNECTION_REFUSED
]
=
ECONNREFUSED
,
[
DCCP_RESET_CODE_TOO_BUSY
]
=
EUSERS
,
[
DCCP_RESET_CODE_AGGRESSION_PENALTY
]
=
EDQUOT
,
[
DCCP_RESET_CODE_PACKET_ERROR
]
=
ENOMSG
,
[
DCCP_RESET_CODE_BAD_INIT_COOKIE
]
=
EBADR
,
[
DCCP_RESET_CODE_BAD_SERVICE_CODE
]
=
EBADRQC
,
[
DCCP_RESET_CODE_OPTION_ERROR
]
=
EILSEQ
,
[
DCCP_RESET_CODE_MANDATORY_ERROR
]
=
EOPNOTSUPP
,
};
return
code
>=
DCCP_MAX_RESET_CODES
?
0
:
error_code
[
code
];
}
static
void
dccp_rcv_reset
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
)
{
u8
err
=
dccp_reset_code_convert
(
dccp_hdr_reset
(
skb
)
->
dccph_reset_code
);
sk
->
sk_err
=
err
;
/* Queue the equivalent of TCP fin so that dccp_recvmsg exits the loop */
dccp_fin
(
sk
,
skb
);
if
(
err
&&
!
sock_flag
(
sk
,
SOCK_DEAD
))
sk_wake_async
(
sk
,
0
,
POLL_ERR
);
dccp_time_wait
(
sk
,
DCCP_TIME_WAIT
,
0
);
}
static
void
dccp_event_ack_recv
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
)
{
struct
dccp_sock
*
dp
=
dccp_sk
(
sk
);
...
...
@@ -191,9 +227,8 @@ static int __dccp_rcv_established(struct sock *sk, struct sk_buff *skb,
* S.state := TIMEWAIT
* Set TIMEWAIT timer
* Drop packet and return
*/
dccp_fin
(
sk
,
skb
);
dccp_time_wait
(
sk
,
DCCP_TIME_WAIT
,
0
);
*/
dccp_rcv_reset
(
sk
,
skb
);
return
0
;
case
DCCP_PKT_CLOSEREQ
:
dccp_rcv_closereq
(
sk
,
skb
);
...
...
@@ -521,12 +556,7 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
* Drop packet and return
*/
if
(
dh
->
dccph_type
==
DCCP_PKT_RESET
)
{
/*
* Queue the equivalent of TCP fin so that dccp_recvmsg
* exits the loop
*/
dccp_fin
(
sk
,
skb
);
dccp_time_wait
(
sk
,
DCCP_TIME_WAIT
,
0
);
dccp_rcv_reset
(
sk
,
skb
);
return
0
;
/*
* Step 7: Check for unexpected packet types
...
...
net/dccp/ipv4.c
View file @
8c56a347
...
...
@@ -241,8 +241,8 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
goto
out
;
dp
=
dccp_sk
(
sk
);
seq
=
dccp_hdr_seq
(
skb
);
if
(
sk
->
sk_state
!=
DCCP_LISTEN
&&
seq
=
dccp_hdr_seq
(
dh
);
if
(
(
1
<<
sk
->
sk_state
)
&
~
(
DCCPF_REQUESTING
|
DCCPF_LISTEN
)
&&
!
between48
(
seq
,
dp
->
dccps_swl
,
dp
->
dccps_swh
))
{
NET_INC_STATS_BH
(
LINUX_MIB_OUTOFWINDOWICMPS
);
goto
out
;
...
...
@@ -795,7 +795,7 @@ static int dccp_v4_rcv(struct sk_buff *skb)
dh
=
dccp_hdr
(
skb
);
DCCP_SKB_CB
(
skb
)
->
dccpd_seq
=
dccp_hdr_seq
(
skb
);
DCCP_SKB_CB
(
skb
)
->
dccpd_seq
=
dccp_hdr_seq
(
dh
);
DCCP_SKB_CB
(
skb
)
->
dccpd_type
=
dh
->
dccph_type
;
dccp_pr_debug
(
"%8.8s "
...
...
net/dccp/ipv6.c
View file @
8c56a347
...
...
@@ -173,7 +173,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
icmpv6_err_convert
(
type
,
code
,
&
err
);
seq
=
DCCP_SKB_CB
(
skb
)
->
dccpd_seq
;
seq
=
dccp_hdr_seq
(
dh
)
;
/* Might be for an request_sock */
switch
(
sk
->
sk_state
)
{
struct
request_sock
*
req
,
**
prev
;
...
...
@@ -787,7 +787,7 @@ static int dccp_v6_rcv(struct sk_buff *skb)
dh
=
dccp_hdr
(
skb
);
DCCP_SKB_CB
(
skb
)
->
dccpd_seq
=
dccp_hdr_seq
(
skb
);
DCCP_SKB_CB
(
skb
)
->
dccpd_seq
=
dccp_hdr_seq
(
dh
);
DCCP_SKB_CB
(
skb
)
->
dccpd_type
=
dh
->
dccph_type
;
if
(
dccp_packet_without_ack
(
skb
))
...
...
net/dccp/options.c
View file @
8c56a347
...
...
@@ -14,6 +14,7 @@
#include <linux/dccp.h>
#include <linux/module.h>
#include <linux/types.h>
#include <asm/unaligned.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
...
...
@@ -59,6 +60,7 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
unsigned
char
opt
,
len
;
unsigned
char
*
value
;
u32
elapsed_time
;
__be32
opt_val
;
int
rc
;
int
mandatory
=
0
;
...
...
@@ -145,7 +147,8 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
if
(
len
!=
4
)
goto
out_invalid_option
;
opt_recv
->
dccpor_timestamp
=
ntohl
(
*
(
__be32
*
)
value
);
opt_val
=
get_unaligned
((
__be32
*
)
value
);
opt_recv
->
dccpor_timestamp
=
ntohl
(
opt_val
);
dp
->
dccps_timestamp_echo
=
opt_recv
->
dccpor_timestamp
;
dp
->
dccps_timestamp_time
=
ktime_get_real
();
...
...
@@ -159,7 +162,8 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
if
(
len
!=
4
&&
len
!=
6
&&
len
!=
8
)
goto
out_invalid_option
;
opt_recv
->
dccpor_timestamp_echo
=
ntohl
(
*
(
__be32
*
)
value
);
opt_val
=
get_unaligned
((
__be32
*
)
value
);
opt_recv
->
dccpor_timestamp_echo
=
ntohl
(
opt_val
);
dccp_pr_debug
(
"%s rx opt: TIMESTAMP_ECHO=%u, len=%d, "
"ackno=%llu"
,
dccp_role
(
sk
),
...
...
@@ -168,16 +172,20 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
(
unsigned
long
long
)
DCCP_SKB_CB
(
skb
)
->
dccpd_ack_seq
);
value
+=
4
;
if
(
len
==
4
)
{
if
(
len
==
4
)
{
/* no elapsed time included */
dccp_pr_debug_cat
(
"
\n
"
);
break
;
}
if
(
len
==
6
)
elapsed_time
=
ntohs
(
*
(
__be16
*
)(
value
+
4
));
else
elapsed_time
=
ntohl
(
*
(
__be32
*
)(
value
+
4
));
if
(
len
==
6
)
{
/* 2-byte elapsed time */
__be16
opt_val2
=
get_unaligned
((
__be16
*
)
value
);
elapsed_time
=
ntohs
(
opt_val2
);
}
else
{
/* 4-byte elapsed time */
opt_val
=
get_unaligned
((
__be32
*
)
value
);
elapsed_time
=
ntohl
(
opt_val
);
}
dccp_pr_debug_cat
(
", ELAPSED_TIME=%u
\n
"
,
elapsed_time
);
...
...
@@ -192,10 +200,13 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
if
(
pkt_type
==
DCCP_PKT_DATA
)
continue
;
if
(
len
==
2
)
elapsed_time
=
ntohs
(
*
(
__be16
*
)
value
);
else
elapsed_time
=
ntohl
(
*
(
__be32
*
)
value
);
if
(
len
==
2
)
{
__be16
opt_val2
=
get_unaligned
((
__be16
*
)
value
);
elapsed_time
=
ntohs
(
opt_val2
);
}
else
{
opt_val
=
get_unaligned
((
__be32
*
)
value
);
elapsed_time
=
ntohl
(
opt_val
);
}
if
(
elapsed_time
>
opt_recv
->
dccpor_elapsed_time
)
opt_recv
->
dccpor_elapsed_time
=
elapsed_time
;
...
...
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