linux/net/sctp/tsnmap.c
<<
v4.0.2 v4.0.1 v4.0 3option value="34.8.1" > v4.8.1 3. value="v3.18.2 > v3.18.2 v3.18 3o6tion value="3468.1" > v4.8.1 3.6value="v3.18.26 > v3.18.2 3.16.37 3o.14.9"v3.15.6" .140.1" > v4.8.1 3..1408"v3.15.6" .140 > v3.18.2 v4.1.5 4v97> v4.1.13<4v9 224v96> v4.1.13<4v9" > v4.1.9 v4.1.13<4v95 > v4.1.5 v4.1.13<4v9" > v4.1.7 v4.1.13<4v9 v3.12.26 v4.1.13<4v9" > v4.1.5 v4.1.13<4v9 > v4.1.5 v4.1.13<4v9 v4.1.13 4v87> v4.1.13<4v8 224v86> v4.1.13<4v8" > v4.1.9 v4.1.13<4v85 > v4.1.5 v4.1.13<4v8" > v4.1.7 v4.1.13<4v8 v3.12.26 v4.1.13<4v8" > v4.1.5 v4.1.13<4v8 > v4.1.5 v4.1.13<4v8 v4.1.13 v4.1.13<2v8 v3.12.26 v4.1.13<2v8" > v4.1.5 v4.1.13<2v8 > v4.1.5 v4.1.13<2v8 v4.1.13 2.34 12.34 v3.12 v3.1.14 v3.15.9 v4.1.13 v4.1.13<0v30 v4.1.13 0v97> v4.1.13<0v9 220v96> v4.1.13<0v9" > v4.1.9 v4.1.13<0v95 > v4.1.5 v4.1.13<0v9" > v4.1.7 v4.1.13<0v9 v3.12.26 v4.1.13<0v9" > v4.1.5 v4.1.13<0v9 > v4.1.5 v4.1.13<0v9 v4.1.13 0v87> v4.1.13<0v8 220v86> v4.1.13<0v8" > v4.1.9 v4.1.13<0v85 > v4.1.5 v4.1.13<0v8" > v4.1.7 v4.1.13<0v8 v3.12.26 v4.1.13<0v8" > v4.1.5 v4.1.13<0v8 > v4.1.5 v4.1.13<0v8 v4.1.13 v4.1.13<0v3 v3.12.26 v4.1.13<0v3" > v4.1.5 v4.1.13<0v3 > v4.1.5 v4.1.13<0v30 > v4.1.5 v4.1.13<0v9 > v4.1.5 v4.1.13<0v874 v4.1.13<0v3 > v4.1.5 v4.1.13<0 > v4.1.5 ue="v3.19.7" 2 > ue= > v4.1.5 ue3"v3.19.7" 2 > ue224 ue1"v3.19.7" 2 > ue3 > v4.1.5 u"v3.19.7" 2 > u > v4.1.5 v3.18.11" 2 > v3. > v4.1.5 v3718.11" 2 > v3 64 5v31"v3.19.7" 2 > 5v3 > v4.1.5 5v30"v3.19.7" 2 > 5v30 > v4.1.5 5.u"v3.19.7" 2 > 5v9 > v4.1.5 5v>"v3.19.7" 2 > 53. > v4.1.5 53718.11" 2 > v3.15.10 5v3"v3.19.7" 2 > 5v3 > v4.1.5 5"v3.19.7" 2 > 5 > v4.1.5 .14.18" > 2 > .14. > v4.1.5 .144> v4.1.12 > .14.17 .14> v4.1.12 > .1.17 3144> v4.1.12 > 314.17 3 31.22 314> v4.1.12 > 31.17 6u"v3.19.7" 2 > 2> v3.13.1 2 3.12.12 3vu"v3.19.7" 2 > /v9 > v4.1.5 /v>"v3.19.7" 2 > /v874 0vu"v3.19.7" 2 > 0v9 > v4.1.5 0v>"v3.19.7" 2 > 0v874 0v3"v3.19.7" 2 > 0v3 > v4.1.5 0"v3.19.7" 2 > 0 > v4.1.5 29 2"v3.19.7" 2 > 2 > v4.0 2ue3"v3.19.7" 2 > 2ue224 2ue1"v3.19.7" 2 > 2ue3 > v4.1.5 2u"v3.19.7" 2 > 2.32 27 2u"v3.19.7" 2 > 27 2.32 25v31"v3.19.7" 2 > 25v3 > v4.1.5 25v30"v3.19.7" 2 > 25v30 > v4.1.5 25.u"v3.19.7" 2 > 25v9 > v4.1.5 25v>"v3.19.7" 2 > 253. > v4.1.5 253718.11" 2 > 2 v3.15.10 25v3"v3.19.7" 2 > 25v3 > v4.1.5 2518.11" 2 > 2 v3.15.8 2.14> v4.1.12 > 2.1.17 23144> v4.1.12 > 2314.17 23 231.22 2314> v4.1.12 > 231.17 22 23.12.12 20v33"v3.19.7" 2 > 20v3 v3.12.26 20v32"v3.19.7" 2 > 20v3" > v4.1.5 20v31"v3.19.7" 2 > 2012.14 20vu"v3.19.7" 2 > 20v9 > v4.1.5 20v>"v3.19.7" 2 > 20v874 20v3"v3.19.7" 2 > 20v3 > v4.1.5 20"v3.19.7" 2 > 20 > v4.1.5 19v718.11" 2 > 19v7 > v4.1.5 19v618.11" 2 > 19v254 1ue3"v3.19.7" 2 > 1ue224 1ue1"v3.19.7" 2 > 1ue3 > v4.1.5 1u"v3.19.7" 2 > 2.22 1> 2u"v3.19.7" 2 > 1> 2u > v4.1.5 1> 28"v3.19.7" 2 > 16v2.31 16 1u"v3.19.7" 2 > 26 2.22 15v3"v3.19.7" 2 > 15v3 > v4.1.5 2518.11" 2 > 1 v3.15.8 1.14> v4.1.12 > 1.1.17 1314> v4.1.12 > 131.17 v3.1 /spaion /formon a v3.1 href="../linux+v3 > 1/net/sctp/tsnmap.c">v3.1 img src="../.static/gfx/right.png" alt=">>">v3 /spaionv3 spai class="lxr_search">v3.1v3.1 input typluehidden" namluenavtarget" n value">v3.1 input typluetext" namluesearch" iduesearch">v3.1 butttiotypluesubmit">Searchv3.1 Prefsn /a>v3 /spaion.1 /divon.1 form acopti="ajax+*" method="post" onsubmit="return false;">v3 input typluehidden" namlueajax_lookup" idueajax_lookup" n value">v.1 /formonv.1 div class="headingbotttm">n div iduefile_contents"o
 
