Merge tag 'for-linus-20190524' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / net / dccp / ccids / ccid2.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *  Copyright (c) 2005 Andrea Bittau <a.bittau@cs.ucl.ac.uk>
4  */
5 #ifndef _DCCP_CCID2_H_
6 #define _DCCP_CCID2_H_
7
8 #include <linux/timer.h>
9 #include <linux/types.h>
10 #include "../ccid.h"
11 #include "../dccp.h"
12
13 /*
14  * CCID-2 timestamping faces the same issues as TCP timestamping.
15  * Hence we reuse/share as much of the code as possible.
16  */
17 #define ccid2_jiffies32 ((u32)jiffies)
18
19 /* NUMDUPACK parameter from RFC 4341, p. 6 */
20 #define NUMDUPACK       3
21
22 struct ccid2_seq {
23         u64                     ccid2s_seq;
24         u32                     ccid2s_sent;
25         int                     ccid2s_acked;
26         struct ccid2_seq        *ccid2s_prev;
27         struct ccid2_seq        *ccid2s_next;
28 };
29
30 #define CCID2_SEQBUF_LEN 1024
31 #define CCID2_SEQBUF_MAX 128
32
33 /*
34  * Multiple of congestion window to keep the sequence window at
35  * (RFC 4340 7.5.2)
36  */
37 #define CCID2_WIN_CHANGE_FACTOR 5
38
39 /**
40  * struct ccid2_hc_tx_sock - CCID2 TX half connection
41  * @tx_{cwnd,ssthresh,pipe}: as per RFC 4341, section 5
42  * @tx_packets_acked:        Ack counter for deriving cwnd growth (RFC 3465)
43  * @tx_srtt:                 smoothed RTT estimate, scaled by 2^3
44  * @tx_mdev:                 smoothed RTT variation, scaled by 2^2
45  * @tx_mdev_max:             maximum of @mdev during one flight
46  * @tx_rttvar:               moving average/maximum of @mdev_max
47  * @tx_rto:                  RTO value deriving from SRTT and RTTVAR (RFC 2988)
48  * @tx_rtt_seq:              to decay RTTVAR at most once per flight
49  * @tx_cwnd_used:            actually used cwnd, W_used of RFC 2861
50  * @tx_expected_wnd:         moving average of @tx_cwnd_used
51  * @tx_cwnd_stamp:           to track idle periods in CWV
52  * @tx_lsndtime:             last time (in jiffies) a data packet was sent
53  * @tx_rpseq:                last consecutive seqno
54  * @tx_rpdupack:             dupacks since rpseq
55  * @tx_av_chunks:            list of Ack Vectors received on current skb
56  */
57 struct ccid2_hc_tx_sock {
58         u32                     tx_cwnd;
59         u32                     tx_ssthresh;
60         u32                     tx_pipe;
61         u32                     tx_packets_acked;
62         struct ccid2_seq        *tx_seqbuf[CCID2_SEQBUF_MAX];
63         int                     tx_seqbufc;
64         struct ccid2_seq        *tx_seqh;
65         struct ccid2_seq        *tx_seqt;
66
67         /* RTT measurement: variables/principles are the same as in TCP */
68         u32                     tx_srtt,
69                                 tx_mdev,
70                                 tx_mdev_max,
71                                 tx_rttvar,
72                                 tx_rto;
73         u64                     tx_rtt_seq:48;
74         struct timer_list       tx_rtotimer;
75         struct sock             *sk;
76
77         /* Congestion Window validation (optional, RFC 2861) */
78         u32                     tx_cwnd_used,
79                                 tx_expected_wnd,
80                                 tx_cwnd_stamp,
81                                 tx_lsndtime;
82
83         u64                     tx_rpseq;
84         int                     tx_rpdupack;
85         u32                     tx_last_cong;
86         u64                     tx_high_ack;
87         struct list_head        tx_av_chunks;
88 };
89
90 static inline bool ccid2_cwnd_network_limited(struct ccid2_hc_tx_sock *hc)
91 {
92         return hc->tx_pipe >= hc->tx_cwnd;
93 }
94
95 /*
96  * Convert RFC 3390 larger initial window into an equivalent number of packets.
97  * This is based on the numbers specified in RFC 5681, 3.1.
98  */
99 static inline u32 rfc3390_bytes_to_packets(const u32 smss)
100 {
101         return smss <= 1095 ? 4 : (smss > 2190 ? 2 : 3);
102 }
103
104 /**
105  * struct ccid2_hc_rx_sock  -  Receiving end of CCID-2 half-connection
106  * @rx_num_data_pkts: number of data packets received since last feedback
107  */
108 struct ccid2_hc_rx_sock {
109         u32     rx_num_data_pkts;
110 };
111
112 static inline struct ccid2_hc_tx_sock *ccid2_hc_tx_sk(const struct sock *sk)
113 {
114         return ccid_priv(dccp_sk(sk)->dccps_hc_tx_ccid);
115 }
116
117 static inline struct ccid2_hc_rx_sock *ccid2_hc_rx_sk(const struct sock *sk)
118 {
119         return ccid_priv(dccp_sk(sk)->dccps_hc_rx_ccid);
120 }
121 #endif /* _DCCP_CCID2_H_ */