aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/dccp.h
diff options
context:
space:
mode:
Diffstat (limited to 'net/dccp/dccp.h')
-rw-r--r--net/dccp/dccp.h104
1 files changed, 27 insertions, 77 deletions
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index 5281190aa19c..b4bc6e095a0e 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -42,11 +42,9 @@
42extern int dccp_debug; 42extern int dccp_debug;
43#define dccp_pr_debug(format, a...) DCCP_PR_DEBUG(dccp_debug, format, ##a) 43#define dccp_pr_debug(format, a...) DCCP_PR_DEBUG(dccp_debug, format, ##a)
44#define dccp_pr_debug_cat(format, a...) DCCP_PRINTK(dccp_debug, format, ##a) 44#define dccp_pr_debug_cat(format, a...) DCCP_PRINTK(dccp_debug, format, ##a)
45#define dccp_debug(fmt, a...) dccp_pr_debug_cat(KERN_DEBUG fmt, ##a)
46#else 45#else
47#define dccp_pr_debug(format, a...) 46#define dccp_pr_debug(format, a...)
48#define dccp_pr_debug_cat(format, a...) 47#define dccp_pr_debug_cat(format, a...)
49#define dccp_debug(format, a...)
50#endif 48#endif
51 49
52extern struct inet_hashinfo dccp_hashinfo; 50extern struct inet_hashinfo dccp_hashinfo;
@@ -63,14 +61,11 @@ extern void dccp_time_wait(struct sock *sk, int state, int timeo);
63 * - DCCP-Reset with ACK Subheader and 4 bytes of Reset Code fields 61 * - DCCP-Reset with ACK Subheader and 4 bytes of Reset Code fields
64 * Hence a safe upper bound for the maximum option length is 1020-28 = 992 62 * Hence a safe upper bound for the maximum option length is 1020-28 = 992
65 */ 63 */
66#define MAX_DCCP_SPECIFIC_HEADER (255 * sizeof(uint32_t)) 64#define MAX_DCCP_SPECIFIC_HEADER (255 * sizeof(int))
67#define DCCP_MAX_PACKET_HDR 28 65#define DCCP_MAX_PACKET_HDR 28
68#define DCCP_MAX_OPT_LEN (MAX_DCCP_SPECIFIC_HEADER - DCCP_MAX_PACKET_HDR) 66#define DCCP_MAX_OPT_LEN (MAX_DCCP_SPECIFIC_HEADER - DCCP_MAX_PACKET_HDR)
69#define MAX_DCCP_HEADER (MAX_DCCP_SPECIFIC_HEADER + MAX_HEADER) 67#define MAX_DCCP_HEADER (MAX_DCCP_SPECIFIC_HEADER + MAX_HEADER)
70 68
71/* Upper bound for initial feature-negotiation overhead (padded to 32 bits) */
72#define DCCP_FEATNEG_OVERHEAD (32 * sizeof(uint32_t))
73
74#define DCCP_TIMEWAIT_LEN (60 * HZ) /* how long to wait to destroy TIME-WAIT 69#define DCCP_TIMEWAIT_LEN (60 * HZ) /* how long to wait to destroy TIME-WAIT
75 * state, about 60 seconds */ 70 * state, about 60 seconds */
76 71
@@ -86,13 +81,10 @@ extern void dccp_time_wait(struct sock *sk, int state, int timeo);
86 */ 81 */
87#define DCCP_RTO_MAX ((unsigned)(64 * HZ)) 82#define DCCP_RTO_MAX ((unsigned)(64 * HZ))
88 83
89/* DCCP base time resolution - 10 microseconds (RFC 4340, 13.1 ... 13.3) */
90#define DCCP_TIME_RESOLUTION 10
91
92/* 84/*
93 * RTT sampling: sanity bounds and fallback RTT value from RFC 4340, section 3.4 85 * RTT sampling: sanity bounds and fallback RTT value from RFC 4340, section 3.4
94 */ 86 */
95#define DCCP_SANE_RTT_MIN (10 * DCCP_TIME_RESOLUTION) 87#define DCCP_SANE_RTT_MIN 100
96#define DCCP_FALLBACK_RTT (USEC_PER_SEC / 5) 88#define DCCP_FALLBACK_RTT (USEC_PER_SEC / 5)
97#define DCCP_SANE_RTT_MAX (3 * USEC_PER_SEC) 89#define DCCP_SANE_RTT_MAX (3 * USEC_PER_SEC)
98 90
@@ -103,6 +95,12 @@ extern void dccp_time_wait(struct sock *sk, int state, int timeo);
103extern int sysctl_dccp_request_retries; 95extern int sysctl_dccp_request_retries;
104extern int sysctl_dccp_retries1; 96extern int sysctl_dccp_retries1;
105extern int sysctl_dccp_retries2; 97extern int sysctl_dccp_retries2;
98extern int sysctl_dccp_feat_sequence_window;
99extern int sysctl_dccp_feat_rx_ccid;
100extern int sysctl_dccp_feat_tx_ccid;
101extern int sysctl_dccp_feat_ack_ratio;
102extern int sysctl_dccp_feat_send_ack_vector;
103extern int sysctl_dccp_feat_send_ndp_count;
106extern int sysctl_dccp_tx_qlen; 104extern int sysctl_dccp_tx_qlen;
107extern int sysctl_dccp_sync_ratelimit; 105extern int sysctl_dccp_sync_ratelimit;
108 106
@@ -237,22 +235,8 @@ extern void dccp_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
237extern void dccp_send_sync(struct sock *sk, const u64 seq, 235extern void dccp_send_sync(struct sock *sk, const u64 seq,
238 const enum dccp_pkt_type pkt_type); 236 const enum dccp_pkt_type pkt_type);
239 237
240/* 238extern void dccp_write_xmit(struct sock *sk, int block);
241 * TX Packet Dequeueing Interface
242 */
243extern void dccp_qpolicy_push(struct sock *sk, struct sk_buff *skb);
244extern bool dccp_qpolicy_full(struct sock *sk);
245extern void dccp_qpolicy_drop(struct sock *sk, struct sk_buff *skb);
246extern struct sk_buff *dccp_qpolicy_top(struct sock *sk);
247extern struct sk_buff *dccp_qpolicy_pop(struct sock *sk);
248extern bool dccp_qpolicy_param_ok(struct sock *sk, __be32 param);
249
250/*
251 * TX Packet Output and TX Timers
252 */
253extern void dccp_write_xmit(struct sock *sk);
254extern void dccp_write_space(struct sock *sk); 239extern void dccp_write_space(struct sock *sk);
255extern void dccp_flush_write_queue(struct sock *sk, long *time_budget);
256 240
257extern void dccp_init_xmit_timers(struct sock *sk); 241extern void dccp_init_xmit_timers(struct sock *sk);
258static inline void dccp_clear_xmit_timers(struct sock *sk) 242static inline void dccp_clear_xmit_timers(struct sock *sk)
@@ -268,8 +252,7 @@ extern const char *dccp_state_name(const int state);
268extern void dccp_set_state(struct sock *sk, const int state); 252extern void dccp_set_state(struct sock *sk, const int state);
269extern void dccp_done(struct sock *sk); 253extern void dccp_done(struct sock *sk);
270 254
271extern int dccp_reqsk_init(struct request_sock *rq, struct dccp_sock const *dp, 255extern void dccp_reqsk_init(struct request_sock *req, struct sk_buff *skb);
272 struct sk_buff const *skb);
273 256
274extern int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb); 257extern int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb);
275 258
@@ -334,14 +317,7 @@ extern struct sk_buff *dccp_ctl_make_reset(struct sock *sk,
334extern int dccp_send_reset(struct sock *sk, enum dccp_reset_codes code); 317extern int dccp_send_reset(struct sock *sk, enum dccp_reset_codes code);
335extern void dccp_send_close(struct sock *sk, const int active); 318extern void dccp_send_close(struct sock *sk, const int active);
336extern int dccp_invalid_packet(struct sk_buff *skb); 319extern int dccp_invalid_packet(struct sk_buff *skb);
337 320extern u32 dccp_sample_rtt(struct sock *sk, long delta);
338static inline u32 dccp_sane_rtt(long usec_sample)
339{
340 if (unlikely(usec_sample <= 0 || usec_sample > DCCP_SANE_RTT_MAX))
341 DCCP_WARN("RTT sample %ld out of bounds!\n", usec_sample);
342 return clamp_val(usec_sample, DCCP_SANE_RTT_MIN, DCCP_SANE_RTT_MAX);
343}
344extern u32 dccp_sample_rtt(struct sock *sk, long delta);
345 321
346static inline int dccp_bad_service_code(const struct sock *sk, 322static inline int dccp_bad_service_code(const struct sock *sk,
347 const __be32 service) 323 const __be32 service)
@@ -435,62 +411,36 @@ static inline void dccp_hdr_set_ack(struct dccp_hdr_ack_bits *dhack,
435static inline void dccp_update_gsr(struct sock *sk, u64 seq) 411static inline void dccp_update_gsr(struct sock *sk, u64 seq)
436{ 412{
437 struct dccp_sock *dp = dccp_sk(sk); 413 struct dccp_sock *dp = dccp_sk(sk);
414 const struct dccp_minisock *dmsk = dccp_msk(sk);
438 415
439 dp->dccps_gsr = seq; 416 dp->dccps_gsr = seq;
440 /* Sequence validity window depends on remote Sequence Window (7.5.1) */ 417 dccp_set_seqno(&dp->dccps_swl,
441 dp->dccps_swl = SUB48(ADD48(dp->dccps_gsr, 1), dp->dccps_r_seq_win / 4); 418 dp->dccps_gsr + 1 - (dmsk->dccpms_sequence_window / 4));
442 /* 419 dccp_set_seqno(&dp->dccps_swh,
443 * Adjust SWL so that it is not below ISR. In contrast to RFC 4340, 420 dp->dccps_gsr + (3 * dmsk->dccpms_sequence_window) / 4);
444 * 7.5.1 we perform this check beyond the initial handshake: W/W' are
445 * always > 32, so for the first W/W' packets in the lifetime of a
446 * connection we always have to adjust SWL.
447 * A second reason why we are doing this is that the window depends on
448 * the feature-remote value of Sequence Window: nothing stops the peer
449 * from updating this value while we are busy adjusting SWL for the
450 * first W packets (we would have to count from scratch again then).
451 * Therefore it is safer to always make sure that the Sequence Window
452 * is not artificially extended by a peer who grows SWL downwards by
453 * continually updating the feature-remote Sequence-Window.
454 * If sequence numbers wrap it is bad luck. But that will take a while
455 * (48 bit), and this measure prevents Sequence-number attacks.
456 */
457 if (before48(dp->dccps_swl, dp->dccps_isr))
458 dp->dccps_swl = dp->dccps_isr;
459 dp->dccps_swh = ADD48(dp->dccps_gsr, (3 * dp->dccps_r_seq_win) / 4);
460} 421}
461 422
462static inline void dccp_update_gss(struct sock *sk, u64 seq) 423static inline void dccp_update_gss(struct sock *sk, u64 seq)
463{ 424{
464 struct dccp_sock *dp = dccp_sk(sk); 425 struct dccp_sock *dp = dccp_sk(sk);
465 426
466 dp->dccps_gss = seq; 427 dp->dccps_awh = dp->dccps_gss = seq;
467 /* Ack validity window depends on local Sequence Window value (7.5.1) */ 428 dccp_set_seqno(&dp->dccps_awl,
468 dp->dccps_awl = SUB48(ADD48(dp->dccps_gss, 1), dp->dccps_l_seq_win); 429 (dp->dccps_gss -
469 /* Adjust AWL so that it is not below ISS - see comment above for SWL */ 430 dccp_msk(sk)->dccpms_sequence_window + 1));
470 if (before48(dp->dccps_awl, dp->dccps_iss))
471 dp->dccps_awl = dp->dccps_iss;
472 dp->dccps_awh = dp->dccps_gss;
473}
474
475static inline int dccp_ackvec_pending(const struct sock *sk)
476{
477 return dccp_sk(sk)->dccps_hc_rx_ackvec != NULL &&
478 !dccp_ackvec_is_empty(dccp_sk(sk)->dccps_hc_rx_ackvec);
479} 431}
480 432
481static inline int dccp_ack_pending(const struct sock *sk) 433static inline int dccp_ack_pending(const struct sock *sk)
482{ 434{
483 return dccp_ackvec_pending(sk) || inet_csk_ack_scheduled(sk); 435 const struct dccp_sock *dp = dccp_sk(sk);
436 return dp->dccps_timestamp_echo != 0 ||
437#ifdef CONFIG_IP_DCCP_ACKVEC
438 (dccp_msk(sk)->dccpms_send_ack_vector &&
439 dccp_ackvec_pending(dp->dccps_hc_rx_ackvec)) ||
440#endif
441 inet_csk_ack_scheduled(sk);
484} 442}
485 443
486extern int dccp_feat_signal_nn_change(struct sock *sk, u8 feat, u64 nn_val);
487extern int dccp_feat_finalise_settings(struct dccp_sock *dp);
488extern int dccp_feat_server_ccid_dependencies(struct dccp_request_sock *dreq);
489extern int dccp_feat_insert_opts(struct dccp_sock*, struct dccp_request_sock*,
490 struct sk_buff *skb);
491extern int dccp_feat_activate_values(struct sock *sk, struct list_head *fn);
492extern void dccp_feat_list_purge(struct list_head *fn_list);
493
494extern int dccp_insert_options(struct sock *sk, struct sk_buff *skb); 444extern int dccp_insert_options(struct sock *sk, struct sk_buff *skb);
495extern int dccp_insert_options_rsk(struct dccp_request_sock*, struct sk_buff*); 445extern int dccp_insert_options_rsk(struct dccp_request_sock*, struct sk_buff*);
496extern int dccp_insert_option_elapsed_time(struct sock *sk, 446extern int dccp_insert_option_elapsed_time(struct sock *sk,