1 /a> spai class="comment">/* SCTP kernel implementaopti /spaion
 
2 /a> spai class="comment"> * (C) Copyright IBM Corp. 2001, 2004 /spaion
 
3 /a> spai class="comment"> * Copyright (c) 1999-2000 Cisco, Inc. /spaion
 
4 /a> spai class="comment"> * Copyright (c) 1999-2001 Motorola, Inc. /spaion
 
5 /a> spai class="comment"> * Copyright (c) 2001 Intel Corp. /spaion
 
6 /a> spai class="comment"> * /spaion
 
7 /a> spai class="comment"> * This file is part of the SCTP kernel implementaopti /spaion
 
8 /a> spai class="comment"> * /spaion
 
9 /a> spai class="comment"> * These funcoptis manipulate sctp tsn mapping array. /spaion
 8.13a> spai class="comment"> * /spaion
 11 /a> spai class="comment"> * This SCTP implementaopti is free software; /spaion
 12 /a> spai class="comment"> * you cai redistribute it and/or modify it under the terms of /spaion
 13 /a> spai class="comment"> * the GNU General Public License as published by /spaion
 14 /a> spai class="comment"> * the Free Software Foundaopti; either verspti 2, or (at your 
 15 /a> spai class="comment"> * any later verspti. /spaion
 16 /a> spai class="comment"> * /spaion
 17 /a> spai class="comment"> * This SCTP implementaopti is distributed in the hope that it /spaion
 18 /a> spai class="comment"> * will be useful, but WITHOUT ANY WARRANTY; without even the implied /spaion
 19 /a> spai class="comment"> *                 ************************ /spaion
 2.13a> spai class="comment"> * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. /spaion
 21 /a> spai class="comment"> * See the GNU General Public License for more details. /spaion
 22 /a> spai class="comment"> * /spaion
 23 /a> spai class="comment"> * You should have received a copy of the GNU General Public License /spaion
 24 /a> spai class="comment"> * along with GNU CC; see the file COPYING.  If not, write to /spaion
 25 /a> spai class="comment"> * the Free Software Foundaopti, 59 Temple Place - Suite 330, /spaion
 26 /a> spai class="comment"> * Bostti, MA 02111-1307, USA. /spaion
 27 /a> spai class="comment"> * /spaion
 28 /a> spai class="comment"> * Please send any bug reports or fixes you make to the /spaion
 29 /a> spai class="comment"> * email address(es): /spaion
 3.13a> spai class="comment"> *    lksctp developers <lksctp-developers@lists.sourceforge.net> /spaion
 31 /a> spai class="comment"> * /spaion
 32 /a> spai class="comment"> * Or submit a bug report through the following website: /spaion
 33 /a> spai class="comment"> *  
 http://www.sf.net/projects/lksctp /spaion
 34 /a> spai class="comment"> * /spaion
 35 /a> spai class="comment"> * Written or modified by: /spaion
 36 /a> spai class="comment"> *    La Monte H.P. Yarroll <piggy@acm.org> /spaion
 37 /a> spai class="comment"> *    Jti Grimm             <jgrimm@us.ibm.com> /spaion
 38 /a> spai class="comment"> *    Karl Knutsti          <karl@athena.chicago.il.us> /spaion
 39 /a> spai class="comment"> *    Sridhar Samudrala     <sri@us.ibm.com> /spaion
 4.13a> spai class="comment"> * /spaion
 41 /a> spai class="comment"> * Any bugs reported given to us we will try to fix... any fixes shared will /spaion
 42 /a> spai class="comment"> * be incorporated into the next SCTP release. /spaion
 43 /a> spai class="comment"> */ /spaion
 44 /a>n
 45 /a>#include <linux/slab.h /a>>n
 46 /a>#include <linux/typls.h /a>>n
 47 /a>#include <linux/bitmap.h /a>>n
 48 /a>#include <net/sctp/sctp.h /a>>n
 49 /a>#include <net/sctp/sm.h /a>>n
 50 /a>n
 51 /a>static void
 a href="+code=sctp_tsnmap_updaoe" class="sref">sctp_tsnmap_updaoe /a>(struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>);n
 52 /a>static void
 a href="+code=sctp_tsnmap_find_gap_ack" class="sref">sctp_tsnmap_find_gap_ack /a>(unsigned long * a href="+code=map" class="sref">map /a>,
 a href="+code=__u16" class="sref">__u16 /a>  a href="+code=off" class="sref">off /a>,n
 53 /a>                                      a href="+code=__u16" class="sref">__u16 /a>  a href="+code=len" class="sref">len /a>,
 a href="+code=__u16" class="sref">__u16 /a> * a href="+code=start" class="sref">start /a>,
 a href="+code=__u16" class="sref">__u16 /a> * a href="+code=end" class="sref">end /a>);n
 54 /a>static int
 a href="+code=sctp_tsnmap_grow" class="sref">sctp_tsnmap_grow /a>(struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>,
 a href="+code=u16" class="sref">u16 /a>  a href="+code=gap" class="sref">gap /a>);n
 55 /a>n
 56 /a> spai class="comment">/* Initialize a block of memory as a tsnmap.  */ /spaion
 57 /a>struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=sctp_tsnmap_init" class="sref">sctp_tsnmap_init /a>(struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>,
 a href="+code=__u16" class="sref">__u16 /a>  a href="+code=len" class="sref">len /a>,n
 58 /a>                                      a href="+code=__u32" class="sref">__u32 /a>  a href="+code=initial_tsn" class="sref">initial_tsn /a>,
 a href="+code=gfp_t" class="sref">gfp_t /a>  a href="+code=gfp" class="sref">gfp /a>)n
 59 /a>{n
 60 /a>        if (! a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>) {n
 61 /a>                 a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a> =  a href="+code=kzalloc" class="sref">kzalloc /a>( a href="+code=len" class="sref">len /a>>>3,
 a href="+code=gfp" class="sref">gfp /a>);n
 62 /a>                if ( a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a> ==  a href="+code=NULL" class="sref">NULL /a>)n
 63 /a>                        return  a href="+code=NULL" class="sref">NULL /a>;n
 64 /a>n
 65 /a>                 a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a> =  a href="+code=len" class="sref">len /a>;n
 66 /a>        } else {n
 67 /a>                 a href="+code=bitmap_zero" class="sref">bitmap_zero /a>( a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a>);n
 68 /a>        }n
 69 /a>n
 70 /a>         spai class="comment">/* Keep track of TSNs represented by tsn_map.  */ /spaion
 71 /a>         a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a> =  a href="+code=initial_tsn" class="sref">initial_tsn /a>;n
 72 /a>         a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a> =  a href="+code=initial_tsn" class="sref">initial_tsn /a> - 1;n
 73 /a>         a href="+code=map" class="sref">map /a>-> a href="+code=max_tsn_seen" class="sref">max_tsn_seen /a> =  a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a>;n
 74 /a>         a href="+code=map" class="sref">map /a>-> a href="+code=num_dup_tsns" class="sref">num_dup_tsns /a> = 0;n
 75 /a>n
 76 /a>        return  a href="+code=map" class="sref">map /a>;n
 77 /a>}n
 78 /a>n
 79 /a>void
 a href="+code=sctp_tsnmap_free" class="sref">sctp_tsnmap_free /a>(struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>)n
 80 /a>{n
 81 /a>         a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a> = 0;n
 82 /a>         a href="+code=kfree" class="sref">kfree /a>( a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>);n
 83 /a>}n
 84 /a>n
 85 /a> spai class="comment">/* Test the tracking state of this TSN. /spaion
 86 /a> spai class="comment"> * Returns: /spaion
 87 /a> spai class="comment"> *   0 if the TSN has not yet been seen /spaion
 88 /a> spai class="comment"> *  >0 if the TSN has been seen (duplicate) /spaion
 89 /a> spai class="comment"> *  <0 if the TSN is invalid
(too large to track) /spaion
 9.13a> spai class="comment"> */ /spaion
 91 /a>int
 a href="+code=sctp_tsnmap_check" class="sref">sctp_tsnmap_check /a>(const struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>,
 a href="+code=__u32" class="sref">__u32 /a>  a href="+code=tsn" class="sref">tsn /a>)n
 92 /a>{n
 93 /a>         a href="+code=u32" class="sref">u32 /a>  a href="+code=gap" class="sref">gap /a>;n
 94 /a>n
 95 /a>         spai class="comment">/* Check to see if this is ai old TSN */ /spaion
 96 /a>        if ( a href="+code=TSN_loe" class="sref">TSN_loe /a>( a href="+code=tsn" class="sref">tsn /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a>))n
 97 /a>                return 1;n
 98 /a>n
 99 /a>         spai class="comment">/* Verify that we cai hold this TSN and that it will not /spaion
10013a> spai class="comment">         * overlfow our map /spaion
101 /a> spai class="comment">         */ /spaion
102 /a>        if (! a href="+code=TSN_lo" class="sref">TSN_lo /a>( a href="+code=tsn" class="sref">tsn /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a> +
 a href="+code=SCTP_TSN_MAP_SIZE" class="sref">SCTP_TSN_MAP_SIZE /a>))n
103 /a>                return -1;n
104 /a>n
105 /a>         spai class="comment">/* Calculate the index into the mapping arrays.  */ /spaion
106 /a>         a href="+code=gap" class="sref">gap /a> =  a href="+code=tsn" class="sref">tsn /a> -
 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a>;n
107 /a>n
108 /a>         spai class="comment">/* Check to see if TSN has already been recorded.  */ /spaion
109 /a>        if ( a href="+code=gap" class="sref">gap /a> <  a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a> &&  a href="+code=test_bit" class="sref">test_bit /a>( a href="+code=gap" class="sref">gap /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>))n
110 /a>                return 1;n
111 /a>        elsen
112 /a>                return 0;n
113 /a>}n
114 /a>n
115 /a>n
116 /a> spai class="comment">/* Mark this TSN as seen.  */ /spaion
117 /a>int
 a href="+code=sctp_tsnmap_mark" class="sref">sctp_tsnmap_mark /a>(struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>,
 a href="+code=__u32" class="sref">__u32 /a>  a href="+code=tsn" class="sref">tsn /a>,n
118 /a>                     struct
 a href="+code=sctp_transport" class="sref">sctp_transport /a> * a href="+code=trans" class="sref">trans /a>)n
