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
include
net
sctp
tsnmap.h
Go to the documentation of this file.
1
/* SCTP kernel implementation
2
* (C) Copyright IBM Corp. 2001, 2004
3
* Copyright (c) 1999-2000 Cisco, Inc.
4
* Copyright (c) 1999-2001 Motorola, Inc.
5
* Copyright (c) 2001 Intel Corp.
6
*
7
* This file is part of the SCTP kernel implementation
8
*
9
* These are the definitions needed for the tsnmap type. The tsnmap is used
10
* to track out of order TSNs received.
11
*
12
* This SCTP implementation is free software;
13
* you can redistribute it and/or modify it under the terms of
14
* the GNU General Public License as published by
15
* the Free Software Foundation; either version 2, or (at your option)
16
* any later version.
17
*
18
* This SCTP implementation is distributed in the hope that it
19
* will be useful, but WITHOUT ANY WARRANTY; without even the implied
20
* ************************
21
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22
* See the GNU General Public License for more details.
23
*
24
* You should have received a copy of the GNU General Public License
25
* along with GNU CC; see the file COPYING. If not, write to
26
* the Free Software Foundation, 59 Temple Place - Suite 330,
27
* Boston, MA 02111-1307, USA.
28
*
29
* Please send any bug reports or fixes you make to the
30
* email address(es):
31
* lksctp developers <
[email protected]
>
32
*
33
* Or submit a bug report through the following website:
34
* http://www.sf.net/projects/lksctp
35
*
36
* Written or modified by:
37
* Jon Grimm <
[email protected]
>
38
* La Monte H.P. Yarroll <
[email protected]
>
39
* Karl Knutson <
[email protected]
>
40
* Sridhar Samudrala <
[email protected]
>
41
*
42
* Any bugs reported given to us we will try to fix... any fixes shared will
43
* be incorporated into the next SCTP release.
44
*/
45
#include <
net/sctp/constants.h
>
46
47
#ifndef __sctp_tsnmap_h__
48
#define __sctp_tsnmap_h__
49
50
/* RFC 2960 12.2 Parameters necessary per association (i.e. the TCB)
51
* Mapping An array of bits or bytes indicating which out of
52
* Array order TSN's have been received (relative to the
53
* Last Rcvd TSN). If no gaps exist, i.e. no out of
54
* order packets have been received, this array
55
* will be set to all zero. This structure may be
56
* in the form of a circular buffer or bit array.
57
*/
58
struct
sctp_tsnmap
{
59
/* This array counts the number of chunks with each TSN.
60
* It points at one of the two buffers with which we will
61
* ping-pong between.
62
*/
63
unsigned
long
*
tsn_map
;
64
65
/* This is the TSN at tsn_map[0]. */
66
__u32
base_tsn
;
67
68
/* Last Rcvd : This is the last TSN received in
69
* TSN : sequence. This value is set initially by
70
* : taking the peer's Initial TSN, received in
71
* : the INIT or INIT ACK chunk, and subtracting
72
* : one from it.
73
*
74
* Throughout most of the specification this is called the
75
* "Cumulative TSN ACK Point". In this case, we
76
* ignore the advice in 12.2 in favour of the term
77
* used in the bulk of the text.
78
*/
79
__u32
cumulative_tsn_ack_point
;
80
81
/* This is the highest TSN we've marked. */
82
__u32
max_tsn_seen
;
83
84
/* This is the minimum number of TSNs we can track. This corresponds
85
* to the size of tsn_map. Note: the overflow_map allows us to
86
* potentially track more than this quantity.
87
*/
88
__u16
len
;
89
90
/* Data chunks pending receipt. used by SCTP_STATUS sockopt */
91
__u16
pending_data
;
92
93
/* Record duplicate TSNs here. We clear this after
94
* every SACK. Store up to SCTP_MAX_DUP_TSNS worth of
95
* information.
96
*/
97
__u16
num_dup_tsns
;
98
__be32
dup_tsns
[
SCTP_MAX_DUP_TSNS
];
99
};
100
101
struct
sctp_tsnmap_iter
{
102
__u32
start
;
103
};
104
105
/* Initialize a block of memory as a tsnmap. */
106
struct
sctp_tsnmap
*
sctp_tsnmap_init
(
struct
sctp_tsnmap
*,
__u16
len
,
107
__u32
initial_tsn,
gfp_t
gfp);
108
109
void
sctp_tsnmap_free
(
struct
sctp_tsnmap
*
map
);
110
111
/* Test the tracking state of this TSN.
112
* Returns:
113
* 0 if the TSN has not yet been seen
114
* >0 if the TSN has been seen (duplicate)
115
* <0 if the TSN is invalid (too large to track)
116
*/
117
int
sctp_tsnmap_check
(
const
struct
sctp_tsnmap
*,
__u32
tsn);
118
119
/* Mark this TSN as seen. */
120
int
sctp_tsnmap_mark
(
struct
sctp_tsnmap
*,
__u32
tsn,
121
struct
sctp_transport
*
trans
);
122
123
/* Mark this TSN and all lower as seen. */
124
void
sctp_tsnmap_skip
(
struct
sctp_tsnmap
*
map
,
__u32
tsn);
125
126
/* Retrieve the Cumulative TSN ACK Point. */
127
static
inline
__u32
sctp_tsnmap_get_ctsn(
const
struct
sctp_tsnmap
*
map
)
128
{
129
return
map->
cumulative_tsn_ack_point
;
130
}
131
132
/* Retrieve the highest TSN we've seen. */
133
static
inline
__u32
sctp_tsnmap_get_max_tsn_seen(
const
struct
sctp_tsnmap
*
map
)
134
{
135
return
map->
max_tsn_seen
;
136
}
137
138
/* How many duplicate TSNs are stored? */
139
static
inline
__u16
sctp_tsnmap_num_dups(
struct
sctp_tsnmap
*
map
)
140
{
141
return
map->
num_dup_tsns
;
142
}
143
144
/* Return pointer to duplicate tsn array as needed by SACK. */
145
static
inline
__be32
*sctp_tsnmap_get_dups(
struct
sctp_tsnmap
*
map
)
146
{
147
map->
num_dup_tsns
= 0;
148
return
map->
dup_tsns
;
149
}
150
151
/* How many gap ack blocks do we have recorded? */
152
__u16
sctp_tsnmap_num_gabs
(
struct
sctp_tsnmap
*
map
,
153
struct
sctp_gap_ack_block
*gabs);
154
155
/* Refresh the count on pending data. */
156
__u16
sctp_tsnmap_pending
(
struct
sctp_tsnmap
*
map
);
157
158
/* Is there a gap in the TSN map? */
159
static
inline
int
sctp_tsnmap_has_gap(
const
struct
sctp_tsnmap
*
map
)
160
{
161
return
map->
cumulative_tsn_ack_point
!= map->
max_tsn_seen
;
162
}
163
164
/* Mark a duplicate TSN. Note: limit the storage of duplicate TSN
165
* information.
166
*/
167
static
inline
void
sctp_tsnmap_mark_dup(
struct
sctp_tsnmap
*
map
,
__u32
tsn)
168
{
169
if
(map->
num_dup_tsns
<
SCTP_MAX_DUP_TSNS
)
170
map->
dup_tsns
[map->
num_dup_tsns
++] =
htonl
(tsn);
171
}
172
173
/* Renege a TSN that was seen. */
174
void
sctp_tsnmap_renege
(
struct
sctp_tsnmap
*,
__u32
tsn);
175
176
/* Is there a gap in the TSN map? */
177
int
sctp_tsnmap_has_gap(
const
struct
sctp_tsnmap
*);
178
179
#endif
/* __sctp_tsnmap_h__ */
Generated on Thu Jan 10 2013 14:53:17 for Linux Kernel by
1.8.2