linux/net/dccp/ccids/ccid3.h
<<
>>
Prefs
   1/*
   2 *  Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand.
   3 *  Copyright (c) 2007   The University of Aberdeen, Scotland, UK
   4 *
   5 *  An implementation of the DCCP protocol
   6 *
   7 *  This code has been developed by the University of Waikato WAND
   8 *  research group. For further information please see http://www.wand.net.nz/
   9 *  or e-mail Ian McDonald - ian.mcdonald@jandi.co.nz
  10 *
  11 *  This code also uses code from Lulea University, rereleased as GPL by its
  12 *  authors:
  13 *  Copyright (c) 2003 Nils-Erik Mattsson, Joacim Haggmark, Magnus Erixzon
  14 *
  15 *  Changes to meet Linux coding standards, to make it meet latest ccid3 draft
  16 *  and to make it work as a loadable module in the DCCP stack written by
  17 *  Arnaldo Carvalho de Melo <acme@conectiva.com.br>.
  18 *
  19 *  Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  20 *
  21 *  This program is free software; you can redistribute it and/or modify
  22 *  it under the terms of the GNU General Public License as published by
  23 *  the Free Software Foundation; either version 2 of the License, or
  24 *  (at your option) any later version.
  25 *
  26 *  This program is distributed in the hope that it will be useful,
  27 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  28 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  29 *  GNU General Public License for more details.
  30 *
  31 *  You should have received a copy of the GNU General Public License
  32 *  along with this program; if not, write to the Free Software
  33 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  34 */
  35#ifndef _DCCP_CCID3_H_
  36#define _DCCP_CCID3_H_
  37
  38#include <linux/ktime.h>
  39#include <linux/list.h>
  40#include <linux/types.h>
  41#include <linux/tfrc.h>
  42#include "lib/tfrc.h"
  43#include "../ccid.h"
  44
  45/* Two seconds as per RFC 3448 4.2 */
  46#define TFRC_INITIAL_TIMEOUT       (2 * USEC_PER_SEC)
  47
  48/* In usecs - half the scheduling granularity as per RFC3448 4.6 */
  49#define TFRC_OPSYS_HALF_TIME_GRAN  (USEC_PER_SEC / (2 * HZ))
  50
  51/* Parameter t_mbi from [RFC 3448, 4.3]: backoff interval in seconds */
  52#define TFRC_T_MBI                 64
  53
  54enum ccid3_options {
  55        TFRC_OPT_LOSS_EVENT_RATE = 192,
  56        TFRC_OPT_LOSS_INTERVALS  = 193,
  57        TFRC_OPT_RECEIVE_RATE    = 194,
  58};
  59
  60struct ccid3_options_received {
  61        u64 ccid3or_seqno:48,
  62            ccid3or_loss_intervals_idx:16;
  63        u16 ccid3or_loss_intervals_len;
  64        u32 ccid3or_loss_event_rate;
  65        u32 ccid3or_receive_rate;
  66};
  67
  68/* TFRC sender states */
  69enum ccid3_hc_tx_states {
  70        TFRC_SSTATE_NO_SENT = 1,
  71        TFRC_SSTATE_NO_FBACK,
  72        TFRC_SSTATE_FBACK,
  73        TFRC_SSTATE_TERM,
  74};
  75
  76/**
  77 * struct ccid3_hc_tx_sock - CCID3 sender half-connection socket
  78 * @ccid3hctx_x - Current sending rate in 64 * bytes per second
  79 * @ccid3hctx_x_recv - Receive rate    in 64 * bytes per second
  80 * @ccid3hctx_x_calc - Calculated rate in bytes per second
  81 * @ccid3hctx_rtt - Estimate of current round trip time in usecs
  82 * @ccid3hctx_p - Current loss event rate (0-1) scaled by 1000000
  83 * @ccid3hctx_s - Packet size in bytes
  84 * @ccid3hctx_t_rto - Nofeedback Timer setting in usecs
  85 * @ccid3hctx_t_ipi - Interpacket (send) interval (RFC 3448, 4.6) in usecs
  86 * @ccid3hctx_state - Sender state, one of %ccid3_hc_tx_states
  87 * @ccid3hctx_last_win_count - Last window counter sent
  88 * @ccid3hctx_t_last_win_count - Timestamp of earliest packet
  89 *                               with last_win_count value sent
  90 * @ccid3hctx_no_feedback_timer - Handle to no feedback timer
  91 * @ccid3hctx_t_ld - Time last doubled during slow start
  92 * @ccid3hctx_t_nom - Nominal send time of next packet
  93 * @ccid3hctx_delta - Send timer delta (RFC 3448, 4.6) in usecs
  94 * @ccid3hctx_hist - Packet history
  95 * @ccid3hctx_options_received - Parsed set of retrieved options
  96 */
  97struct ccid3_hc_tx_sock {
  98        struct tfrc_tx_info             ccid3hctx_tfrc;
  99#define ccid3hctx_x                     ccid3hctx_tfrc.tfrctx_x
 100#define ccid3hctx_x_recv                ccid3hctx_tfrc.tfrctx_x_recv
 101#define ccid3hctx_x_calc                ccid3hctx_tfrc.tfrctx_x_calc
 102#define ccid3hctx_rtt                   ccid3hctx_tfrc.tfrctx_rtt
 103#define ccid3hctx_p                     ccid3hctx_tfrc.tfrctx_p
 104#define ccid3hctx_t_rto                 ccid3hctx_tfrc.tfrctx_rto
 105#define ccid3hctx_t_ipi                 ccid3hctx_tfrc.tfrctx_ipi
 106        u16                             ccid3hctx_s;
 107        enum ccid3_hc_tx_states         ccid3hctx_state:8;
 108        u8                              ccid3hctx_last_win_count;
 109        ktime_t                         ccid3hctx_t_last_win_count;
 110        struct timer_list               ccid3hctx_no_feedback_timer;
 111        ktime_t                         ccid3hctx_t_ld;
 112        ktime_t                         ccid3hctx_t_nom;
 113        u32                             ccid3hctx_delta;
 114        struct tfrc_tx_hist_entry       *ccid3hctx_hist;
 115        struct ccid3_options_received   ccid3hctx_options_received;
 116};
 117
 118static inline struct ccid3_hc_tx_sock *ccid3_hc_tx_sk(const struct sock *sk)
 119{
 120        struct ccid3_hc_tx_sock *hctx = ccid_priv(dccp_sk(sk)->dccps_hc_tx_ccid);
 121        BUG_ON(hctx == NULL);
 122        return hctx;
 123}
 124
 125/* TFRC receiver states */
 126enum ccid3_hc_rx_states {
 127        TFRC_RSTATE_NO_DATA = 1,
 128        TFRC_RSTATE_DATA,
 129        TFRC_RSTATE_TERM    = 127,
 130};
 131
 132/**
 133 * struct ccid3_hc_rx_sock - CCID3 receiver half-connection socket
 134 * @ccid3hcrx_x_recv  -  Receiver estimate of send rate (RFC 3448 4.3)
 135 * @ccid3hcrx_rtt  -  Receiver estimate of rtt (non-standard)
 136 * @ccid3hcrx_p  -  Current loss event rate (RFC 3448 5.4)
 137 * @ccid3hcrx_last_counter  -  Tracks window counter (RFC 4342, 8.1)
 138 * @ccid3hcrx_state  -  Receiver state, one of %ccid3_hc_rx_states
 139 * @ccid3hcrx_bytes_recv  -  Total sum of DCCP payload bytes
 140 * @ccid3hcrx_x_recv  -  Receiver estimate of send rate (RFC 3448, sec. 4.3)
 141 * @ccid3hcrx_rtt  -  Receiver estimate of RTT
 142 * @ccid3hcrx_tstamp_last_feedback  -  Time at which last feedback was sent
 143 * @ccid3hcrx_tstamp_last_ack  -  Time at which last feedback was sent
 144 * @ccid3hcrx_hist  -  Packet history (loss detection + RTT sampling)
 145 * @ccid3hcrx_li_hist  -  Loss Interval database
 146 * @ccid3hcrx_s  -  Received packet size in bytes
 147 * @ccid3hcrx_pinv  -  Inverse of Loss Event Rate (RFC 4342, sec. 8.5)
 148 */
 149struct ccid3_hc_rx_sock {
 150        u8                              ccid3hcrx_last_counter:4;
 151        enum ccid3_hc_rx_states         ccid3hcrx_state:8;
 152        u32                             ccid3hcrx_bytes_recv;
 153        u32                             ccid3hcrx_x_recv;
 154        u32                             ccid3hcrx_rtt;
 155        ktime_t                         ccid3hcrx_tstamp_last_feedback;
 156        struct tfrc_rx_hist             ccid3hcrx_hist;
 157        struct tfrc_loss_hist           ccid3hcrx_li_hist;
 158        u16                             ccid3hcrx_s;
 159#define ccid3hcrx_pinv                  ccid3hcrx_li_hist.i_mean
 160};
 161
 162static inline struct ccid3_hc_rx_sock *ccid3_hc_rx_sk(const struct sock *sk)
 163{
 164        struct ccid3_hc_rx_sock *hcrx = ccid_priv(dccp_sk(sk)->dccps_hc_rx_ccid);
 165        BUG_ON(hcrx == NULL);
 166        return hcrx;
 167}
 168
 169#endif /* _DCCP_CCID3_H_ */
 170