119 /a>{n
120 /a>         a href="+code=u16" class="sref">u16 /a>  a href="+code=gap" class="sref">gap /a>;n
121 /a>n
122 /a>        if ( a href="+code=TSN_lo" class="sref">TSN_lo /a>( a href="+code=tsn" class="sref">tsn /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a>))n
123 /a>                return 0;n
124 /a>n
125 /a>         a href="+code=gap" class="sref">gap /a> =  a href="+code=tsn" class="sref">tsn /a> -
 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a>;n
126 /a>n
127 /a>        if ( a href="+code=gap" class="sref">gap /a> >=  a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a> && ! a href="+code=sctp_tsnmap_grow" class="sref">sctp_tsnmap_grow /a>( a href="+code=map" class="sref">map /a>,
 a href="+code=gap" class="sref">gap /a>))n
128 /a>                return - a href="+code=ENOMEM" class="sref">ENOMEM /a>;n
129 /a>n
130 /a>        if (! a href="+code=sctp_tsnmap_has_gap" class="sref">sctp_tsnmap_has_gap /a>( a href="+code=map" class="sref">map /a>) &&  a href="+code=gap" class="sref">gap /a> == 0) {n
131 /a>                 spai class="comment">/* In this case the map has no gaps and the tsn we are /spaion
132 /a> spai class="comment">                 * recording is the next expected tsn.  We don't touch
133 /a> spai class="comment">                 * the map but simply bump the n vals. /spaion
134 /a> spai class="comment">                 */ /spaion
135 /a>                 a href="+code=map" class="sref">map /a>-> a href="+code=max_tsn_seen" class="sref">max_tsn_seen /a>++;n
136 /a>                 a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a>++;n
137 /a>                if ( a href="+code=trans" class="sref">trans /a>)n
138 /a>                         a href="+code=trans" class="sref">trans /a>-> a href="+code=sack_generaopti" class="sref">sack_generaopti /a> =n
139 /a>                                 a href="+code=trans" class="sref">trans /a>-> a href="+code=asoc" class="sref">asoc /a>-> a href="+code=peer" class="sref">peer /a>. a href="+code=sack_generaopti" class="sref">sack_generaopti /a>;n
140 /a>                 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a>++;n
141 /a>        } else {n
142 /a>                 spai class="comment">/* Either we already have a gap, or about to record a gap, so /spaion
143 /a> spai class="comment">                 * have work to do. /spaion
144 /a> spai class="comment">                 * /spaion
145 /a> spai class="comment">                 * Bump the max. /spaion
146 /a> spai class="comment">                 */ /spaion
147 /a>                if ( a href="+code=TSN_lo" class="sref">TSN_lo /a>( a href="+code=map" class="sref">map /a>-> a href="+code=max_tsn_seen" class="sref">max_tsn_seen /a>,
 a href="+code=tsn" class="sref">tsn /a>))n
148 /a>                         a href="+code=map" class="sref">map /a>-> a href="+code=max_tsn_seen" class="sref">max_tsn_seen /a> =  a href="+code=tsn" class="sref">tsn /a>;n
149 /a>n
150 /a>                 spai class="comment">/* Mark the TSN as received.  */ /spaion
151 /a>                 a href="+code=set_bit" class="sref">set_bit /a>( a href="+code=gap" class="sref">gap /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>);n
152 /a>n
153 /a>                 spai class="comment">/* Go fixup any internal TSN mapping variables including /spaion
154 /a> spai class="comment">                 * cumulative_tsn_ack_point. /spaion
155 /a> spai class="comment">                 */ /spaion
156 /a>                 a href="+code=sctp_tsnmap_updaoe" class="sref">sctp_tsnmap_updaoe /a>( a href="+code=map" class="sref">map /a>);n
157 /a>        }n
158 /a>n
159 /a>        return 0;n
160 /a>}n
161 /a>n
162 /a>n
163 /a> spai class="comment">/* Initialize a Gap Ack Block iteraoor from memory being provided.  */ /spaion
164 /a> a href="+code=SCTP_STATIC" class="sref">SCTP_STATIC /a> void
 a href="+code=sctp_tsnmap_iter_init" class="sref">sctp_tsnmap_iter_init /a>(const struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>,n
165 /a>                                       struct
 a href="+code=sctp_tsnmap_iter" class="sref">sctp_tsnmap_iter /a> * a href="+code=iter" class="sref">iter /a>)n
