ccid3.h 5.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
/*
 *  net/dccp/ccids/ccid3.h
 *
 *  Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand.
 *
 *  An implementation of the DCCP protocol
 *
 *  This code has been developed by the University of Waikato WAND
 *  research group. For further information please see http://www.wand.net.nz/
 *  or e-mail Ian McDonald - iam4@cs.waikato.ac.nz
 *
 *  This code also uses code from Lulea University, rereleased as GPL by its
 *  authors:
 *  Copyright (c) 2003 Nils-Erik Mattsson, Joacim Haggmark, Magnus Erixzon
 *
 *  Changes to meet Linux coding standards, to make it meet latest ccid3 draft
 *  and to make it work as a loadable module in the DCCP stack written by
 *  Arnaldo Carvalho de Melo <acme@conectiva.com.br>.
 *
 *  Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
#ifndef _DCCP_CCID3_H_
#define _DCCP_CCID3_H_

39
#include <linux/config.h>
40
#include <linux/list.h>
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
#include <linux/time.h>
#include <linux/types.h>

#define TFRC_MIN_PACKET_SIZE	   16
#define TFRC_STD_PACKET_SIZE	  256
#define TFRC_MAX_PACKET_SIZE	65535

/* Two seconds as per CCID3 spec */
#define TFRC_INITIAL_TIMEOUT	   (2 * USEC_PER_SEC)

/* In usecs - half the scheduling granularity as per RFC3448 4.6 */
#define TFRC_OPSYS_HALF_TIME_GRAN  (USEC_PER_SEC / (2 * HZ))

#define TFRC_WIN_COUNT_PER_RTT	    4
#define TFRC_WIN_COUNT_LIMIT	   16

/* In seconds */
#define TFRC_MAX_BACK_OFF_TIME	   64

#define TFRC_SMALLEST_P		   40

#define TFRC_RECV_IVAL_F_LENGTH	    8

/* Number of later packets received before one is considered lost */
#define TFRC_RECV_NUM_LATE_LOSS	3

enum ccid3_options {
	TFRC_OPT_LOSS_EVENT_RATE = 192,
	TFRC_OPT_LOSS_INTERVALS	 = 193,
	TFRC_OPT_RECEIVE_RATE	 = 194,
};
72 73 74 75 76 77 78 79 80

struct ccid3_options_received {
	u64 ccid3or_seqno:48,
	    ccid3or_loss_intervals_idx:16;
	u16 ccid3or_loss_intervals_len;
	u32 ccid3or_loss_event_rate;
	u32 ccid3or_receive_rate;
};

81
/** struct ccid3_hc_tx_sock - CCID3 sender half connection sock
82 83 84 85 86 87 88 89 90
 *
  * @ccid3hctx_state - Sender state
  * @ccid3hctx_x - Current sending rate
  * @ccid3hctx_x_recv - Receive rate
  * @ccid3hctx_x_calc - Calculated send (?) rate
  * @ccid3hctx_s - Packet size
  * @ccid3hctx_rtt - Estimate of current round trip time in usecs
  * @@ccid3hctx_p - Current loss event rate (0-1) scaled by 1000000
  * @ccid3hctx_last_win_count - Last window counter sent
91 92
  * @ccid3hctx_t_last_win_count - Timestamp of earliest packet
  * 				  with last_win_count value sent
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
  * @ccid3hctx_no_feedback_timer - Handle to no feedback timer
  * @ccid3hctx_idle - FIXME
  * @ccid3hctx_t_ld - Time last doubled during slow start
  * @ccid3hctx_t_nom - Nominal send time of next packet
  * @ccid3hctx_t_ipi - Interpacket (send) interval
  * @ccid3hctx_delta - Send timer delta
  * @ccid3hctx_hist - Packet history
  */
struct ccid3_hc_tx_sock {
	u32				ccid3hctx_x;
	u32				ccid3hctx_x_recv;
	u32				ccid3hctx_x_calc;
	u16				ccid3hctx_s;
	u32				ccid3hctx_rtt;
	u32				ccid3hctx_p;
  	u8				ccid3hctx_state;
	u8				ccid3hctx_last_win_count;
	u8				ccid3hctx_idle;
	struct timeval			ccid3hctx_t_last_win_count;
	struct timer_list		ccid3hctx_no_feedback_timer;
	struct timeval			ccid3hctx_t_ld;
	struct timeval			ccid3hctx_t_nom;
115
	u32				ccid3hctx_t_rto;
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
	u32				ccid3hctx_t_ipi;
	u32				ccid3hctx_delta;
	struct list_head		ccid3hctx_hist;
	struct ccid3_options_received	ccid3hctx_options_received;
};

struct ccid3_loss_interval_hist_entry {
	struct list_head	ccid3lih_node;
	u64			ccid3lih_seqno:48,
				ccid3lih_win_count:4;
	u32			ccid3lih_interval;
};

struct ccid3_hc_rx_sock {
  	u64			ccid3hcrx_seqno_last_counter:48,
				ccid3hcrx_state:8,
				ccid3hcrx_last_counter:4;
	unsigned long		ccid3hcrx_rtt;
  	u32			ccid3hcrx_p;
  	u32			ccid3hcrx_bytes_recv;
  	struct timeval		ccid3hcrx_tstamp_last_feedback;
  	struct timeval		ccid3hcrx_tstamp_last_ack;
	struct list_head	ccid3hcrx_hist;
	struct list_head	ccid3hcrx_loss_interval_hist;
  	u16			ccid3hcrx_s;
  	u32			ccid3hcrx_pinv;
  	u32			ccid3hcrx_elapsed_time;
  	u32			ccid3hcrx_x_recv;
};

#define ccid3_hc_tx_field(s,field) (s->dccps_hc_tx_ccid_private == NULL ? 0 : \
147
    ((struct ccid3_hc_tx_sock *)s->dccps_hc_tx_ccid_private)->ccid3hctx_##field)
148 149

#define ccid3_hc_rx_field(s,field) (s->dccps_hc_rx_ccid_private == NULL ? 0 : \
150
    ((struct ccid3_hc_rx_sock *)s->dccps_hc_rx_ccid_private)->ccid3hcrx_##field)
151 152

#endif /* _DCCP_CCID3_H_ */