Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
dccp
ccids
lib
packet_history.h
Go to the documentation of this file.
1
/*
2
* Packet RX/TX history data structures and routines for TFRC-based protocols.
3
*
4
* Copyright (c) 2007 The University of Aberdeen, Scotland, UK
5
* Copyright (c) 2005-6 The University of Waikato, Hamilton, New Zealand.
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 -
[email protected]
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 <
[email protected]
>.
18
*
19
* Copyright (c) 2005 Arnaldo Carvalho de Melo <
[email protected]
>
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
36
#ifndef _DCCP_PKT_HIST_
37
#define _DCCP_PKT_HIST_
38
39
#include <linux/list.h>
40
#include <linux/slab.h>
41
#include "
tfrc.h
"
42
49
struct
tfrc_tx_hist_entry
{
50
struct
tfrc_tx_hist_entry
*
next
;
51
u64
seqno
;
52
ktime_t
stamp
;
53
};
54
55
static
inline
struct
tfrc_tx_hist_entry
*
56
tfrc_tx_hist_find_entry(
struct
tfrc_tx_hist_entry
*
head
,
u64
seqno
)
57
{
58
while
(head !=
NULL
&& head->
seqno
!= seqno)
59
head = head->
next
;
60
return
head
;
61
}
62
63
extern
int
tfrc_tx_hist_add
(
struct
tfrc_tx_hist_entry
**headp,
u64
seqno
);
64
extern
void
tfrc_tx_hist_purge
(
struct
tfrc_tx_hist_entry
**headp);
65
66
/* Subtraction a-b modulo-16, respects circular wrap-around */
67
#define SUB16(a, b) (((a) + 16 - (b)) & 0xF)
68
69
/* Number of packets to wait after a missing packet (RFC 4342, 6.1) */
70
#define TFRC_NDUPACK 3
71
79
struct
tfrc_rx_hist_entry
{
80
u64
tfrchrx_seqno
:48,
81
tfrchrx_ccval
:4,
82
tfrchrx_type
:4;
83
u64
tfrchrx_ndp
:48;
84
ktime_t
tfrchrx_tstamp
;
85
};
86
94
struct
tfrc_rx_hist
{
95
struct
tfrc_rx_hist_entry
*
ring
[
TFRC_NDUPACK
+ 1];
96
u8
loss_count
:2,
97
loss_start
:2;
98
#define rtt_sample_prev loss_start
99
};
100
104
static
inline
u8
tfrc_rx_hist_index(
const
struct
tfrc_rx_hist
*
h
,
const
u8
n
)
105
{
106
return
(h->
loss_start
+ n) &
TFRC_NDUPACK
;
107
}
108
112
static
inline
struct
tfrc_rx_hist_entry
*
113
tfrc_rx_hist_last_rcv(
const
struct
tfrc_rx_hist
*
h
)
114
{
115
return
h->
ring
[tfrc_rx_hist_index(h, h->
loss_count
)];
116
}
117
121
static
inline
struct
tfrc_rx_hist_entry
*
122
tfrc_rx_hist_entry
(
const
struct
tfrc_rx_hist
*
h
,
const
u8
n
)
123
{
124
return
h->
ring
[tfrc_rx_hist_index(h, n)];
125
}
126
130
static
inline
struct
tfrc_rx_hist_entry
*
131
tfrc_rx_hist_loss_prev(
const
struct
tfrc_rx_hist
*
h
)
132
{
133
return
h->
ring
[h->
loss_start
];
134
}
135
136
/* indicate whether previously a packet was detected missing */
137
static
inline
bool
tfrc_rx_hist_loss_pending(
const
struct
tfrc_rx_hist
*
h
)
138
{
139
return
h->
loss_count
> 0;
140
}
141
142
extern
void
tfrc_rx_hist_add_packet
(
struct
tfrc_rx_hist
*
h
,
143
const
struct
sk_buff
*
skb
,
const
u64
ndp);
144
145
extern
int
tfrc_rx_hist_duplicate
(
struct
tfrc_rx_hist
*
h
,
struct
sk_buff
*
skb
);
146
147
struct
tfrc_loss_hist
;
148
extern
int
tfrc_rx_handle_loss
(
struct
tfrc_rx_hist
*
h
,
149
struct
tfrc_loss_hist
*lh,
150
struct
sk_buff
*
skb
,
const
u64
ndp,
151
u32
(*first_li)(
struct
sock
*
sk
),
152
struct
sock
*sk);
153
extern
u32
tfrc_rx_hist_sample_rtt
(
struct
tfrc_rx_hist
*h,
154
const
struct
sk_buff
*skb);
155
extern
int
tfrc_rx_hist_alloc
(
struct
tfrc_rx_hist
*h);
156
extern
void
tfrc_rx_hist_purge
(
struct
tfrc_rx_hist
*h);
157
158
#endif
/* _DCCP_PKT_HIST_ */
Generated on Thu Jan 10 2013 14:57:54 for Linux Kernel by
1.8.2