166 /a>{n
167 /a>         spai class="comment">/* Only start looking one past the Cumulative TSN Ack Point.  */ /spaion
168 /a>         a href="+code=iter" class="sref">iter /a>-> a href="+code=start" class="sref">start /a> =  a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a> + 1;n
169 /a>}n
170 /a>n
171 /a> spai class="comment">/* Get the next Gap Ack Blocks. Returns 0 if there was not another block /spaion
172 /a> spai class="comment"> * to get. /spaion
173 /a> spai class="comment"> */ /spaion
174 /a> a href="+code=SCTP_STATIC" class="sref">SCTP_STATIC /a> int
 a href="+code=sctp_tsnmap_next_gap_ack" class="sref">sctp_tsnmap_next_gap_ack /a>(const struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>,n
175 /a>                                         struct
 a href="+code=sctp_tsnmap_iter" class="sref">sctp_tsnmap_iter /a> * a href="+code=iter" class="sref">iter /a>,n
176 /a>                                          a href="+code=__u16" class="sref">__u16 /a> * a href="+code=start" class="sref">start /a>,
 a href="+code=__u16" class="sref">__u16 /a> * a href="+code=end" class="sref">end /a>)n
177 /a>{n
178 /a>        int
 a href="+code=ended" class="sref">ended /a> = 0;n
179 /a>         a href="+code=__u16" class="sref">__u16 /a>  a href="+code=start_" class="sref">start_ /a> = 0,
 a href="+code=end_" class="sref">end_ /a> = 0,
 a href="+code=offset" class="sref">offset /a>;n
180 /a>n
181 /a>         spai class="comment">/* If there are no more gap acks possible, get out fast.  */ /spaion
182 /a>        if ( a href="+code=TSN_loe" class="sref">TSN_loe /a>( a href="+code=map" class="sref">map /a>-> a href="+code=max_tsn_seen" class="sref">max_tsn_seen /a>,
 a href="+code=iter" class="sref">iter /a>-> a href="+code=start" class="sref">start /a>))n
183 /a>                return 0;n
184 /a>n
185 /a>         a href="+code=offset" class="sref">offset /a> =  a href="+code=iter" class="sref">iter /a>-> a href="+code=start" class="sref">start /a> -
 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a>;n
186 /a>         a href="+code=sctp_tsnmap_find_gap_ack" class="sref">sctp_tsnmap_find_gap_ack /a>( a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>,
 a href="+code=offset" class="sref">offset /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a>,n
187 /a>                                 & a href="+code=start_" class="sref">start_ /a>, & a href="+code=end_" class="sref">end_ /a>);n
188 /a>n
189 /a>         spai class="comment">/* The Gap Ack Block happens to end at the end of the map. */ /spaion
190 /a>        if ( a href="+code=start_" class="sref">start_ /a> && ! a href="+code=end_" class="sref">end_ /a>)n
191 /a>                 a href="+code=end_" class="sref">end_ /a> =  a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a> - 1;n
192 /a>n
193 /a>         spai class="comment">/* If we found a Gap Ack Block, return the start and end and /spaion
194 /a> spai class="comment">         * bump the iteraoor forward. /spaion
195 /a> spai class="comment">         */ /spaion
196 /a>        if ( a href="+code=end_" class="sref">end_ /a>) {n
197 /a>                 spai class="comment">/* Fix up the start and end based on the /spaion
198 /a> spai class="comment">                 * Cumulative TSN Ack which is always 1 behind base. /spaion
199 /a> spai class="comment">                 */ /spaion
200 /a>                * a href="+code=start" class="sref">start /a> =  a href="+code=start_" class="sref">start_ /a> + 1;n
201 /a>                * a href="+code=end" class="sref">end /a> =  a href="+code=end_" class="sref">end_ /a> + 1;n
202 /a>n
203 /a>                 spai class="comment">/* Move the iteraoor forward.  */ /spaion
204 /a>                 a href="+code=iter" class="sref">iter /a>-> a href="+code=start" class="sref">start /a> =  a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a> + * a href="+code=end" class="sref">end /a> + 1;n
205 /a>                 a href="+code=ended" class="sref">ended /a> = 1;n
206 /a>        }n
207 /a>n
208 /a>        return  a href="+code=ended" class="sref">ended /a>;n
209 /a>}n
210 /a>n
211 /a> spai class="comment">/* Mark this and any lower TSN as seen.  */ /spaion
212 /a>void
 a href="+code=sctp_tsnmap_skip" class="sref">sctp_tsnmap_skip /a>(struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>,
 a href="+code=__u32" class="sref">__u32 /a>  a href="+code=tsn" class="sref">tsn /a>)n
