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
8fa6e3d4
Commit
8fa6e3d4
authored
Oct 12, 2010
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dccp' of
git://eden-feed.erg.abdn.ac.uk/net-next-2.6
parents
c239f279
2f34b329
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
66 additions
and
63 deletions
+66
-63
net/dccp/ccid.h
net/dccp/ccid.h
+3
-3
net/dccp/ccids/ccid2.c
net/dccp/ccids/ccid2.c
+1
-1
net/dccp/ccids/ccid3.c
net/dccp/ccids/ccid3.c
+1
-2
net/dccp/dccp.h
net/dccp/dccp.h
+36
-8
net/dccp/input.c
net/dccp/input.c
+7
-13
net/dccp/minisocks.c
net/dccp/minisocks.c
+9
-21
net/dccp/options.c
net/dccp/options.c
+2
-0
net/dccp/output.c
net/dccp/output.c
+6
-14
net/dccp/proto.c
net/dccp/proto.c
+1
-1
No files found.
net/dccp/ccid.h
View file @
8fa6e3d4
...
@@ -73,7 +73,7 @@ struct ccid_operations {
...
@@ -73,7 +73,7 @@ struct ccid_operations {
int
(
*
ccid_hc_tx_send_packet
)(
struct
sock
*
sk
,
int
(
*
ccid_hc_tx_send_packet
)(
struct
sock
*
sk
,
struct
sk_buff
*
skb
);
struct
sk_buff
*
skb
);
void
(
*
ccid_hc_tx_packet_sent
)(
struct
sock
*
sk
,
void
(
*
ccid_hc_tx_packet_sent
)(
struct
sock
*
sk
,
int
more
,
unsigned
int
len
);
unsigned
int
len
);
void
(
*
ccid_hc_rx_get_info
)(
struct
sock
*
sk
,
void
(
*
ccid_hc_rx_get_info
)(
struct
sock
*
sk
,
struct
tcp_info
*
info
);
struct
tcp_info
*
info
);
void
(
*
ccid_hc_tx_get_info
)(
struct
sock
*
sk
,
void
(
*
ccid_hc_tx_get_info
)(
struct
sock
*
sk
,
...
@@ -144,10 +144,10 @@ static inline int ccid_hc_tx_send_packet(struct ccid *ccid, struct sock *sk,
...
@@ -144,10 +144,10 @@ static inline int ccid_hc_tx_send_packet(struct ccid *ccid, struct sock *sk,
}
}
static
inline
void
ccid_hc_tx_packet_sent
(
struct
ccid
*
ccid
,
struct
sock
*
sk
,
static
inline
void
ccid_hc_tx_packet_sent
(
struct
ccid
*
ccid
,
struct
sock
*
sk
,
int
more
,
unsigned
int
len
)
unsigned
int
len
)
{
{
if
(
ccid
->
ccid_ops
->
ccid_hc_tx_packet_sent
!=
NULL
)
if
(
ccid
->
ccid_ops
->
ccid_hc_tx_packet_sent
!=
NULL
)
ccid
->
ccid_ops
->
ccid_hc_tx_packet_sent
(
sk
,
more
,
len
);
ccid
->
ccid_ops
->
ccid_hc_tx_packet_sent
(
sk
,
len
);
}
}
static
inline
void
ccid_hc_rx_packet_recv
(
struct
ccid
*
ccid
,
struct
sock
*
sk
,
static
inline
void
ccid_hc_rx_packet_recv
(
struct
ccid
*
ccid
,
struct
sock
*
sk
,
...
...
net/dccp/ccids/ccid2.c
View file @
8fa6e3d4
...
@@ -151,7 +151,7 @@ static void ccid2_hc_tx_rto_expire(unsigned long data)
...
@@ -151,7 +151,7 @@ static void ccid2_hc_tx_rto_expire(unsigned long data)
sock_put
(
sk
);
sock_put
(
sk
);
}
}
static
void
ccid2_hc_tx_packet_sent
(
struct
sock
*
sk
,
int
more
,
unsigned
int
len
)
static
void
ccid2_hc_tx_packet_sent
(
struct
sock
*
sk
,
unsigned
int
len
)
{
{
struct
dccp_sock
*
dp
=
dccp_sk
(
sk
);
struct
dccp_sock
*
dp
=
dccp_sk
(
sk
);
struct
ccid2_hc_tx_sock
*
hc
=
ccid2_hc_tx_sk
(
sk
);
struct
ccid2_hc_tx_sock
*
hc
=
ccid2_hc_tx_sk
(
sk
);
...
...
net/dccp/ccids/ccid3.c
View file @
8fa6e3d4
...
@@ -351,8 +351,7 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
...
@@ -351,8 +351,7 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
return
0
;
return
0
;
}
}
static
void
ccid3_hc_tx_packet_sent
(
struct
sock
*
sk
,
int
more
,
static
void
ccid3_hc_tx_packet_sent
(
struct
sock
*
sk
,
unsigned
int
len
)
unsigned
int
len
)
{
{
struct
ccid3_hc_tx_sock
*
hc
=
ccid3_hc_tx_sk
(
sk
);
struct
ccid3_hc_tx_sock
*
hc
=
ccid3_hc_tx_sk
(
sk
);
...
...
net/dccp/dccp.h
View file @
8fa6e3d4
...
@@ -153,18 +153,27 @@ static inline u64 max48(const u64 seq1, const u64 seq2)
...
@@ -153,18 +153,27 @@ static inline u64 max48(const u64 seq1, const u64 seq2)
}
}
/**
/**
* dccp_loss_
free - Evaluates condition for data loss from RFC 4340, 7.7.1
* dccp_loss_
count - Approximate the number of lost data packets in a burst loss
* @s1:
start sequence number
* @s1:
last known sequence number before the loss ('hole')
* @s2:
end sequence number
* @s2:
first sequence number seen after the 'hole'
* @ndp: NDP count on packet with sequence number @s2
* @ndp: NDP count on packet with sequence number @s2
* Returns true if the sequence range s1...s2 has no data loss.
*/
*/
static
inline
bool
dccp_loss_free
(
const
u64
s1
,
const
u64
s2
,
const
u64
ndp
)
static
inline
u64
dccp_loss_count
(
const
u64
s1
,
const
u64
s2
,
const
u64
ndp
)
{
{
s64
delta
=
dccp_delta_seqno
(
s1
,
s2
);
s64
delta
=
dccp_delta_seqno
(
s1
,
s2
);
WARN_ON
(
delta
<
0
);
WARN_ON
(
delta
<
0
);
return
(
u64
)
delta
<=
ndp
+
1
;
delta
-=
ndp
+
1
;
return
delta
>
0
?
delta
:
0
;
}
/**
* dccp_loss_free - Evaluate condition for data loss from RFC 4340, 7.7.1
*/
static
inline
bool
dccp_loss_free
(
const
u64
s1
,
const
u64
s2
,
const
u64
ndp
)
{
return
dccp_loss_count
(
s1
,
s2
,
ndp
)
==
0
;
}
}
enum
{
enum
{
...
@@ -414,6 +423,23 @@ static inline void dccp_update_gsr(struct sock *sk, u64 seq)
...
@@ -414,6 +423,23 @@ static inline void dccp_update_gsr(struct sock *sk, u64 seq)
dp
->
dccps_gsr
=
seq
;
dp
->
dccps_gsr
=
seq
;
/* Sequence validity window depends on remote Sequence Window (7.5.1) */
/* Sequence validity window depends on remote Sequence Window (7.5.1) */
dp
->
dccps_swl
=
SUB48
(
ADD48
(
dp
->
dccps_gsr
,
1
),
dp
->
dccps_r_seq_win
/
4
);
dp
->
dccps_swl
=
SUB48
(
ADD48
(
dp
->
dccps_gsr
,
1
),
dp
->
dccps_r_seq_win
/
4
);
/*
* Adjust SWL so that it is not below ISR. In contrast to RFC 4340,
* 7.5.1 we perform this check beyond the initial handshake: W/W' are
* always > 32, so for the first W/W' packets in the lifetime of a
* connection we always have to adjust SWL.
* A second reason why we are doing this is that the window depends on
* the feature-remote value of Sequence Window: nothing stops the peer
* from updating this value while we are busy adjusting SWL for the
* first W packets (we would have to count from scratch again then).
* Therefore it is safer to always make sure that the Sequence Window
* is not artificially extended by a peer who grows SWL downwards by
* continually updating the feature-remote Sequence-Window.
* If sequence numbers wrap it is bad luck. But that will take a while
* (48 bit), and this measure prevents Sequence-number attacks.
*/
if
(
before48
(
dp
->
dccps_swl
,
dp
->
dccps_isr
))
dp
->
dccps_swl
=
dp
->
dccps_isr
;
dp
->
dccps_swh
=
ADD48
(
dp
->
dccps_gsr
,
(
3
*
dp
->
dccps_r_seq_win
)
/
4
);
dp
->
dccps_swh
=
ADD48
(
dp
->
dccps_gsr
,
(
3
*
dp
->
dccps_r_seq_win
)
/
4
);
}
}
...
@@ -424,14 +450,16 @@ static inline void dccp_update_gss(struct sock *sk, u64 seq)
...
@@ -424,14 +450,16 @@ static inline void dccp_update_gss(struct sock *sk, u64 seq)
dp
->
dccps_gss
=
seq
;
dp
->
dccps_gss
=
seq
;
/* Ack validity window depends on local Sequence Window value (7.5.1) */
/* Ack validity window depends on local Sequence Window value (7.5.1) */
dp
->
dccps_awl
=
SUB48
(
ADD48
(
dp
->
dccps_gss
,
1
),
dp
->
dccps_l_seq_win
);
dp
->
dccps_awl
=
SUB48
(
ADD48
(
dp
->
dccps_gss
,
1
),
dp
->
dccps_l_seq_win
);
/* Adjust AWL so that it is not below ISS - see comment above for SWL */
if
(
before48
(
dp
->
dccps_awl
,
dp
->
dccps_iss
))
dp
->
dccps_awl
=
dp
->
dccps_iss
;
dp
->
dccps_awh
=
dp
->
dccps_gss
;
dp
->
dccps_awh
=
dp
->
dccps_gss
;
}
}
static
inline
int
dccp_ack_pending
(
const
struct
sock
*
sk
)
static
inline
int
dccp_ack_pending
(
const
struct
sock
*
sk
)
{
{
const
struct
dccp_sock
*
dp
=
dccp_sk
(
sk
);
const
struct
dccp_sock
*
dp
=
dccp_sk
(
sk
);
return
dp
->
dccps_timestamp_echo
!=
0
||
return
(
dp
->
dccps_hc_rx_ackvec
!=
NULL
&&
(
dp
->
dccps_hc_rx_ackvec
!=
NULL
&&
dccp_ackvec_pending
(
dp
->
dccps_hc_rx_ackvec
))
||
dccp_ackvec_pending
(
dp
->
dccps_hc_rx_ackvec
))
||
inet_csk_ack_scheduled
(
sk
);
inet_csk_ack_scheduled
(
sk
);
}
}
...
...
net/dccp/input.c
View file @
8fa6e3d4
...
@@ -259,7 +259,7 @@ static int dccp_check_seqno(struct sock *sk, struct sk_buff *skb)
...
@@ -259,7 +259,7 @@ static int dccp_check_seqno(struct sock *sk, struct sk_buff *skb)
sysctl_dccp_sync_ratelimit
)))
sysctl_dccp_sync_ratelimit
)))
return
0
;
return
0
;
DCCP_WARN
(
"
DCCP:
Step 6 failed for %s packet, "
DCCP_WARN
(
"Step 6 failed for %s packet, "
"(LSWL(%llu) <= P.seqno(%llu) <= S.SWH(%llu)) and "
"(LSWL(%llu) <= P.seqno(%llu) <= S.SWH(%llu)) and "
"(P.ackno %s or LAWL(%llu) <= P.ackno(%llu) <= S.AWH(%llu), "
"(P.ackno %s or LAWL(%llu) <= P.ackno(%llu) <= S.AWH(%llu), "
"sending SYNC...
\n
"
,
dccp_packet_name
(
dh
->
dccph_type
),
"sending SYNC...
\n
"
,
dccp_packet_name
(
dh
->
dccph_type
),
...
@@ -441,20 +441,14 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk,
...
@@ -441,20 +441,14 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk,
kfree_skb
(
sk
->
sk_send_head
);
kfree_skb
(
sk
->
sk_send_head
);
sk
->
sk_send_head
=
NULL
;
sk
->
sk_send_head
=
NULL
;
dp
->
dccps_isr
=
DCCP_SKB_CB
(
skb
)
->
dccpd_seq
;
dccp_update_gsr
(
sk
,
dp
->
dccps_isr
);
/*
/*
* SWL and AWL are initially adjusted so that they are not less than
* Set ISR, GSR from packet. ISS was set in dccp_v{4,6}_connect
* the initial Sequence Numbers received and sent, respectively:
* and GSS in dccp_transmit_skb(). Setting AWL/AWH and SWL/SWH
* SWL := max(GSR + 1 - floor(W/4), ISR),
* is done as part of activating the feature values below, since
* AWL := max(GSS - W' + 1, ISS).
* these settings depend on the local/remote Sequence Window
* These adjustments MUST be applied only at the beginning of the
* features, which were undefined or not confirmed until now.
* connection.
*
* AWL was adjusted in dccp_v4_connect -acme
*/
*/
dccp_set_seqno
(
&
dp
->
dccps_swl
,
dp
->
dccps_gsr
=
dp
->
dccps_isr
=
DCCP_SKB_CB
(
skb
)
->
dccpd_seq
;
max48
(
dp
->
dccps_swl
,
dp
->
dccps_isr
));
dccp_sync_mss
(
sk
,
icsk
->
icsk_pmtu_cookie
);
dccp_sync_mss
(
sk
,
icsk
->
icsk_pmtu_cookie
);
...
...
net/dccp/minisocks.c
View file @
8fa6e3d4
...
@@ -121,30 +121,18 @@ struct sock *dccp_create_openreq_child(struct sock *sk,
...
@@ -121,30 +121,18 @@ struct sock *dccp_create_openreq_child(struct sock *sk,
*
*
* Choose S.ISS (initial seqno) or set from Init Cookies
* Choose S.ISS (initial seqno) or set from Init Cookies
* Initialize S.GAR := S.ISS
* Initialize S.GAR := S.ISS
* Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookies
* Set S.ISR, S.GSR from packet (or Init Cookies)
*/
*
newdp
->
dccps_gar
=
newdp
->
dccps_iss
=
dreq
->
dreq_iss
;
* Setting AWL/AWH and SWL/SWH happens as part of the feature
dccp_update_gss
(
newsk
,
dreq
->
dreq_iss
);
* activation below, as these windows all depend on the local
* and remote Sequence Window feature values (7.5.2).
newdp
->
dccps_isr
=
dreq
->
dreq_isr
;
dccp_update_gsr
(
newsk
,
dreq
->
dreq_isr
);
/*
* SWL and AWL are initially adjusted so that they are not less than
* the initial Sequence Numbers received and sent, respectively:
* SWL := max(GSR + 1 - floor(W/4), ISR),
* AWL := max(GSS - W' + 1, ISS).
* These adjustments MUST be applied only at the beginning of the
* connection.
*/
*/
dccp_set_seqno
(
&
newdp
->
dccps_swl
,
newdp
->
dccps_gss
=
newdp
->
dccps_iss
=
dreq
->
dreq_iss
;
max48
(
newdp
->
dccps_swl
,
newdp
->
dccps_isr
));
newdp
->
dccps_gar
=
newdp
->
dccps_iss
;
dccp_set_seqno
(
&
newdp
->
dccps_awl
,
newdp
->
dccps_gsr
=
newdp
->
dccps_isr
=
dreq
->
dreq_isr
;
max48
(
newdp
->
dccps_awl
,
newdp
->
dccps_iss
));
/*
/*
* Activate features after initialising the sequence numbers,
* Activate features: initialise CCIDs, sequence windows etc.
* since CCID initialisation may depend on GSS, ISR, ISS etc.
*/
*/
if
(
dccp_feat_activate_values
(
newsk
,
&
dreq
->
dreq_featneg
))
{
if
(
dccp_feat_activate_values
(
newsk
,
&
dreq
->
dreq_featneg
))
{
/* It is still raw copy of parent, so invalidate
/* It is still raw copy of parent, so invalidate
...
...
net/dccp/options.c
View file @
8fa6e3d4
...
@@ -163,6 +163,8 @@ int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
...
@@ -163,6 +163,8 @@ int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
dccp_role
(
sk
),
ntohl
(
opt_val
),
dccp_role
(
sk
),
ntohl
(
opt_val
),
(
unsigned
long
long
)
(
unsigned
long
long
)
DCCP_SKB_CB
(
skb
)
->
dccpd_ack_seq
);
DCCP_SKB_CB
(
skb
)
->
dccpd_ack_seq
);
/* schedule an Ack in case this sender is quiescent */
inet_csk_schedule_ack
(
sk
);
break
;
break
;
case
DCCPO_TIMESTAMP_ECHO
:
case
DCCPO_TIMESTAMP_ECHO
:
if
(
len
!=
4
&&
len
!=
6
&&
len
!=
8
)
if
(
len
!=
4
&&
len
!=
6
&&
len
!=
8
)
...
...
net/dccp/output.c
View file @
8fa6e3d4
...
@@ -304,7 +304,7 @@ void dccp_write_xmit(struct sock *sk, int block)
...
@@ -304,7 +304,7 @@ void dccp_write_xmit(struct sock *sk, int block)
dcb
->
dccpd_type
=
DCCP_PKT_DATA
;
dcb
->
dccpd_type
=
DCCP_PKT_DATA
;
err
=
dccp_transmit_skb
(
sk
,
skb
);
err
=
dccp_transmit_skb
(
sk
,
skb
);
ccid_hc_tx_packet_sent
(
dp
->
dccps_hc_tx_ccid
,
sk
,
0
,
len
);
ccid_hc_tx_packet_sent
(
dp
->
dccps_hc_tx_ccid
,
sk
,
len
);
if
(
err
)
if
(
err
)
DCCP_BUG
(
"err=%d after ccid_hc_tx_packet_sent"
,
DCCP_BUG
(
"err=%d after ccid_hc_tx_packet_sent"
,
err
);
err
);
...
@@ -474,8 +474,9 @@ int dccp_send_reset(struct sock *sk, enum dccp_reset_codes code)
...
@@ -474,8 +474,9 @@ int dccp_send_reset(struct sock *sk, enum dccp_reset_codes code)
/*
/*
* Do all connect socket setups that can be done AF independent.
* Do all connect socket setups that can be done AF independent.
*/
*/
static
inline
void
dccp_connect_ini
t
(
struct
sock
*
sk
)
int
dccp_connec
t
(
struct
sock
*
sk
)
{
{
struct
sk_buff
*
skb
;
struct
dccp_sock
*
dp
=
dccp_sk
(
sk
);
struct
dccp_sock
*
dp
=
dccp_sk
(
sk
);
struct
dst_entry
*
dst
=
__sk_dst_get
(
sk
);
struct
dst_entry
*
dst
=
__sk_dst_get
(
sk
);
struct
inet_connection_sock
*
icsk
=
inet_csk
(
sk
);
struct
inet_connection_sock
*
icsk
=
inet_csk
(
sk
);
...
@@ -485,22 +486,12 @@ static inline void dccp_connect_init(struct sock *sk)
...
@@ -485,22 +486,12 @@ static inline void dccp_connect_init(struct sock *sk)
dccp_sync_mss
(
sk
,
dst_mtu
(
dst
));
dccp_sync_mss
(
sk
,
dst_mtu
(
dst
));
/* Initialise GAR as per 8.5; AWL/AWH are set in dccp_transmit_skb() */
dp
->
dccps_gar
=
dp
->
dccps_iss
;
icsk
->
icsk_retransmits
=
0
;
}
int
dccp_connect
(
struct
sock
*
sk
)
{
struct
sk_buff
*
skb
;
struct
inet_connection_sock
*
icsk
=
inet_csk
(
sk
);
/* do not connect if feature negotiation setup fails */
/* do not connect if feature negotiation setup fails */
if
(
dccp_feat_finalise_settings
(
dccp_sk
(
sk
)))
if
(
dccp_feat_finalise_settings
(
dccp_sk
(
sk
)))
return
-
EPROTO
;
return
-
EPROTO
;
dccp_connect_init
(
sk
);
/* Initialise GAR as per 8.5; AWL/AWH are set in dccp_transmit_skb() */
dp
->
dccps_gar
=
dp
->
dccps_iss
;
skb
=
alloc_skb
(
sk
->
sk_prot
->
max_header
,
sk
->
sk_allocation
);
skb
=
alloc_skb
(
sk
->
sk_prot
->
max_header
,
sk
->
sk_allocation
);
if
(
unlikely
(
skb
==
NULL
))
if
(
unlikely
(
skb
==
NULL
))
...
@@ -516,6 +507,7 @@ int dccp_connect(struct sock *sk)
...
@@ -516,6 +507,7 @@ int dccp_connect(struct sock *sk)
DCCP_INC_STATS
(
DCCP_MIB_ACTIVEOPENS
);
DCCP_INC_STATS
(
DCCP_MIB_ACTIVEOPENS
);
/* Timer for repeating the REQUEST until an answer. */
/* Timer for repeating the REQUEST until an answer. */
icsk
->
icsk_retransmits
=
0
;
inet_csk_reset_xmit_timer
(
sk
,
ICSK_TIME_RETRANS
,
inet_csk_reset_xmit_timer
(
sk
,
ICSK_TIME_RETRANS
,
icsk
->
icsk_rto
,
DCCP_RTO_MAX
);
icsk
->
icsk_rto
,
DCCP_RTO_MAX
);
return
0
;
return
0
;
...
...
net/dccp/proto.c
View file @
8fa6e3d4
...
@@ -944,7 +944,7 @@ void dccp_close(struct sock *sk, long timeout)
...
@@ -944,7 +944,7 @@ void dccp_close(struct sock *sk, long timeout)
if
(
data_was_unread
)
{
if
(
data_was_unread
)
{
/* Unread data was tossed, send an appropriate Reset Code */
/* Unread data was tossed, send an appropriate Reset Code */
DCCP_WARN
(
"
DCCP: ABORT --
%u bytes unread
\n
"
,
data_was_unread
);
DCCP_WARN
(
"
ABORT with
%u bytes unread
\n
"
,
data_was_unread
);
dccp_send_reset
(
sk
,
DCCP_RESET_CODE_ABORTED
);
dccp_send_reset
(
sk
,
DCCP_RESET_CODE_ABORTED
);
dccp_set_state
(
sk
,
DCCP_CLOSED
);
dccp_set_state
(
sk
,
DCCP_CLOSED
);
}
else
if
(
sock_flag
(
sk
,
SOCK_LINGER
)
&&
!
sk
->
sk_lingertime
)
{
}
else
if
(
sock_flag
(
sk
,
SOCK_LINGER
)
&&
!
sk
->
sk_lingertime
)
{
...
...
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