diff options
| author | Sridhar Samudrala <sri@us.ibm.com> | 2003-02-17 18:09:28 -0800 |
|---|---|---|
| committer | Sridhar Samudrala <sri@us.ibm.com> | 2003-02-17 18:09:28 -0800 |
| commit | 9967b51fc01aae6d822ad62ff031ff2d656d5b10 (patch) | |
| tree | e956f79d598e25a7a42faab23d0794ec992c20fa /include/net/sctp/tsnmap.h | |
| parent | 611f4c044cbd8595d40d09a34981e57aa8aa5f30 (diff) | |
| parent | 13970d8e1ff3451967050309ce14ae2b6160bfd5 (diff) | |
Merge us.ibm.com:/home/sridhar/BK/linux-2.5.62
into us.ibm.com:/home/sridhar/BK/lksctp-2.5.62
Diffstat (limited to 'include/net/sctp/tsnmap.h')
| -rw-r--r-- | include/net/sctp/tsnmap.h | 96 |
1 files changed, 59 insertions, 37 deletions
diff --git a/include/net/sctp/tsnmap.h b/include/net/sctp/tsnmap.h index af775264a785..70bea4ce1a98 100644 --- a/include/net/sctp/tsnmap.h +++ b/include/net/sctp/tsnmap.h @@ -1,35 +1,35 @@ /* SCTP kernel reference Implementation Copyright (C) 1999-2001 * Cisco, Motorola, Intel, and International Business Machines Corp. - * + * * This file is part of the SCTP kernel reference Implementation - * + * * These are the definitions needed for the tsnmap type. The tsnmap is used * to track out of order TSNs received. - * - * The SCTP reference implementation is free software; - * you can redistribute it and/or modify it under the terms of + * + * The SCTP reference implementation 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, or (at your option) * any later version. - * - * the SCTP reference implementation is distributed in the hope that it + * + * the SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to * the Free Software Foundation, 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * + * Boston, MA 02111-1307, USA. + * * Please send any bug reports or fixes you make to one of the * following email addresses: - * + * * Jon Grimm <jgrimm@us.ibm.com> * La Monte H.P. Yarroll <piggy@acm.org> * Karl Knutson <karl@athena.chicago.il.us> - * + * * Any bugs reported given to us we will try to fix... any fixes shared will * be incorporated into the next SCTP release. */ @@ -38,8 +38,6 @@ #ifndef __sctp_tsnmap_h__ #define __sctp_tsnmap_h__ - - /* RFC 2960 12.2 Parameters necessary per association (i.e. the TCB) * Mapping An array of bits or bytes indicating which out of * Array order TSN's have been received (relative to the @@ -48,9 +46,7 @@ * will be set to all zero. This structure may be * in the form of a circular buffer or bit array. */ -typedef struct sctp_tsnmap { - - +struct sctp_tsnmap { /* This array counts the number of chunks with each TSN. * It points at one of the two buffers with which we will * ping-pong between. @@ -93,25 +89,30 @@ typedef struct sctp_tsnmap { /* This is the highest TSN we've marked. */ __u32 max_tsn_seen; - /* No. of data chunks pending receipt. used by SCTP_STATUS sockopt */ + /* Data chunks pending receipt. used by SCTP_STATUS sockopt */ __u16 pending_data; + /* We record duplicate TSNs here. We clear this after + * every SACK. Store up to SCTP_MAX_DUP_TSNS worth of + * information. + */ + __u32 dup_tsns[SCTP_MAX_DUP_TSNS]; + __u16 num_dup_tsns; + int malloced; __u8 raw_map[0]; -} sctp_tsnmap_t; +}; -typedef struct sctp_tsnmap_iter { +struct sctp_tsnmap_iter { __u32 start; -} sctp_tsnmap_iter_t; - +}; /* Create a new tsnmap. */ -sctp_tsnmap_t *sctp_tsnmap_new(__u16 len, __u32 initial_tsn, - int priority); +struct sctp_tsnmap *sctp_tsnmap_new(__u16 len, __u32 init_tsn, int priority); /* Dispose of a tsnmap. */ -void sctp_tsnmap_free(sctp_tsnmap_t *map); +void sctp_tsnmap_free(struct sctp_tsnmap *); /* This macro assists in creation of external storage for variable length * internal buffers. We double allocate so the overflow map works. @@ -119,9 +120,8 @@ void sctp_tsnmap_free(sctp_tsnmap_t *map); #define sctp_tsnmap_storage_size(count) (sizeof(__u8) * (count) * 2) /* Initialize a block of memory as a tsnmap. */ -sctp_tsnmap_t *sctp_tsnmap_init(sctp_tsnmap_t *map, __u16 len, __u32 initial_tsn); - - +struct sctp_tsnmap *sctp_tsnmap_init(struct sctp_tsnmap *, __u16 len, + __u32 initial_tsn); /* Test the tracking state of this TSN. * Returns: @@ -129,29 +129,51 @@ sctp_tsnmap_t *sctp_tsnmap_init(sctp_tsnmap_t *map, __u16 len, __u32 initial_tsn * >0 if the TSN has been seen (duplicate) * <0 if the TSN is invalid (too large to track) */ -int sctp_tsnmap_check(const sctp_tsnmap_t *map, __u32 tsn); +int sctp_tsnmap_check(const struct sctp_tsnmap *, __u32 tsn); /* Mark this TSN as seen. */ -void sctp_tsnmap_mark(sctp_tsnmap_t *map, __u32 tsn); +void sctp_tsnmap_mark(struct sctp_tsnmap *, __u32 tsn); /* Retrieve the Cumulative TSN ACK Point. */ -__u32 sctp_tsnmap_get_ctsn(const sctp_tsnmap_t *map); +__u32 sctp_tsnmap_get_ctsn(const struct sctp_tsnmap *); /* Retrieve the highest TSN we've seen. */ -__u32 sctp_tsnmap_get_max_tsn_seen(const sctp_tsnmap_t *map); +__u32 sctp_tsnmap_get_max_tsn_seen(const struct sctp_tsnmap *); + +/* How many Duplicate TSNs are stored? */ +static inline __u16 sctp_tsnmap_num_dups(struct sctp_tsnmap *map) +{ + return map->num_dup_tsns; +} + +/* Return pointer to duplicate tsn array as needed by SACK. */ +static inline __u32 *sctp_tsnmap_get_dups(struct sctp_tsnmap *map) +{ + map->num_dup_tsns = 0; + return map->dup_tsns; +} + +/* Mark a duplicate TSN. Note: we limit how many we are willing to + * store and consequently report. + */ +static inline void sctp_tsnmap_mark_dup(struct sctp_tsnmap *map, __u32 tsn) +{ + if (map->num_dup_tsns < SCTP_MAX_DUP_TSNS) + map->dup_tsns[map->num_dup_tsns++] = tsn; +} /* Is there a gap in the TSN map? */ -int sctp_tsnmap_has_gap(const sctp_tsnmap_t *map); +int sctp_tsnmap_has_gap(const struct sctp_tsnmap *); /* Initialize a gap ack block interator from user-provided memory. */ -void sctp_tsnmap_iter_init(const sctp_tsnmap_t *map, sctp_tsnmap_iter_t *iter); +void sctp_tsnmap_iter_init(const struct sctp_tsnmap *, + struct sctp_tsnmap_iter *); /* Get the next gap ack blocks. We return 0 if there are no more * gap ack blocks. */ -int sctp_tsnmap_next_gap_ack(const sctp_tsnmap_t *map, sctp_tsnmap_iter_t *iter, - __u16 *start, __u16 *end); - +int sctp_tsnmap_next_gap_ack(const struct sctp_tsnmap *, + struct sctp_tsnmap_iter *,__u16 *start, __u16 *end); #endif /* __sctp_tsnmap_h__ */ |