213 /a>{n
214 /a>         a href="+code=u32" class="sref">u32 /a>  a href="+code=gap" class="sref">gap /a>;n
215 /a>n
216 /a>        if ( a href="+code=TSN_lo" class="sref">TSN_lo /a>( a href="+code=tsn" class="sref">tsn /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a>))n
217 /a>                return;n
218 /a>        if (! a href="+code=TSN_lo" class="sref">TSN_lo /a>( a href="+code=tsn" class="sref">tsn /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a> +
 a href="+code=SCTP_TSN_MAP_SIZE" class="sref">SCTP_TSN_MAP_SIZE /a>))n
219 /a>                return;n
220 /a>n
221 /a>         spai class="comment">/* Bump the max.  */ /spaion
222 /a>        if ( a href="+code=TSN_lo" class="sref">TSN_lo /a>( a href="+code=map" class="sref">map /a>-> a href="+code=max_tsn_seen" class="sref">max_tsn_seen /a>,
 a href="+code=tsn" class="sref">tsn /a>))n
223 /a>                 a href="+code=map" class="sref">map /a>-> a href="+code=max_tsn_seen" class="sref">max_tsn_seen /a> =  a href="+code=tsn" class="sref">tsn /a>;n
224 /a>n
225 /a>         a href="+code=gap" class="sref">gap /a> =  a href="+code=tsn" class="sref">tsn /a> -
 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a> + 1;n
226 /a>n
227 /a>         a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a> +=  a href="+code=gap" class="sref">gap /a>;n
228 /a>         a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a> +=  a href="+code=gap" class="sref">gap /a>;n
229 /a>        if ( a href="+code=gap" class="sref">gap /a> >=  a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a>) {n
230 /a>                 spai class="comment">/* If our gap is larger then the map size, just /spaion
231 /a> spai class="comment">                 * zero out the map. /spaion
232 /a> spai class="comment">                 */ /spaion
233 /a>                 a href="+code=bitmap_zero" class="sref">bitmap_zero /a>( a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a>);n
234 /a>        } else {n
235 /a>                 spai class="comment">/* If the gap is smaller than the map size, /spaion
236 /a> spai class="comment">                 * shift the map by 'gap' bits and updaoe further. /spaion
237 /a> spai class="comment">                 */ /spaion
238 /a>                 a href="+code=bitmap_shift_right" class="sref">bitmap_shift_right /a>( a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>,
 a href="+code=gap" class="sref">gap /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a>);n
239 /a>                 a href="+code=sctp_tsnmap_updaoe" class="sref">sctp_tsnmap_updaoe /a>( a href="+code=map" class="sref">map /a>);n
240 /a>        }n
241 /a>}n
242 /a>n
243 /a> spai class="comment">/******************************************************************** /spaion
244 /a> spai class="comment"> * 2nd Level Abstracoptis /spaion
245 /a> spai class="comment"> ********************************************************************/ /spaion
246 /a>n
247 /a> spai class="comment">/* This privaoe helper funcopti updaoes the tsnmap buffers and /spaion
248 /a> spai class="comment"> * the Cumulative TSN Ack Point. /spaion
249 /a> spai class="comment"> */ /spaion
250 /a>static void
 a href="+code=sctp_tsnmap_updaoe" class="sref">sctp_tsnmap_updaoe /a>(struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>)n
