linux/net/dccp/ccids/ccid2.h
<<
>>
Prefs
   1/*
   2 *  Copyright (c) 2005 Andrea Bittau <a.bittau@cs.ucl.ac.uk>
   3 *
   4 *  This program is free software; you can redistribute it and/or modify
   5 *  it under the terms of the GNU General Public License as published by
   6 *  the Free Software Foundation; either version 2 of the License, or
   7 *  (at your option) any later version.
   8 *
   9 *  This program is distributed in the hope that it will be useful,
  10 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 *  GNU General Public License for more details.
  13 *
  14 *  You should have received a copy of the GNU General Public License
  15 *  along with this program; if not, write to the Free Software
  16 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17 */
  18#ifndef _DCCP_CCID2_H_
  19#define _DCCP_CCID2_H_
  20
  21#include <linux/timer.h>
  22#include <linux/types.h>
  23#include "../ccid.h"
  24#include "../dccp.h"
  25
  26/*
  27 * CCID-2 timestamping faces the same issues as TCP timestamping.
  28 * Hence we reuse/share as much of the code as possible.
  29 */
  30#define ccid2_time_stamp        tcp_time_stamp
  31
  32/* NUMDUPACK parameter from RFC 4341, p. 6 */
  33#define NUMDUPACK       3
  34
  35struct ccid2_seq {
  36        u64                     ccid2s_seq;
  37        u32                     ccid2s_sent;
  38        int                     ccid2s_acked;
  39        struct ccid2_seq        *ccid2s_prev;
  40        struct ccid2_seq        *ccid2s_next;
  41};
  42
  43#define CCID2_SEQBUF_LEN 1024
  44#define CCID2_SEQBUF_MAX 128
  45
  46/*
  47 * Multiple of congestion window to keep the sequence window at
  48 * (RFC 4340 7.5.2)
  49 */
  50#define CCID2_WIN_CHANGE_FACTOR 5
  51
  52/**
  53 * struct ccid2_hc_tx_sock - CCID2 TX half connection
  54 * @tx_{cwnd,ssthresh,pipe}: as per RFC 4341, section 5
  55 * @tx_packets_acked:        Ack counter for deriving cwnd growth (RFC 3465)
  56 * @tx_srtt:                 smoothed RTT estimate, scaled by 2^3
  57 * @tx_mdev:                 smoothed RTT variation, scaled by 2^2
  58 * @tx_mdev_max:             maximum of @mdev during one flight
  59 * @tx_rttvar:               moving average/maximum of @mdev_max
  60 * @tx_rto:                  RTO value deriving from SRTT and RTTVAR (RFC 2988)
  61 * @tx_rtt_seq:              to decay RTTVAR at most once per flight
  62 * @tx_cwnd_used:            actually used cwnd, W_used of RFC 2861
  63 * @tx_expected_wnd:         moving average of @tx_cwnd_used
  64 * @tx_cwnd_stamp:           to track idle periods in CWV
  65 * @tx_lsndtime:             last time (in jiffies) a data packet was sent
  66 * @tx_rpseq:                last consecutive seqno
  67 * @tx_rpdupack:             dupacks since rpseq
  68 * @tx_av_chunks:            list of Ack Vectors received on current skb
  69 */
  70struct ccid2_hc_tx_sock {
  71        u32                     tx_cwnd;
  72        u32                     tx_ssthresh;
  73        u32                     tx_pipe;
  74        u32                     tx_packets_acked;
  75        struct ccid2_seq        *tx_seqbuf[CCID2_SEQBUF_MAX];
  76        int                     tx_seqbufc;
  77        struct ccid2_seq        *tx_seqh;
  78        struct ccid2_seq        *tx_seqt;
  79
  80        /* RTT measurement: variables/principles are the same as in TCP */
  81        u32                     tx_srtt,
  82                                tx_mdev,
  83                                tx_mdev_max,
  84                                tx_rttvar,
  85                                tx_rto;
  86        u64                     tx_rtt_seq:48;
  87        struct timer_list       tx_rtotimer;
  88
  89        /* Congestion Window validation (optional, RFC 2861) */
  90        u32                     tx_cwnd_used,
  91                                tx_expected_wnd,
  92                                tx_cwnd_stamp,
  93                                tx_lsndtime;
  94
  95        u64                     tx_rpseq;
  96        int                     tx_rpdupack;
  97        u32                     tx_last_cong;
  98        u64                     tx_high_ack;
  99        struct list_head        tx_av_chunks;
 100};
 101
 102static inline bool ccid2_cwnd_network_limited(struct ccid2_hc_tx_sock *hc)
 103{
 104        return hc->tx_pipe >= hc->tx_cwnd;
 105}
 106
 107/*
 108 * Convert RFC 3390 larger initial window into an equivalent number of packets.
 109 * This is based on the numbers specified in RFC 5681, 3.1.
 110 */
 111static inline u32 rfc3390_bytes_to_packets(const u32 smss)
 112{
 113        return smss <= 1095 ? 4 : (smss > 2190 ? 2 : 3);
 114}
 115
 116/**
 117 * struct ccid2_hc_rx_sock  -  Receiving end of CCID-2 half-connection
 118 * @rx_num_data_pkts: number of data packets received since last feedback
 119 */
 120struct ccid2_hc_rx_sock {
 121        u32     rx_num_data_pkts;
 122};
 123
 124static inline struct ccid2_hc_tx_sock *ccid2_hc_tx_sk(const struct sock *sk)
 125{
 126        return ccid_priv(dccp_sk(sk)->dccps_hc_tx_ccid);
 127}
 128
 129static inline struct ccid2_hc_rx_sock *ccid2_hc_rx_sk(const struct sock *sk)
 130{
 131        return ccid_priv(dccp_sk(sk)->dccps_hc_rx_ccid);
 132}
 133#endif /* _DCCP_CCID2_H_ */
 134