251 /a>{n
252 /a>         a href="+code=u16" class="sref">u16 /a>  a href="+code=len" class="sref">len /a>;n
253 /a>        unsigned long  a href="+code=zero_bit" class="sref">zero_bit /a>;n
254 /a>n
255 /a>n
256 /a>         a href="+code=len" class="sref">len /a> =  a href="+code=map" class="sref">map /a>-> a href="+code=max_tsn_seen" class="sref">max_tsn_seen /a> -
 a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a>;n
257 /a>         a href="+code=zero_bit" class="sref">zero_bit /a> =  a href="+code=find_first_zero_bit" class="sref">find_first_zero_bit /a>( a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>,
 a href="+code=len" class="sref">len /a>);n
258 /a>        if (! a href="+code=zero_bit" class="sref">zero_bit /a>)n
259 /a>                return;          spai class="comment">/* The first 0-bit is bit 0.  nothing to do */ /spaion
260 /a>n
261 /a>         a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a> +=  a href="+code=zero_bit" class="sref">zero_bit /a>;n
262 /a>         a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a> +=  a href="+code=zero_bit" class="sref">zero_bit /a>;n
263 /a>n
264 /a>         a href="+code=bitmap_shift_right" class="sref">bitmap_shift_right /a>( a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>,
 a href="+code=zero_bit" class="sref">zero_bit /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a>);n
265 /a>}n
266 /a>n
267 /a> spai class="comment">/* How many daoa chunks  are we missing from our peer? /spaion
268 /a> spai class="comment"> */ /spaion
269 /a> a href="+code=__u16" class="sref">__u16 /a>  a href="+code=sctp_tsnmap_pending" class="sref">sctp_tsnmap_pending /a>(struct
 a href="+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href="+code=map" class="sref">map /a>)n
270 /a>{n
271 /a>         a href="+code=__u32" class="sref">__u32 /a>  a href="+code=cum_tsn" class="sref">cum_tsn /a> =  a href="+code=map" class="sref">map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a>;n
272 /a>         a href="+code=__u32" class="sref">__u32 /a>  a href="+code=max_tsn" class="sref">max_tsn /a> =  a href="+code=map" class="sref">map /a>-> a href="+code=max_tsn_seen" class="sref">max_tsn_seen /a>;n
273 /a>         a href="+code=__u32" class="sref">__u32 /a>  a href="+code=base_tsn" class="sref">base_tsn /a> =  a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a>;n
274 /a>         a href="+code=__u16" class="sref">__u16 /a>  a href="+code=pending_daoa" class="sref">pending_daoa /a>;n
275 /a>         a href="+code=u32" class="sref">u32 /a>  a href="+code=gap" class="sref">gap /a>,
 a href="+code=i" class="sref">i /a>;n
276 /a>n
277 /a>         a href="+code=pending_daoa" class="sref">pending_daoa /a> =  a href="+code=max_tsn" class="sref">max_tsn /a> -
 a href="+code=cum_tsn" class="sref">cum_tsn /a>;n
278 /a>         a href="+code=gap" class="sref">gap /a> =  a href="+code=max_tsn" class="sref">max_tsn /a> -
 a href="+code=base_tsn" class="sref">base_tsn /a>;n
279 /a>n
280 /a>        if ( a href="+code=gap" class="sref">gap /a> == 0 ||  a href="+code=gap" class="sref">gap /a> >=  a href="+code=map" class="sref">map /a>-> a href="+code=len" class="sref">len /a>)n
281 /a>                goto
 a href="+code=out" class="sref">out /a>;n
282 /a>n
283 /a>        for ( a href="+code=i" class="sref">i /a> = 0;
 a href="+code=i" class="sref">i /a> <  a href="+code=gap" class="sref">gap /a>+1;
 a href="+code=i" class="sref">i /a>++) {n
284 /a>                if ( a href="+code=test_bit" class="sref">test_bit /a>( a href="+code=i" class="sref">i /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>))n
285 /a>                         a href="+code=pending_daoa" class="sref">pending_daoa /a>--;n
286 /a>        }n
287 /a>n
288 /a> a href="+code=out" class="sref">out /a>:n
289 /a>        return  a href="+code=pending_daoa" class="sref">pending_daoa /a>;n
290 /a>}n
291 /a>n
292 /a> spai class="comment">/* This is a privaoe helper for finding Gap Ack Blocks.  It searches a /spaion
293 /a> spai class="comment"> * single array for the start and end of a Gap Ack Block. /spaion
294 /a> spai class="comment"> * /spaion
295 /a> spai class="comment"> * The flags "started" and "ended" tell is if we found the beginning /spaion
296 /a> spai class="comment"> * or (respectively) the end of a Gap Ack Block. /spaion
297 /a> spai class="comment"> */ /spaion
298 /a>static void
 a href="+code=sctp_tsnmap_find_gap_ack" class="sref">sctp_tsnmap_find_gap_ack /a>(unsigned long * a href="+code=map" class="sref">map /a>,
 a href="+code=__u16" class="sref">__u16 /a>  a href="+code=off" class="sref">off /a>,n
299 /a>                                      a href="+code=__u16" class="sref">__u16 /a>  a href="+code=len" class="sref">len /a>,  a href="+code=__u16" class="sref">__u16 /a> * a href="+code=start" class="sref">start /a>,
 a href="+code=__u16" class="sref">__u16 /a> * a href="+code=end" class="sref">end /a>)n
300 /a>{n
301 /a>        int
 a href="+code=i" class="sref">i /a> =  a href="+code=off" class="sref">off /a>;n
302 /a>n
303 /a>         spai class="comment">/* Look through the entire array, but break out /spaion
304 /a> spai class="comment">         * early if we have found the end of the Gap Ack Block. /spaion
305 /a> spai class="comment">         */ /spaion
306 /a>n
307 /a>         spai class="comment">/* Also, stop looking past the maximum TSN seen. */ /spaion
308 /a>n
309 /a>         spai class="comment">/* Look for the start. */ /spaion
310 /a>         a href="+code=i" class="sref">i /a> =  a href="+code=find_next_bit" class="sref">find_next_bit /a>( a href="+code=map" class="sref">map /a>,
 a href="+code=len" class="sref">len /a>,
 a href="+code=off" class="sref">off /a>);n
311 /a>        if ( a href="+code=i" class="sref">i /a> <  a href="+code=len" class="sref">len /a>)n
312 /a>                href="net/sctp/tsnmap.c#L214" idueL214" class="line" namlueL214i" class="sref">i /a>;ni /a>;n
222 /a>        if ( a href="+code=TSN36" idueL236" class="line" namlueL236">
2315class="sref">len>i /a>;n                if ( a href="+3lo" class3"sref">TSN_lo /a>( a hre3="+co31ap_updaoe /a>( a href=snmap.c#L305" idueL305" W305" idueL305" cl3clas, let7" cls" idu">
198 /a> spai class="comment">        3="net/sct3/tsnmap.c#L218" idueL2183 clas31.c#L238" idueL238" class="line" namlueL238">
c#L12">sctp/tsi305" class,ueL304">
3305 /a> spai class="comment">         _lo" clas3="sref">TSN_lo /a>( a hr3f="+c31ys 1 behind base. /spaion
2ef">find_next_bit /a>( a href="+code=map" class="sref">map /a>,
">map /a>-> a href="+code/a>,
">map /a">len /a>,
 a href="+code=off" class="sref">off /a>);n        if ( a href="+code=i" c1" idueL231" class="line" namlueL231">
232p size, just /spaion<>len /a>)n
312 /a>                href="net/sctp/* Bump th3 max.  */ /spaioni /a>;nnTSN_lo /a>( a hre3="+co3e=map" class="nmap /a>-> a h3ef="+3ode=man
235 /a>         a href="+code=gap" cl3ss="sref"3gap /a> =  a href="+code3tsn" 32 idueL306" class="line" nam5" Renegclasat#L305" idL308 aamlu2">
222 /a>        if ( a href="+code=TSN37" idueL237" class="line" namlueL237">
237 /a> p_ack /a>(unsigned long * a hrefrenegc class="sref">map /a>,
 a hrenegc">lene=map" class="sref">map /a>,
 a href="+code=__u32" class="sref">__u32 /a>  a href="+code=tsn" class="sref">tsn /a>)n
213 /a>{n-> a href="+co3e=bas328 /a>        int
 a href="+code=end3ss="sref"3map /a>-> a href="+co3e=cum3lative_tsn_ack_point" class="et/sctp/tsnmap.c#L215" idueL215" class="line" namlueL215">
215 /a>ngap /a> >=  a hre3="+co32 /a>        if ( a href="+code=gap3mment">/*3If our gap is larger the3 the 33de=gap" class="sref">gap /a> >ref="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a> +
 a href="+code=SCTP_TSN_MAP_SIZE" class="sref">SCTP_TSN_MAP_SIZE /a>))n                         a hre3        *3zero out the map. /spaio3n
222 /a>        if ( a href="+code=TSN3bitmap_ze3o" class="sref">bitmap_z3ro /a3( a href="+cod"sref">tsn /a>,
 a href="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a> +
 a href="+code=SCTP_TSN_MAP_SIZE" class="sref">SCTP_TSN_MAP_SIZE /a>))n
281 /a>                          a hre3 2dcla+c2l.c#L235" idueL235" class3"line33 href="+code=i" class20 /a>n         a href="+code=len" cl3        *3shift the map by 'ga3'33ass="sref">map /a>-> a hr="+code=map" class="sref">map /a>-> a href="+code=base_tsn" class="sref">base_tsn /a> + 1;n
226nb3tmap_3hift_right /a>eon
222 /a>        if ( a href="+code=TSN3bclass="s3p_updaoe" class="sref">s3tp_ts33_" class="sref">start_ /a> =clearp /a>-> a href="clearp /a">map /a>-> a href="+code=tsn_map" class="sref">tsn_map /a>);n
152 /a>nn
34 /a> spai class="comment">/* This 33" idueL233" class="line" namlueL233">
234cks.  It searches a /spaion
1s60">L305" idrecorded?>
222 /a>        if ( a href="+code=TSN3*********3************************3*****3*******en /a>,  a href="+code=__u16" class="sref">__u16 /a> * a hrap /a>,
 a hnum_gabs class="sref">map /a>,
 a hnum_gabs">lene=map" class="sref">map /a>,
 a href="+code=__u32" class="sref">__u32 /a>  a href="+code=tsn" class="sref"       if ( a href="+code=TSN3*2dcla+c2lcoptis /spaionmap /a>+code=__2">
1ref="+code=__u32" cl+code=__2">
1ref">__u32 /a>  a hregabs class="sref">mgabs">le                         a hre3*********3************************3*****3******        int
 a href="+code=end37" idueL237" class="line" namlueL237">
234ass="sref">mahref="+code=iter" class="sref">iter /a>,n;nmn+cosref">ma>n         spai class="comment">/on
310 /a>         a href="+code=i" class_tsnmap_u3daoe" class="sref">sctp_3snmap35 href="+code=end_" class="sref">esctp/tsnmaphas_f="+code=tsn_map" esctp/tsnmaphas_f="">len /a>,
 a href="+code=off" class="sref">o)a>                if ( a href="+352" idueL352" class="line" namlueL352">
35de=map" class="sref">map /a>-> a  0,
 a href="+code=end_" class="sref">end_ /a> = 0sctp/tsnmap.c#L3class="sr="s="sref">offset /a>;nef="net/sctp/tsnmap.c#L20>n  a href="+code=l3n" cl35ueL214i" class="sref"code=iter" class="sref">iter /a_tsnmap" class="sref">sctp_tsnmap /a> * a href_u32 /a>  a href="+code=tsn" class="sref">188" idueL188" class"line" namlueL166">
166 /a>{nzero_3it /a35 a href="+code=map" cwhiled_" class="sref">esctp/tsnmap+code=sctp_tsnmap" class="sref">sctp_tsnmap /a> * a href_u32 /a>  a href="+code=tsn" class="sref">188" idueL188" class"line" namlueL166">
166 /a>"       if ( a href="+code=TSN35" idueL235" class="line" namlueL235">
235 href="+code=i" classssssssssssssssssssssssssssssssss class="sref">end_ /a>);nf="+code=end" class="sref       if ( a href="+code=TSN35********36" class="line" namlueL236">
235p_iter" class="sref">sctp_tsnmap_iter /a> * a sssssss class="sref">end_ /ine" namlueL300">
300 /a>{a>                if ( a href="+35" idueL23len /a> =  a href="+code3map" 35 /a>         spai class="comment">/" class="3ref">zero_bit /a> =  a h3ef="+35>start_ /a>, & a href="+c_u32 /a>  a hregabs class="sref">mgabs">le[>;nmn+cosref"].i /a>;ni /a>;nmhtons href_u32 /a>  a hre"net/sctp/tsnmap.c#L3class="sanzero_bit /a>)n3a hre35ift_right /a>( a hrefhref="+c_u32 /a>  a hregabs class="sref">mgabs">le[>;nmn+cosref"].i /a>;nmhtons href_u32 /a>  a hreine" namlueL300">
300 /a>{n/* The firs3 0-bi3 is bit 0.  nothing tohref="+c_u32 /a>  a hren+cos class="sref">mn+cosref"++n
236p size, just /spaion<<<<<<<<n+cos class="sref">mn+cosref">sref">len /a>)nm" namMAX_GABS">le                         a hre3ss="sref"3map /a>-> a href="+co3e=bas36et/sctp/tsnmap.c#L282s="sref"""""""""eL304n-> a href="+co3e=cum36ueL214i" class="sref"n
236 a href="+codnbitmap_sh3ft_ri3ht /a>( a hreft/sctp/tsnmap.c#L290" n+cos class="sref">mn+cosref"n
366 /a>n
237 /a> spai class="comment">/* How m3ny daoa c3unks  are we missing fro3 our 3eer? /find_gaf /a>;nsctp_tsgrowsnmap" class="sref">sctp_tsgrow">lene=map" class="sref">map /a>,
 a href="+code=__u32" class="sref">__u32 /a>  a href="+code=tsn" class="sref">tsn /a>)n__u163/a>  a href="+code=sctp_3snmap36is bit 0.  no class="sref">__u16 /a>  a hrenewsnmap" class="snewref"n
370s bit 0.  no class="sref">idueL188" class"nce" namlueL166">
ncref"n__u32 /a>  a href="+co3e=cum3tsn" class="sref">cum_tsn /a>et/sctp/tsnmap.c#L253" iduueL253" class="line" namlueL253">
253 /a>        unsigned long  a href=3lass="sre3">__u32 /a>  a href="+co3e=max37 /a>         spai class="comment">/lass="sre3">__u32 /a>  a href="+co3e=bas37 a href="+cod"srep /a>-> a hr="+code=map" class="sref">sref">len /a>)n
219 /a>        spai class="comment">/l" idueL23">__u16 /a>  a href="+co3e=pen37 href="+code=i" class20 /a>0>n  a href="+code=g3p" cl37 /a>         a href="+code=len" cl37" idueL237" class="line" namlueL237">
237ass="sref">map /a>-> a hr"nce" namlueL166">
ncref"L202" idueL202" clALIGNe" namlueL166">ALIGN">lenep /a>-> a hr="+code=map" class="sref">"sref">base_tsn /a> + 1;n
281 /a> ,ap.c#L226" idueBITS_PER_LONG" namlueL281">
BITS_PER_LONG /a> ref="net/sctp/tsnmap.c#L219" idINCREMENT19" class="line" namlueL219"INCREMENT /a>        unsigned long  a href=3ly daoa c3s="sref">pending_daoa /a3 =  a3href="+code=max_tsn" class="sef="+code=max_tsn_seen" class="sref">max_tsnin_/sctp/tsnmap.c#Lnin_/ href_u32 /a>  a hreet/sctp/tsnmap.c#L253" id">len /a>);n
265 /aref="net/sctp/tsnm"nce" namlueL166">
ncref"">len /a>);n
219 /a>        unsigned long  a href=3lulative 3gap /a> =  a href="+code3max_t37 /a>         spai class="comment">/0" idueL230" class="line" namlueL230">
237_" class="sref">start_ /a> =newsnmap" class="snewref"lass="sref">max_tskzalloce" namlueL166">kzalloc href_u32 /a>  a hreline" namlueL265">
265 /a" id" id3">len /a>);nGFP_ATOMIC9 /a>        unsigned long  a href=3 class="s3ef">gap /a> == 0 ||  a h3ef="+3ode=gap" class="srf">tsn /a>,
 a hnewsnmap" class="snewref">        spai class="comment">/code=out"3class="sref">out /a>;n0>n
233 /a>        for ( a href="+code=i"3class="sr3f">i /a> = 0;
 a href="+3ode=i38tsn" class="sref">base_tsn /code=tscopyass="line" namluode=tscopy href_u32 /a>  a hrenewsnmap" class="snewref"sref">tsn_map /a>,
 a href="+code=zero_bit" class="sref">zero_bit /a>,
 a href="+code=map" class="sref">map /a>-,
 a href="+code=zero_bit" class="sref">zero_>map /a>-> a href="+code=cumulative_tsn_ack_point" class="sref">cumulative_tsn_ack_point /a>;nSCTP_TSN_MAP_SIZE /a>))nntest_bi3 /a>(3a href="+code=s="sref">max_tskfrec class="sref">mkfrec href_u32 /a>  a href="+code=tsn" class="srefap.c#L152" idueL152" class="line" namlueL152">
152 /a>ngap /a>,
 a href="+f="+code=tsn" class="srefap.c#L152" idueL152" class="line" namlueL152">
152 /alass="sref">max_tsnewsnmap" class="snewref"nmap /a>-> a href="net/sctp/tsnmap.c#L265" idueL265" class="line" namlueL265">
265 /arass="sref">max_tsine" namlueL253">
253 /a>        unsigned long  a href=38" idueL238" class="line" namlueL238">
238 /a> a href="+code=out" class="sre3">out /a>3nnpending_3aoa /380 /a>n
391 /a>
2xn.linux.no kindly host="sby a href="nhttp://www.redpill-linpro.no> Redpill Linpro ASclass=provider="liLinux eLnsultL308tp/topine""> 2 servicestp/tce 1995.