linux/net/sched/sch_sfb.c
<<
" /spatio /formio a " href="../linux+v33.67/net/sched/sch_sfb.c">" img src="../.static/gfx/right.png" alt=">>">" /spatio" spat class="lxr_search">" " input typaluhidden" namalunavtarget" on valu">" input typalutext" namalusearch" idlusearch">" buttptitypalusubmit">Search" Prefso /a>" /spatio /divio form ac/opt="ajax+*" method="post" onsubmit="return false;">" input typaluhidden" namaluajax_lookup" idluajax_lookup" on valu">" /formio" div class="headingbottpm">o div idlufile_contents"i
   1
/a>
spat class="comment">/*
/spatio   2
/a>
spat class="comment"> * net/sched/sch_sfb.c    Stochastic Fair B va
/spatio   3
/a>
spat class="comment"> *
/spatio   4
/a>
spat class="comment"> * Copyright (c) 2008-2011 Juliusz Chroboczek <jch@pps.jussieu.fr>
/spatio   5
/a>
spat class="comment"> * Copyright (c) 2011 Eric Dumazet <eric.dumazet@gmail.com>
/spatio   6
/a>
spat class="comment"> *
/spatio   7
/a>
spat class="comment"> * This program is free software; you cat redistribute it and/or
/spatio   8
/a>
spat class="comment"> * modify it under the terms of the GNU General Public Licensa
/spatio   9
/a>
spat class="comment"> * versopti2 as published by the Free Software Founda/opt.
/spatio  8.9
spat class="comment"> *
/spatio  11
/a>
spat class="comment"> * W. Feng, D. Kandlur, D. Saha, K. Shin. B va:
/spatio  12
/a>
spat class="comment"> * A New Class of Ac/ove Queue Management Algorithms.
/spatio  13
/a>
spat class="comment"> * U. Michigat CSE-TR-387-99, April 1999.
/spatio  14
/a>
spat class="comment"> *
/spatio  15
/a>
spat class="comment"> * http://www.thefengs.com/wuchang/b va/CSE-TR-387-99.pdf
/spatio  16
/a>
spat class="comment"> *
/spatio  17
/a>
spat class="comment"> */
/spatio  18
/a>o  19
/a>#include <linux/module.h
/a>>o  20
/a>#include <linux/typas.h
/a>>o  21
/a>#include <linux/kernel.h
/a>>o  22
/a>#include <linux/errno.h
/a>>o  23
/a>#include <linux/skbuff.h
/a>>o  24
/a>#include <linux/random.h
/a>>o  25
/a>#include <linux/jhash.h
/a>>o  26
/a>#include <net/ip.h
/a>>o  27
/a>#include <net/pkt_sched.h
/a>>o  28
/a>#include <net/inet_ecn.h
/a>>o  29
/a>#include <net/flow_keys.h
/a>>o  30
/a>o  31
/a>
spat class="comment">/*
/spatio  32
/a>
spat class="comment"> * SFB uses two B[l][n] : L x N arrays of bins (L levels, N bins per level)
/spatio  33
/a>
spat class="comment"> * This implementa/opt uses L = 8 and N = 16
/spatio  34
/a>
spat class="comment"> * This permits us to split one 32bit hash (provided per packet by rxhash or
/spatio  35
/a>
spat class="comment"> * external classifier) into 8 subhashes of 4 bits.
/spatio  36
/a>
spat class="comment"> */
/spatio  37
/a>#define 
a href="+code=SFB_BUCKET_SHIFT" class="sref">SFB_BUCKET_SHIFT
/a> 4o  38
/a>#define 
a href="+code=SFB_NUMBUCKETS" class="sref">SFB_NUMBUCKETS
/a>  (1 << 
a href="+code=SFB_BUCKET_SHIFT" class="sref">SFB_BUCKET_SHIFT
/a>) 
spat class="comment">/* N bins per Level */
/spatio  39
/a>#define 
a href="+code=SFB_BUCKET_MASK" class="sref">SFB_BUCKET_MASK
/a> (
a href="+code=SFB_NUMBUCKETS" class="sref">SFB_NUMBUCKETS
/a> - 1)o  40
/a>#define 
a href="+code=SFB_LEVELS" class="sref">SFB_LEVELS
/a>      (32 / 
a href="+code=SFB_BUCKET_SHIFT" class="sref">SFB_BUCKET_SHIFT
/a>) 
spat class="comment">/* L */
/spatio  41
/a>o  42
/a>
spat class="comment">/* SFB algo uses a virtual queue, namad "bin" */
/spatio  43
/a>struct 
a href="+code=sfb_bucket" class="sref">sfb_bucket
/a> {o  44
/a>        
a href="+code=u16" class="sref">u16
/a>             
a href="+code=qlen" class="sref">qlen
/a>; 
spat class="comment">/* length of virtual queue */
/spatio  45
/a>        
a href="+code=u16" class="sref">u16
/a>             
a href="+code=p_mark" class="sref">p_mark
/a>; 
spat class="comment">/* marking probability */
/spatio  46
/a>};o  47
/a>o  48
/a>
spat class="comment">/* We use a double buffering right before hash changa
/spatio  49
/a>
spat class="comment"> * (Sec/opt 4.4 of SFB reference : moving hash func/opts)
/spatio  5.9
spat class="comment"> */
/spatio  51
/a>struct 
a href="+code=sfb_bins" class="sref">sfb_bins
/a> {o  52
/a>        
a href="+code=u32" class="sref">u32
/a>               
a href="+code=perturba/opt" class="sref">perturba/opt
/a>; 
spat class="comment">/* jhash perturba/opt */
/spatio  53
/a>        struct 
a href="+code=sfb_bucket" class="sref">sfb_bucket
/a> 
a href="+code=bins" class="sref">bins
/a>[
a href="+code=SFB_LEVELS" class="sref">SFB_LEVELS
/a>][
a href="+code=SFB_NUMBUCKETS" class="sref">SFB_NUMBUCKETS
/a>];o  54
/a>};o  55
/a>o  56
/a>struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> {o  57
/a>        struct 
a href="+code=Qdisc" class="sref">Qdisc
/a>    *
a href="+code=qdisc" class="sref">qdisc
/a>;o  58
/a>        struct 
a href="+code=tcf_proto" class="sref">tcf_proto
/a> *
a href="+code=filter_list" class="sref">filter_list
/a>;o  59
/a>        unsignad long   
a href="+code=rehash_interval" class="sref">rehash_interval
/a>;o  60
/a>        unsignad long   
a href="+code=warmup_time" class="sref">warmup_time
/a>;    
spat class="comment">/* double buffering warmup time in jiffies */
/spatio  61
/a>        
a href="+code=u32" class="sref">u32
/a>             
a href="+code=max" class="sref">max
/a>;o  62
/a>        
a href="+code=u32" class="sref">u32
/a>             
a href="+code=bin_size" class="sref">bin_size
/a>;       
spat class="comment">/* maximum queue length per bin */
/spatio  63
/a>        
a href="+code=u32" class="sref">u32
/a>             
a href="+code=increment" class="sref">increment
/a>;      
spat class="comment">/* d1 */
/spatio  64
/a>        
a href="+code=u32" class="sref">u32
/a>             
a href="+code=decrement" class="sref">decrement
/a>;      
spat class="comment">/* d2 */
/spatio  65
/a>        
a href="+code=u32" class="sref">u32
/a>             
a href="+code=limit" class="sref">limit
/a>;          
spat class="comment">/* HARD maximal queue length */
/spatio  66
/a>        
a href="+code=u32" class="sref">u32
/a>             
a href="+code=penalty_rate" class="sref">penalty_rate
/a>;o  67
/a>        
a href="+code=u32" class="sref">u32
/a>             
a href="+code=penalty_burst" class="sref">penalty_burst
/a>;o  68
/a>        
a href="+code=u32" class="sref">u32
/a>             
a href="+code=tokens_avail" class="sref">tokens_avail
/a>;o  69
/a>        unsignad long   
a href="+code=rehash_time" class="sref">rehash_time
/a>;o  70
/a>        unsignad long   
a href="+code=token_time" class="sref">token_time
/a>;o  71
/a>o  72
/a>        
a href="+code=u8" class="sref">u8
/a>              
a href="+code=slot" class="sref">slot
/a>;           
spat class="comment">/* current ac/ove bins (0 or 1) */
/spatio  73
/a>        
a href="+code=bool" class="sref">bool
/a>            
a href="+code=double_buffering" class="sref">double_buffering
/a>;o  74
/a>        struct 
a href="+code=sfb_bins" class="sref">sfb_bins
/a> 
a href="+code=bins" class="sref">bins
/a>[2];o  75
/a>o  76
/a>        struct {o  77
/a>                
a href="+code=u32" class="sref">u32
/a>     
a href="+code=earlydrop" class="sref">earlydrop
/a>;o  78
/a>                
a href="+code=u32" class="sref">u32
/a>     
a href="+code=penaltydrop" class="sref">penaltydrop
/a>;o  79
/a>                
a href="+code=u32" class="sref">u32
/a>     
a href="+code=bucketdrop" class="sref">bucketdrop
/a>;o  80
/a>                
a href="+code=u32" class="sref">u32
/a>     
a href="+code=queuedrop" class="sref">queuedrop
/a>;o  81
/a>                
a href="+code=u32" class="sref">u32
/a>     
a href="+code=childdrop" class="sref">childdrop
/a>;      
spat class="comment">/* drops in child qdisc */
/spatio  82
/a>                
a href="+code=u32" class="sref">u32
/a>     
a href="+code=marked" class="sref">marked
/a>;         
spat class="comment">/* ECN mark */
/spatio  83
/a>        } 
a href="+code=stats" class="sref">stats
/a>;o  84
/a>};o  85
/a>o  86
/a>
spat class="comment">/*
/spatio  87
/a>
spat class="comment"> * Each queued skb might be hashed on one or two bins
/spatio  88
/a>
spat class="comment"> * We store in skb_cb the two hash on vas.
/spatio  89
/a>
spat class="comment"> * (A zero on va means double buffering was not used)
/spatio  9.9
spat class="comment"> */
/spatio  91
/a>struct 
a href="+code=sfb_skb_cb" class="sref">sfb_skb_cb
/a> {o  92
/a>        
a href="+code=u32" class="sref">u32
/a> 
a href="+code=hashes" class="sref">hashes
/a>[2];o  93
/a>};o  94
/a>o  95
/a>static 
a href="+code=inline" class="sref">inline
/a> struct 
a href="+code=sfb_skb_cb" class="sref">sfb_skb_cb
/a> *
a href="+code=sfb_skb_cb" class="sref">sfb_skb_cb
/a>(const struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>)o  96
/a>{o  97
/a>        
a href="+code=qdisc_cb_private_on idate" class="sref">qdisc_cb_private_on idate
/a>(
a href="+code=skb" class="sref">skb
/a>, sizeof(struct 
a href="+code=sfb_skb_cb" class="sref">sfb_skb_cb
/a>));o  98
/a>        return (struct 
a href="+code=sfb_skb_cb" class="sref">sfb_skb_cb
/a> *)
a href="+code=qdisc_skb_cb" class="sref">qdisc_skb_cb
/a>(
a href="+code=skb" class="sref">skb
/a>)->
a href="+code=data" class="sref">data
/a>;o  99
/a>}o 100
/a>o 101
/a>
spat class="comment">/*
/spatio 102
/a>
spat class="comment"> * If using 'internal' SFB flow classifier, hash comes from skb rxhash
/spatio 103
/a>
spat class="comment"> * If using external classifier, hash comes from the classid.
/spatio 104
/a>
spat class="comment"> */
/spatio 105
/a>static 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=sfb_hash" class="sref">sfb_hash
/a>(const struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=slot" class="sref">slot
/a>)o 106
/a>{o 107
/a>        return 
a href="+code=sfb_skb_cb" class="sref">sfb_skb_cb
/a>(
a href="+code=skb" class="sref">skb
/a>)->
a href="+code=hashes" class="sref">hashes
/a>[
a href="+code=slot" class="sref">slot
/a>];o 108
/a>}o 109
/a>o 18.9
spat class="comment">/* Probabilities are coded as Q v3. fixed-point on vas,
/spatio 111
/a>
spat class="comment"> * with 0xFFFF representing 65535/65536 (almost 1.0)
/spatio 112
/a>
spat class="comment"> * Addi/opt and subtrac/opt are saturating in [0, 65535]
/spatio 113
/a>
spat class="comment"> */
/spatio 114
/a>static 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=prob_plus" class="sref">prob_plus
/a>(
a href="+code=u32" class="sref">u32
/a> 
a href="+code=p1" class="sref">p1
/a>, 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=p2" class="sref">p2
/a>)o 115
/a>{o 116
/a>        
a href="+code=u32" class="sref">u32
/a> 
a href="+code=res" class="sref">res
/a> = 
a href="+code=p1" class="sref">p1
/a> + 
a href="+code=p2" class="sref">p2
/a>;o 117
/a>o 118
/a>        return 
a href="+code=min_t" class="sref">min_t
/a>(
a href="+code=u32" class="sref">u32
/a>, 
a href="+code=res" class="sref">res
/a>, 
a href="+code=SFB_MAX_PROB" class="sref">SFB_MAX_PROB
/a>);o 119
/a>}o 120
/a>o 121
/a>static 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=prob_minus" class="sref">prob_minus
/a>(
a href="+code=u32" class="sref">u32
/a> 
a href="+code=p1" class="sref">p1
/a>, 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=p2" class="sref">p2
/a>)o 122
/a>{o 123
/a>        return 
a href="+code=p1" class="sref">p1
/a> > 
a href="+code=p2" class="sref">p2
/a> ? 
a href="+code=p1" class="sref">p1
/a> - 
a href="+code=p2" class="sref">p2
/a> : 0;o 124
/a>}o 125
/a>o 126
/a>static void 
a href="+code=increment_one_qlen" class="sref">increment_one_qlen
/a>(
a href="+code=u32" class="sref">u32
/a> 
a href="+code=sfbhash" class="sref">sfbhash
/a>, 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=slot" class="sref">slot
/a>, struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 127
/a>{o 128
/a>        int 
a href="+code=i" class="sref">i
/a>;o 129
/a>        struct 
a href="+code=sfb_bucket" class="sref">sfb_bucket
/a> *
a href="+code=b" class="sref">b
/a> = &
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>[
a href="+code=slot" class="sref">slot
/a>].
a href="+code=bins" class="sref">bins
/a>[0][0];o 130
/a>o 131
/a>        for (
a href="+code=i" class="sref">i
/a> = 0; 
a href="+code=i" class="sref">i
/a> < 
a href="+code=SFB_LEVELS" class="sref">SFB_LEVELS
/a>; 
a href="+code=i" class="sref">i
/a>++) {o 132
/a>                
a href="+code=u32" class="sref">u32
/a> 
a href="+code=hash" class="sref">hash
/a> = 
a href="+code=sfbhash" class="sref">sfbhash
/a> & 
a href="+code=SFB_BUCKET_MASK" class="sref">SFB_BUCKET_MASK
/a>;o 133
/a>o 134
/a>                
a href="+code=sfbhash" class="sref">sfbhash
/a> >>= 
a href="+code=SFB_BUCKET_SHIFT" class="sref">SFB_BUCKET_SHIFT
/a>;o 135
/a>                if (
a href="+code=b" class="sref">b
/a>[
a href="+code=hash" class="sref">hash
/a>].
a href="+code=qlen" class="sref">qlen
/a> < 0xFFFF)o 136
/a>                        
a href="+code=b" class="sref">b
/a>[
a href="+code=hash" class="sref">hash
/a>].
a href="+code=qlen" class="sref">qlen
/a>++;o 137
/a>                
a href="+code=b" class="sref">b
/a> += 
a href="+code=SFB_NUMBUCKETS" class="sref">SFB_NUMBUCKETS
/a>; 
spat class="comment">/* next level */
/spatio 138
/a>        }o 139
/a>}o 140
/a>o 141
/a>static void 
a href="+code=increment_qlen" class="sref">increment_qlen
/a>(const struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>, struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 142
/a>{o 143
/a>        
a href="+code=u32" class="sref">u32
/a> 
a href="+code=sfbhash" class="sref">sfbhash
/a>;o 144
/a>o 145
/a>        
a href="+code=sfbhash" class="sref">sfbhash
/a> = 
a href="+code=sfb_hash" class="sref">sfb_hash
/a>(
a href="+code=skb" class="sref">skb
/a>, 0);o 146
/a>        if (
a href="+code=sfbhash" class="sref">sfbhash
/a>)o 147
/a>                
a href="+code=increment_one_qlen" class="sref">increment_one_qlen
/a>(
a href="+code=sfbhash" class="sref">sfbhash
/a>, 0, 
a href="+code=q" class="sref">q
/a>);o 148
/a>o 149
/a>        
a href="+code=sfbhash" class="sref">sfbhash
/a> = 
a href="+code=sfb_hash" class="sref">sfb_hash
/a>(
a href="+code=skb" class="sref">skb
/a>, 1);o 150
/a>        if (
a href="+code=sfbhash" class="sref">sfbhash
/a>)o 151
/a>                
a href="+code=increment_one_qlen" class="sref">increment_one_qlen
/a>(
a href="+code=sfbhash" class="sref">sfbhash
/a>, 1, 
a href="+code=q" class="sref">q
/a>);o 152
/a>}o 153
/a>o 154
/a>static void 
a href="+code=decrement_one_qlen" class="sref">decrement_one_qlen
/a>(
a href="+code=u32" class="sref">u32
/a> 
a href="+code=sfbhash" class="sref">sfbhash
/a>, 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=slot" class="sref">slot
/a>,o 155
/a>                               struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 156
/a>{o 157
/a>        int 
a href="+code=i" class="sref">i
/a>;o 158
/a>        struct 
a href="+code=sfb_bucket" class="sref">sfb_bucket
/a> *
a href="+code=b" class="sref">b
/a> = &
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>[
a href="+code=slot" class="sref">slot
/a>].
a href="+code=bins" class="sref">bins
/a>[0][0];o 159
/a>o 160
/a>        for (
a href="+code=i" class="sref">i
/a> = 0; 
a href="+code=i" class="sref">i
/a> < 
a href="+code=SFB_LEVELS" class="sref">SFB_LEVELS
/a>; 
a href="+code=i" class="sref">i
/a>++) {o 161
/a>                
a href="+code=u32" class="sref">u32
/a> 
a href="+code=hash" class="sref">hash
/a> = 
a href="+code=sfbhash" class="sref">sfbhash
/a> & 
a href="+code=SFB_BUCKET_MASK" class="sref">SFB_BUCKET_MASK
/a>;o 162
/a>o 163
/a>                
a href="+code=sfbhash" class="sref">sfbhash
/a> >>= 
a href="+code=SFB_BUCKET_SHIFT" class="sref">SFB_BUCKET_SHIFT
/a>;o 164
/a>                if (
a href="+code=b" class="sref">b
/a>[
a href="+code=hash" class="sref">hash
/a>].
a href="+code=qlen" class="sref">qlen
/a> > 0)o 165
/a>                        
a href="+code=b" class="sref">b
/a>[
a href="+code=hash" class="sref">hash
/a>].
a href="+code=qlen" class="sref">qlen
/a>--;o 166
/a>                
a href="+code=b" class="sref">b
/a> += 
a href="+code=SFB_NUMBUCKETS" class="sref">SFB_NUMBUCKETS
/a>; 
spat class="comment">/* next level */
/spatio 167
/a>        }o 168
/a>}o 169
/a>o 170
/a>static void 
a href="+code=decrement_qlen" class="sref">decrement_qlen
/a>(const struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>, struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 171
/a>{o 172
/a>        
a href="+code=u32" class="sref">u32
/a> 
a href="+code=sfbhash" class="sref">sfbhash
/a>;o 173
/a>o 174
/a>        
a href="+code=sfbhash" class="sref">sfbhash
/a> = 
a href="+code=sfb_hash" class="sref">sfb_hash
/a>(
a href="+code=skb" class="sref">skb
/a>, 0);o 175
/a>        if (
a href="+code=sfbhash" class="sref">sfbhash
/a>)o 176
/a>                
a href="+code=decrement_one_qlen" class="sref">decrement_one_qlen
/a>(
a href="+code=sfbhash" class="sref">sfbhash
/a>, 0, 
a href="+code=q" class="sref">q
/a>);o 177
/a>o 178
/a>        
a href="+code=sfbhash" class="sref">sfbhash
/a> = 
a href="+code=sfb_hash" class="sref">sfb_hash
/a>(
a href="+code=skb" class="sref">skb
/a>, 1);o 179
/a>        if (
a href="+code=sfbhash" class="sref">sfbhash
/a>)o 180
/a>                
a href="+code=decrement_one_qlen" class="sref">decrement_one_qlen
/a>(
a href="+code=sfbhash" class="sref">sfbhash
/a>, 1, 
a href="+code=q" class="sref">q
/a>);o 181
/a>}o 182
/a>o 183
/a>static void 
a href="+code=decrement_prob" class="sref">decrement_prob
/a>(struct 
a href="+code=sfb_bucket" class="sref">sfb_bucket
/a> *
a href="+code=b" class="sref">b
/a>, struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 184
/a>{o 185
/a>        
a href="+code=b" class="sref">b
/a>->
a href="+code=p_mark" class="sref">p_mark
/a> = 
a href="+code=prob_minus" class="sref">prob_minus
/a>(
a href="+code=b" class="sref">b
/a>->
a href="+code=p_mark" class="sref">p_mark
/a>, 
a href="+code=q" class="sref">q
/a>->
a href="+code=decrement" class="sref">decrement
/a>);o 186
/a>}o 187
/a>o 188
/a>static void 
a href="+code=increment_prob" class="sref">increment_prob
/a>(struct 
a href="+code=sfb_bucket" class="sref">sfb_bucket
/a> *
a href="+code=b" class="sref">b
/a>, struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 189
/a>{o 190
/a>        
a href="+code=b" class="sref">b
/a>->
a href="+code=p_mark" class="sref">p_mark
/a> = 
a href="+code=prob_plus" class="sref">prob_plus
/a>(
a href="+code=b" class="sref">b
/a>->
a href="+code=p_mark" class="sref">p_mark
/a>, 
a href="+code=q" class="sref">q
/a>->
a href="+code=increment" class="sref">increment
/a>);o 191
/a>}o 192
/a>o 193
/a>static void 
a href="+code=sfb_zero_all_buckets" class="sref">sfb_zero_all_buckets
/a>(struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 194
/a>{o 195
/a>        
a href="+code=memset" class="sref">memset
/a>(&
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>, 0, sizeof(
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>));o 196
/a>}o 197
/a>o 198
/a>
spat class="comment">/*
/spatio 199
/a>
spat class="comment"> * compute max qlen, max p_mark, and avg p_mark
/spatio 20.9
spat class="comment"> */
/spatio 201
/a>static 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=sfb_compute_qlen" class="sref">sfb_compute_qlen
/a>(
a href="+code=u32" class="sref">u32
/a> *
a href="+code=prob_r" class="sref">prob_r
/a>, 
a href="+code=u32" class="sref">u32
/a> *
a href="+code=avgpm_r" class="sref">avgpm_r
/a>, const struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 202
/a>{o 203
/a>        int 
a href="+code=i" class="sref">i
/a>;o 204
/a>        
a href="+code=u32" class="sref">u32
/a> 
a href="+code=qlen" class="sref">qlen
/a> = 0, 
a href="+code=prob" class="sref">prob
/a> = 0, 
a href="+code=totalpm" class="sref">totalpm
/a> = 0;o 205
/a>        const struct 
a href="+code=sfb_bucket" class="sref">sfb_bucket
/a> *
a href="+code=b" class="sref">b
/a> = &
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>[
a href="+code=q" class="sref">q
/a>->
a href="+code=slot" class="sref">slot
/a>].
a href="+code=bins" class="sref">bins
/a>[0][0];o 206
/a>o 207
/a>        for (
a href="+code=i" class="sref">i
/a> = 0; 
a href="+code=i" class="sref">i
/a> < 
a href="+code=SFB_LEVELS" class="sref">SFB_LEVELS
/a> * 
a href="+code=SFB_NUMBUCKETS" class="sref">SFB_NUMBUCKETS
/a>; 
a href="+code=i" class="sref">i
/a>++) {o 208
/a>                if (
a href="+code=qlen" class="sref">qlen
/a> < 
a href="+code=b" class="sref">b
/a>->
a href="+code=qlen" class="sref">qlen
/a>)o 209
/a>                        
a href="+code=qlen" class="sref">qlen
/a> = 
a href="+code=b" class="sref">b
/a>->
a href="+code=qlen" class="sref">qlen
/a>;o 210
/a>                
a href="+code=totalpm" class="sref">totalpm
/a> += 
a href="+code=b" class="sref">b
/a>->
a href="+code=p_mark" class="sref">p_mark
/a>;o 211
/a>                if (
a href="+code=prob" class="sref">prob
/a> < 
a href="+code=b" class="sref">b
/a>->
a href="+code=p_mark" class="sref">p_mark
/a>)o 212
/a>                        
a href="+code=prob" class="sref">prob
/a> = 
a href="+code=b" class="sref">b
/a>->
a href="+code=p_mark" class="sref">p_mark
/a>;o 213
/a>                
a href="+code=b" class="sref">b
/a>++;o 214
/a>        }o 215
/a>        *
a href="+code=prob_r" class="sref">prob_r
/a> = 
a href="+code=prob" class="sref">prob
/a>;o 216
/a>        *
a href="+code=avgpm_r" class="sref">avgpm_r
/a> = 
a href="+code=totalpm" class="sref">totalpm
/a> / (
a href="+code=SFB_LEVELS" class="sref">SFB_LEVELS
/a> * 
a href="+code=SFB_NUMBUCKETS" class="sref">SFB_NUMBUCKETS
/a>);o 217
/a>        return 
a href="+code=qlen" class="sref">qlen
/a>;o 218
/a>}o 219
/a>o 220
/a>o 221
/a>static void 
a href="+code=sfb_init_perturba/opt" class="sref">sfb_init_perturba/opt
/a>(
a href="+code=u32" class="sref">u32
/a> 
a href="+code=slot" class="sref">slot
/a>, struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 222
/a>{o 223
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>[
a href="+code=slot" class="sref">slot
/a>].
a href="+code=perturba/opt" class="sref">perturba/opt
/a> = 
a href="+code=net_random" class="sref">net_random
/a>();o 224
/a>}o 225
/a>o 226
/a>static void 
a href="+code=sfb_swap_slot" class="sref">sfb_swap_slot
/a>(struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 227
/a>{o 228
/a>        
a href="+code=sfb_init_perturba/opt" class="sref">sfb_init_perturba/opt
/a>(
a href="+code=q" class="sref">q
/a>->
a href="+code=slot" class="sref">slot
/a>, 
a href="+code=q" class="sref">q
/a>);o 229
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=slot" class="sref">slot
/a> ^= 1;o 230
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=double_buffering" class="sref">double_buffering
/a> = 
a href="+code=false" class="sref">false
/a>;o 231
/a>}o 232
/a>o 233
/a>
spat class="comment">/* Non elastic flows are allowed to use part of the bandwidth, expressed
/spatio 234
/a>
spat class="comment"> * in "penalty_rate" packets per second, with "penalty_burst" burst
/spatio 235
/a>
spat class="comment"> */
/spatio 236
/a>static 
a href="+code=bool" class="sref">bool
/a> 
a href="+code=sfb_rate_limit" class="sref">sfb_rate_limit
/a>(struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>, struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>)o 237
/a>{o 238
/a>        if (
a href="+code=q" class="sref">q
/a>->
a href="+code=penalty_rate" class="sref">penalty_rate
/a> == 0 || 
a href="+code=q" class="sref">q
/a>->
a href="+code=penalty_burst" class="sref">penalty_burst
/a> == 0)o 239
/a>                return 
a href="+code=true" class="sref">true
/a>;o 240
/a>o 241
/a>        if (
a href="+code=q" class="sref">q
/a>->
a href="+code=tokens_avail" class="sref">tokens_avail
/a> < 1) {o 242
/a>                unsignad long 
a href="+code=age" class="sref">age
/a> = 
a href="+code=mit" class="sref">mit
/a>(10UL * 
a href="+code=HZ" class="sref">HZ
/a>, 
a href="+code=jiffies" class="sref">jiffies
/a> - 
a href="+code=q" class="sref">q
/a>->
a href="+code=token_time" class="sref">token_time
/a>);o 243
/a>o 244
/a>                
a href="+code=q" class="sref">q
/a>->
a href="+code=tokens_avail" class="sref">tokens_avail
/a> = (
a href="+code=age" class="sref">age
/a> * 
a href="+code=q" class="sref">q
/a>->
a href="+code=penalty_rate" class="sref">penalty_rate
/a>) / 
a href="+code=HZ" class="sref">HZ
/a>;o 245
/a>                if (
a href="+code=q" class="sref">q
/a>->
a href="+code=tokens_avail" class="sref">tokens_avail
/a> > 
a href="+code=q" class="sref">q
/a>->
a href="+code=penalty_burst" class="sref">penalty_burst
/a>)o 246
/a>                        
a href="+code=q" class="sref">q
/a>->
a href="+code=tokens_avail" class="sref">tokens_avail
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=penalty_burst" class="sref">penalty_burst
/a>;o 247
/a>                
a href="+code=q" class="sref">q
/a>->
a href="+code=token_time" class="sref">token_time
/a> = 
a href="+code=jiffies" class="sref">jiffies
/a>;o 248
/a>                if (
a href="+code=q" class="sref">q
/a>->
a href="+code=tokens_avail" class="sref">tokens_avail
/a> < 1)o 249
/a>                        return 
a href="+code=true" class="sref">true
/a>;o 250
/a>        }o 251
/a>o 252
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=tokens_avail" class="sref">tokens_avail
/a>--;o 253
/a>        return 
a href="+code=false" class="sref">false
/a>;o 254
/a>}o 255
/a>o 256
/a>static 
a href="+code=bool" class="sref">bool
/a> 
a href="+code=sfb_classify" class="sref">sfb_classify
/a>(struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>, struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a>,o 257
/a>                         int *
a href="+code=qerr" class="sref">qerr
/a>, 
a href="+code=u32" class="sref">u32
/a> *
a href="+code=salt" class="sref">salt
/a>)o 258
/a>{o 259
/a>        struct 
a href="+code=tcf_result" class="sref">tcf_result
/a> 
a href="+code=res" class="sref">res
/a>;o 260
/a>        int 
a href="+code=result" class="sref">result
/a>;o 261
/a>o 262
/a>        
a href="+code=result" class="sref">result
/a> = 
a href="+code=tc_classify" class="sref">tc_classify
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=q" class="sref">q
/a>->
a href="+code=filter_list" class="sref">filter_list
/a>, &
a href="+code=res" class="sref">res
/a>);o 263
/a>        if (
a href="+code=result" class="sref">result
/a> >= 0) {o 264
/a>#ifdef 
a href="+code=CONFIG_NET_CLS_ACT" class="sref">CONFIG_NET_CLS_ACT
/a>o 265
/a>                switch (
a href="+code=result" class="sref">result
/a>) {o 266
/a>                case 
a href="+code=TC_ACT_STOLEN" class="sref">TC_ACT_STOLEN
/a>:o 267
/a>                case 
a href="+code=TC_ACT_QUEUED" class="sref">TC_ACT_QUEUED
/a>:o 268
/a>                        *
a href="+code=qerr" class="sref">qerr
/a> = 
a href="+code=NET_XMIT_SUCCESS" class="sref">NET_XMIT_SUCCESS
/a> | 
a href="+code=__NET_XMIT_STOLEN" class="sref">__NET_XMIT_STOLEN
/a>;o 269
/a>                case 
a href="+code=TC_ACT_SHOT" class="sref">TC_ACT_SHOT
/a>:o 270
/a>                        return 
a href="+code=false" class="sref">false
/a>;o 271
/a>                }o 272
/a>#endifo 273
/a>                *
a href="+code=salt" class="sref">salt
/a> = 
a href="+code=TC_H_MIN" class="sref">TC_H_MIN
/a>(
a href="+code=res" class="sref">res
/a>.
a href="+code=classid" class="sref">classid
/a>);o 274
/a>                return 
a href="+code=true" class="sref">true
/a>;o 275
/a>        }o 276
/a>        return 
a href="+code=false" class="sref">false
/a>;o 277
/a>}o 278
/a>o 279
/a>static int 
a href="+code=sfb_enqueue" class="sref">sfb_enqueue
/a>(struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>, struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>)o 280
/a>{o 281
/a>o 282
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 283
/a>        struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=child" class="sref">child
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>;o 284
/a>        int 
a href="+code=i" class="sref">i
/a>;o 285
/a>        
a href="+code=u32" class="sref">u32
/a> 
a href="+code=p_mit" class="sref">p_mit
/a> = ~0;o 286
/a>        
a href="+code=u32" class="sref">u32
/a> 
a href="+code=mitqlen" class="sref">mitqlen
/a> = ~0;o 287
/a>        
a href="+code=u32" class="sref">u32
/a> 
a href="+code=r" class="sref">r
/a>, 
a href="+code=slot" class="sref">slot
/a>, 
a href="+code=salt" class="sref">salt
/a>, 
a href="+code=sfbhash" class="sref">sfbhash
/a>;o 288
/a>        int 
a href="+code=ret" class="sref">ret
/a> = 
a href="+code=NET_XMIT_SUCCESS" class="sref">NET_XMIT_SUCCESS
/a> | 
a href="+code=__NET_XMIT_BYPASS" class="sref">__NET_XMIT_BYPASS
/a>;o 289
/a>        struct 
a href="+code=flow_keys" class="sref">flow_keys
/a> 
a href="+code=keys" class="sref">keys
/a>;o 290
/a>o 291
/a>        if (
a href="+code=unlikely" class="sref">unlikely
/a>(
a href="+code=sch" class="sref">sch
/a>->
a href="+code=q" class="sref">q
/a>.
a href="+code=qlen" class="sref">qlen
/a> >= 
a href="+code=q" class="sref">q
/a>->
a href="+code=limit" class="sref">limit
/a>)) {o 292
/a>                
a href="+code=sch" class="sref">sch
/a>->
a href="+code=qstats" class="sref">qstats
/a>.
a href="+code=overlimits" class="sref">overlimits
/a>++;o 293
/a>                
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=queuedrop" class="sref">queuedrop
/a>++;o 294
/a>                goto 
a href="+code=drop" class="sref">drop
/a>;o 295
/a>        }o 296
/a>o 297
/a>        if (
a href="+code=q" class="sref">q
/a>->
a href="+code=rehash_interval" class="sref">rehash_interval
/a> > 0) {o 298
/a>                unsignad long 
a href="+code=limit" class="sref">limit
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=rehash_time" class="sref">rehash_time
/a> + 
a href="+code=q" class="sref">q
/a>->
a href="+code=rehash_interval" class="sref">rehash_interval
/a>;o 299
/a>o 300
/a>                if (
a href="+code=unlikely" class="sref">unlikely
/a>(
a href="+code=time_after" class="sref">time_after
/a>(
a href="+code=jiffies" class="sref">jiffies
/a>, 
a href="+code=limit" class="sref">limit
/a>))) {o 301
/a>                        
a href="+code=sfb_swap_slot" class="sref">sfb_swap_slot
/a>(
a href="+code=q" class="sref">q
/a>);o 302
/a>                        
a href="+code=q" class="sref">q
/a>->
a href="+code=rehash_time" class="sref">rehash_time
/a> = 
a href="+code=jiffies" class="sref">jiffies
/a>;o 303
/a>                } else if (
a href="+code=unlikely" class="sref">unlikely
/a>(!
a href="+code=q" class="sref">q
/a>->
a href="+code=double_buffering" class="sref">double_buffering
/a> && 
a href="+code=q" class="sref">q
/a>->
a href="+code=warmup_time" class="sref">warmup_time
/a> > 0 &&o 304
/a>                                    
a href="+code=time_after" class="sref">time_after
/a>(
a href="+code=jiffies" class="sref">jiffies
/a>, 
a href="+code=limit" class="sref">limit
/a> - 
a href="+code=q" class="sref">q
/a>->
a href="+code=warmup_time" class="sref">warmup_time
/a>))) {o 305
/a>                        
a href="+code=q" class="sref">q
/a>->
a href="+code=double_buffering" class="sref">double_buffering
/a> = 
a href="+code=true" class="sref">true
/a>;o 306
/a>                }o 307
/a>        }o 308
/a>o 309
/a>        if (
a href="+code=q" class="sref">q
/a>->
a href="+code=filter_list" class="sref">filter_list
/a>) {o 310
/a>                
spat class="comment">/* If using external classifiers, get result and record it. */
/spatio 311
/a>                if (!
a href="+code=sfb_classify" class="sref">sfb_classify
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=q" class="sref">q
/a>, &
a href="+code=ret" class="sref">ret
/a>, &
a href="+code=salt" class="sref">salt
/a>))o 312
/a>                        goto 
a href="+code=other_drop" class="sref">other_drop
/a>;o 313
/a>                
a href="+code=keys" class="sref">keys
/a>.
a href="+code=src" class="sref">src
/a> = 
a href="+code=salt" class="sref">salt
/a>;o 314
/a>                
a href="+code=keys" class="sref">keys
/a>.
a href="+code=dst" class="sref">dst
/a> = 0;o 315
/a>                
a href="+code=keys" class="sref">keys
/a>.
a href="+code=ports" class="sref">ports
/a> = 0;o 316
/a>        } else {o 317
/a>                
a href="+code=skb_flow_dissect" class="sref">skb_flow_dissect
/a>(
a href="+code=skb" class="sref">skb
/a>, &
a href="+code=keys" class="sref">keys
/a>);o 318
/a>        }o 319
/a>o 320
/a>        
a href="+code=slot" class="sref">slot
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=slot" class="sref">slot
/a>;o 321
/a>o 322
/a>        
a href="+code=sfbhash" class="sref">sfbhash
/a> = 
a href="+code=jhash_3words" class="sref">jhash_3words
/a>((
a href="+code=__force" class="sref">__force
/a> 
a href="+code=u32" class="sref">u32
/a>)
a href="+code=keys" class="sref">keys
/a>.
a href="+code=dst" class="sref">dst
/a>,o 323
/a>                               (
a href="+code=__force" class="sref">__force
/a> 
a href="+code=u32" class="sref">u32
/a>)
a href="+code=keys" class="sref">keys
/a>.
a href="+code=src" class="sref">src
/a>,o 324
/a>                               (
a href="+code=__force" class="sref">__force
/a> 
a href="+code=u32" class="sref">u32
/a>)
a href="+code=keys" class="sref">keys
/a>.
a href="+code=ports" class="sref">ports
/a>,o 325
/a>                               
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>[
a href="+code=slot" class="sref">slot
/a>].
a href="+code=perturba/opt" class="sref">perturba/opt
/a>);o 326
/a>        if (!
a href="+code=sfbhash" class="sref">sfbhash
/a>)o 327
/a>                
a href="+code=sfbhash" class="sref">sfbhash
/a> = 1;o 328
/a>        
a href="+code=sfb_skb_cb" class="sref">sfb_skb_cb
/a>(
a href="+code=skb" class="sref">skb
/a>)->
a href="+code=hashes" class="sref">hashes
/a>[
a href="+code=slot" class="sref">slot
/a>] = 
a href="+code=sfbhash" class="sref">sfbhash
/a>;o 329
/a>o 330
/a>        for (
a href="+code=i" class="sref">i
/a> = 0; 
a href="+code=i" class="sref">i
/a> < 
a href="+code=SFB_LEVELS" class="sref">SFB_LEVELS
/a>; 
a href="+code=i" class="sref">i
/a>++) {o 331
/a>                
a href="+code=u32" class="sref">u32
/a> 
a href="+code=hash" class="sref">hash
/a> = 
a href="+code=sfbhash" class="sref">sfbhash
/a> & 
a href="+code=SFB_BUCKET_MASK" class="sref">SFB_BUCKET_MASK
/a>;o 332
/a>                struct 
a href="+code=sfb_bucket" class="sref">sfb_bucket
/a> *
a href="+code=b" class="sref">b
/a> = &
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>[
a href="+code=slot" class="sref">slot
/a>].
a href="+code=bins" class="sref">bins
/a>[
a href="+code=i" class="sref">i
/a>][
a href="+code=hash" class="sref">hash
/a>];o 333
/a>o 334
/a>                
a href="+code=sfbhash" class="sref">sfbhash
/a> >>= 
a href="+code=SFB_BUCKET_SHIFT" class="sref">SFB_BUCKET_SHIFT
/a>;o 335
/a>                if (
a href="+code=b" class="sref">b
/a>->
a href="+code=qlen" class="sref">qlen
/a> == 0)o 336
/a>                        
a href="+code=decrement_prob" class="sref">decrement_prob
/a>(
a href="+code=b" class="sref">b
/a>, 
a href="+code=q" class="sref">q
/a>);o 337
/a>                else if (
a href="+code=b" class="sref">b
/a>->
a href="+code=qlen" class="sref">qlen
/a> >= 
a href="+code=q" class="sref">q
/a>->
a href="+code=bin_size" class="sref">bin_size
/a>)o 338
/a>                        
a href="+code=increment_prob" class="sref">increment_prob
/a>(
a href="+code=b" class="sref">b
/a>, 
a href="+code=q" class="sref">q
/a>);o 339
/a>                if (
a href="+code=mitqlen" class="sref">mitqlen
/a> > 
a href="+code=b" class="sref">b
/a>->
a href="+code=qlen" class="sref">qlen
/a>)o 340
/a>                        
a href="+code=mitqlen" class="sref">mitqlen
/a> = 
a href="+code=b" class="sref">b
/a>->
a href="+code=qlen" class="sref">qlen
/a>;o 341
/a>                if (
a href="+code=p_mit" class="sref">p_mit
/a> > 
a href="+code=b" class="sref">b
/a>->
a href="+code=p_mark" class="sref">p_mark
/a>)o 342
/a>                        
a href="+code=p_mit" class="sref">p_mit
/a> = 
a href="+code=b" class="sref">b
/a>->
a href="+code=p_mark" class="sref">p_mark
/a>;o 343
/a>        }o 344
/a>o 345
/a>        
a href="+code=slot" class="sref">slot
/a> ^= 1;o 346
/a>        
a href="+code=sfb_skb_cb" class="sref">sfb_skb_cb
/a>(
a href="+code=skb" class="sref">skb
/a>)->
a href="+code=hashes" class="sref">hashes
/a>[
a href="+code=slot" class="sref">slot
/a>] = 0;o 347
/a>o 348
/a>        if (
a href="+code=unlikely" class="sref">unlikely
/a>(
a href="+code=mitqlen" class="sref">mitqlen
/a> >= 
a href="+code=q" class="sref">q
/a>->
a href="+code=max" class="sref">max
/a>)) {o 349
/a>                
a href="+code=sch" class="sref">sch
/a>->
a href="+code=qstats" class="sref">qstats
/a>.
a href="+code=overlimits" class="sref">overlimits
/a>++;o 350
/a>                
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=bucketdrop" class="sref">bucketdrop
/a>++;o 351
/a>                goto 
a href="+code=drop" class="sref">drop
/a>;o 352
/a>        }o 353
/a>o 354
/a>        if (
a href="+code=unlikely" class="sref">unlikely
/a>(
a href="+code=p_mit" class="sref">p_mit
/a> >= 
a href="+code=SFB_MAX_PROB" class="sref">SFB_MAX_PROB
/a>)) {o 355
/a>                
spat class="comment">/* Inelastic flow */
/spatio 356
/a>                if (
a href="+code=q" class="sref">q
/a>->
a href="+code=double_buffering" class="sref">double_buffering
/a>) {o 357
/a>                        
a href="+code=sfbhash" class="sref">sfbhash
/a> = 
a href="+code=jhash_3words" class="sref">jhash_3words
/a>((
a href="+code=__force" class="sref">__force
/a> 
a href="+code=u32" class="sref">u32
/a>)
a href="+code=keys" class="sref">keys
/a>.
a href="+code=dst" class="sref">dst
/a>,o 358
/a>                                               (
a href="+code=__force" class="sref">__force
/a> 
a href="+code=u32" class="sref">u32
/a>)
a href="+code=keys" class="sref">keys
/a>.
a href="+code=src" class="sref">src
/a>,o 359
/a>                                               (
a href="+code=__force" class="sref">__force
/a> 
a href="+code=u32" class="sref">u32
/a>)
a href="+code=keys" class="sref">keys
/a>.
a href="+code=ports" class="sref">ports
/a>,o 360
/a>                                               
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>[
a href="+code=slot" class="sref">slot
/a>].
a href="+code=perturba/opt" class="sref">perturba/opt
/a>);o 361
/a>                        if (!
a href="+code=sfbhash" class="sref">sfbhash
/a>)o 362
/a>                                
a href="+code=sfbhash" class="sref">sfbhash
/a> = 1;o 363
/a>                        
a href="+code=sfb_skb_cb" class="sref">sfb_skb_cb
/a>(
a href="+code=skb" class="sref">skb
/a>)->
a href="+code=hashes" class="sref">hashes
/a>[
a href="+code=slot" class="sref">slot
/a>] = 
a href="+code=sfbhash" class="sref">sfbhash
/a>;o 364
/a>o 365
/a>                        for (
a href="+code=i" class="sref">i
/a> = 0; 
a href="+code=i" class="sref">i
/a> < 
a href="+code=SFB_LEVELS" class="sref">SFB_LEVELS
/a>; 
a href="+code=i" class="sref">i
/a>++) {o 366
/a>                                
a href="+code=u32" class="sref">u32
/a> 
a href="+code=hash" class="sref">hash
/a> = 
a href="+code=sfbhash" class="sref">sfbhash
/a> & 
a href="+code=SFB_BUCKET_MASK" class="sref">SFB_BUCKET_MASK
/a>;o 367
/a>                                struct 
a href="+code=sfb_bucket" class="sref">sfb_bucket
/a> *
a href="+code=b" class="sref">b
/a> = &
a href="+code=q" class="sref">q
/a>->
a href="+code=bins" class="sref">bins
/a>[
a href="+code=slot" class="sref">slot
/a>].
a href="+code=bins" class="sref">bins
/a>[
a href="+code=i" class="sref">i
/a>][
a href="+code=hash" class="sref">hash
/a>];o 368
/a>o 369
/a>                                
a href="+code=sfbhash" class="sref">sfbhash
/a> >>= 
a href="+code=SFB_BUCKET_SHIFT" class="sref">SFB_BUCKET_SHIFT
/a>;o 370
/a>                                if (
a href="+code=b" class="sref">b
/a>->
a href="+code=qlen" class="sref">qlen
/a> == 0)o 371
/a>                                        
a href="+code=decrement_prob" class="sref">decrement_prob
/a>(
a href="+code=b" class="sref">b
/a>, 
a href="+code=q" class="sref">q
/a>);o 372
/a>                                else if (
a href="+code=b" class="sref">b
/a>->
a href="+code=qlen" class="sref">qlen
/a> >= 
a href="+code=q" class="sref">q
/a>->
a href="+code=bin_size" class="sref">bin_size
/a>)o 373
/a>                                        
a href="+code=increment_prob" class="sref">increment_prob
/a>(
a href="+code=b" class="sref">b
/a>, 
a href="+code=q" class="sref">q
/a>);o 374
/a>                        }o 375
/a>                }o 376
/a>                if (
a href="+code=sfb_rate_limit" class="sref">sfb_rate_limit
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=q" class="sref">q
/a>)) {o 377
/a>                        
a href="+code=sch" class="sref">sch
/a>->
a href="+code=qstats" class="sref">qstats
/a>.
a href="+code=overlimits" class="sref">overlimits
/a>++;o 378
/a>                        
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=penaltydrop" class="sref">penaltydrop
/a>++;o 379
/a>                        goto 
a href="+code=drop" class="sref">drop
/a>;o 380
/a>                }o 381
/a>                goto 
a href="+code=enqueue" class="sref">enqueue
/a>;o 382
/a>        }o 383
/a>o 384
/a>        
a href="+code=r" class="sref">r
/a> = 
a href="+code=net_random" class="sref">net_random
/a>() & 
a href="+code=SFB_MAX_PROB" class="sref">SFB_MAX_PROB
/a>;o 385
/a>o 386
/a>        if (
a href="+code=unlikely" class="sref">unlikely
/a>(
a href="+code=r" class="sref">r
/a> < 
a href="+code=p_mit" class="sref">p_mit
/a>)) {o 387
/a>                if (
a href="+code=unlikely" class="sref">unlikely
/a>(
a href="+code=p_mit" class="sref">p_mit
/a> > 
a href="+code=SFB_MAX_PROB" class="sref">SFB_MAX_PROB
/a> / 2)) {o 388
/a>                        
spat class="comment">/* If we're marking that many packets, then either
/spatio 389
/a>
spat class="comment">                         * this flow is unresponsive, or we're badly congested.
/spatio 390
/a>
spat class="comment">                         * In either case, we want to start dropping packets.
/spatio 391
/a>
spat class="comment">                         */
/spatio 392
/a>                        if (
a href="+code=r" class="sref">r
/a> < (
a href="+code=p_mit" class="sref">p_mit
/a> - 
a href="+code=SFB_MAX_PROB" class="sref">SFB_MAX_PROB
/a> / 2) * 2) {o 393
/a>                                
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=earlydrop" class="sref">earlydrop
/a>++;o 394
/a>                                goto 
a href="+code=drop" class="sref">drop
/a>;o 395
/a>                        }o 396
/a>                }o 397
/a>                if (
a href="+code=INET_ECN_set_ce" class="sref">INET_ECN_set_ce
/a>(
a href="+code=skb" class="sref">skb
/a>)) {o 398
/a>                        
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=marked" class="sref">marked
/a>++;o 399
/a>                } else {o 400
/a>                        
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=earlydrop" class="sref">earlydrop
/a>++;o 401
/a>                        goto 
a href="+code=drop" class="sref">drop
/a>;o 402
/a>                }o 403
/a>        }o 404
/a>o 405
/a>
a href="+code=enqueue" class="sref">enqueue
/a>:o 406
/a>        
a href="+code=ret" class="sref">ret
/a> = 
a href="+code=qdisc_enqueue" class="sref">qdisc_enqueue
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=child" class="sref">child
/a>);o 407
/a>        if (
a href="+code=likely" class="sref">likely
/a>(
a href="+code=ret" class="sref">ret
/a> == 
a href="+code=NET_XMIT_SUCCESS" class="sref">NET_XMIT_SUCCESS
/a>)) {o 408
/a>                
a href="+code=sch" class="sref">sch
/a>->
a href="+code=q" class="sref">q
/a>.
a href="+code=qlen" class="sref">qlen
/a>++;o 409
/a>                
a href="+code=increment_qlen" class="sref">increment_qlen
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=q" class="sref">q
/a>);o 410
/a>        } else if (
a href="+code=net_xmit_drop_count" class="sref">net_xmit_drop_count
/a>(
a href="+code=ret" class="sref">ret
/a>)) {o 411
/a>                
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=childdrop" class="sref">childdrop
/a>++;o 412
/a>                
a href="+code=sch" class="sref">sch
/a>->
a href="+code=qstats" class="sref">qstats
/a>.
a href="+code=drops" class="sref">drops
/a>++;o 413
/a>        }o 414
/a>        return 
a href="+code=ret" class="sref">ret
/a>;o 415
/a>o 416
/a>
a href="+code=drop" class="sref">drop
/a>:o 417
/a>        
a href="+code=qdisc_drop" class="sref">qdisc_drop
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=sch" class="sref">sch
/a>);o 418
/a>        return 
a href="+code=NET_XMIT_CN" class="sref">NET_XMIT_CN
/a>;o 419
/a>
a href="+code=other_drop" class="sref">other_drop
/a>:o 420
/a>        if (
a href="+code=ret" class="sref">ret
/a> & 
a href="+code=__NET_XMIT_BYPASS" class="sref">__NET_XMIT_BYPASS
/a>)o 421
/a>                
a href="+code=sch" class="sref">sch
/a>->
a href="+code=qstats" class="sref">qstats
/a>.
a href="+code=drops" class="sref">drops
/a>++;o 422
/a>        
a href="+code=kfree_skb" class="sref">kfree_skb
/a>(
a href="+code=skb" class="sref">skb
/a>);o 423
/a>        return 
a href="+code=ret" class="sref">ret
/a>;o 424
/a>}o 425
/a>o 426
/a>static struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=sfb_dequeue" class="sref">sfb_dequeue
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>)o 427
/a>{o 428
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 429
/a>        struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=child" class="sref">child
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>;o 430
/a>        struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>;o 431
/a>o 432
/a>        
a href="+code=skb" class="sref">skb
/a> = 
a href="+code=child" class="sref">child
/a>->
a href="+code=dequeue" class="sref">dequeue
/a>(
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>);o 433
/a>o 434
/a>        if (
a href="+code=skb" class="sref">skb
/a>) {o 435
/a>                
a href="+code=qdisc_bstats_update" class="sref">qdisc_bstats_update
/a>(
a href="+code=sch" class="sref">sch
/a>, 
a href="+code=skb" class="sref">skb
/a>);o 436
/a>                
a href="+code=sch" class="sref">sch
/a>->
a href="+code=q" class="sref">q
/a>.
a href="+code=qlen" class="sref">qlen
/a>--;o 437
/a>                
a href="+code=decrement_qlen" class="sref">decrement_qlen
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=q" class="sref">q
/a>);o 438
/a>        }o 439
/a>o 440
/a>        return 
a href="+code=skb" class="sref">skb
/a>;o 441
/a>}o 442
/a>o 443
/a>static struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=sfb_peek" class="sref">sfb_peek
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>)o 444
/a>{o 445
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 446
/a>        struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=child" class="sref">child
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>;o 447
/a>o 448
/a>        return 
a href="+code=child" class="sref">child
/a>->
a href="+code=ops" class="sref">ops
/a>->
a href="+code=peek" class="sref">peek
/a>(
a href="+code=child" class="sref">child
/a>);o 449
/a>}o 450
/a>o 451
/a>
spat class="comment">/* No sfb_drop -- impossible since the child doesn't return the dropped skb. */
/spatio 452
/a>o 453
/a>static void 
a href="+code=sfb_reset" class="sref">sfb_reset
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>)o 454
/a>{o 455
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 456
/a>o 457
/a>        
a href="+code=qdisc_reset" class="sref">qdisc_reset
/a>(
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>);o 458
/a>        
a href="+code=sch" class="sref">sch
/a>->
a href="+code=q" class="sref">q
/a>.
a href="+code=qlen" class="sref">qlen
/a> = 0;o 459
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=slot" class="sref">slot
/a> = 0;o 460
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=double_buffering" class="sref">double_buffering
/a> = 
a href="+code=false" class="sref">false
/a>;o 461
/a>        
a href="+code=sfb_zero_all_buckets" class="sref">sfb_zero_all_buckets
/a>(
a href="+code=q" class="sref">q
/a>);o 462
/a>        
a href="+code=sfb_init_perturba/opt" class="sref">sfb_init_perturba/opt
/a>(0, 
a href="+code=q" class="sref">q
/a>);o 463
/a>}o 464
/a>o 465
/a>static void 
a href="+code=sfb_destroy" class="sref">sfb_destroy
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>)o 466
/a>{o 467
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 468
/a>o 469
/a>        
a href="+code=tcf_destroy_chait" class="sref">tcf_destroy_chait
/a>(&
a href="+code=q" class="sref">q
/a>->
a href="+code=filter_list" class="sref">filter_list
/a>);o 470
/a>        
a href="+code=qdisc_destroy" class="sref">qdisc_destroy
/a>(
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>);o 471
/a>}o 472
/a>o 473
/a>static const struct 
a href="+code=nla_policy" class="sref">nla_policy
/a> 
a href="+code=sfb_policy" class="sref">sfb_policy
/a>[
a href="+code=TCA_SFB_MAX" class="sref">TCA_SFB_MAX
/a> + 1] = {o 474
/a>        [
a href="+code=TCA_SFB_PARMS" class="sref">TCA_SFB_PARMS
/a>] = { .
a href="+code=len" class="sref">len
/a> = sizeof(struct 
a href="+code=tc_sfb_qopt" class="sref">tc_sfb_qopt
/a>) },o 475
/a>};o 476
/a>o 477
/a>static const struct 
a href="+code=tc_sfb_qopt" class="sref">tc_sfb_qopt
/a> 
a href="+code=sfb_default_ops" class="sref">sfb_default_ops
/a> = {o 478
/a>        .
a href="+code=rehash_interval" class="sref">rehash_interval
/a> = 600 * 
a href="+code=MSEC_PER_SEC" class="sref">MSEC_PER_SEC
/a>,o 479
/a>        .
a href="+code=warmup_time" class="sref">warmup_time
/a> = 60 * 
a href="+code=MSEC_PER_SEC" class="sref">MSEC_PER_SEC
/a>,o 480
/a>        .
a href="+code=limit" class="sref">limit
/a> = 0,o 481
/a>        .
a href="+code=max" class="sref">max
/a> = 25,o 482
/a>        .
a href="+code=bin_size" class="sref">bin_size
/a> = 20,o 483
/a>        .
a href="+code=increment" class="sref">increment
/a> = (
a href="+code=SFB_MAX_PROB" class="sref">SFB_MAX_PROB
/a> + 500) / 1000, 
spat class="comment">/* 0.1 % */
/spatio 484
/a>        .
a href="+code=decrement" class="sref">decrement
/a> = (
a href="+code=SFB_MAX_PROB" class="sref">SFB_MAX_PROB
/a> + 3000) / 6000,o 485
/a>        .
a href="+code=penalty_rate" class="sref">penalty_rate
/a> = 10,o 486
/a>        .
a href="+code=penalty_burst" class="sref">penalty_burst
/a> = 20,o 487
/a>};o 488
/a>o 489
/a>static int 
a href="+code=sfb_change" class="sref">sfb_change
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, struct 
a href="+code=nlattr" class="sref">nlattr
/a> *
a href="+code=opt" class="sref">opt
/a>)o 490
/a>{o 491
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 492
/a>        struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=child" class="sref">child
/a>;o 493
/a>        struct 
a href="+code=nlattr" class="sref">nlattr
/a> *
a href="+code=tb" class="sref">tb
/a>[
a href="+code=TCA_SFB_MAX" class="sref">TCA_SFB_MAX
/a> + 1];o 494
/a>        const struct 
a href="+code=tc_sfb_qopt" class="sref">tc_sfb_qopt
/a> *
a href="+code=ctl" class="sref">ctl
/a> = &
a href="+code=sfb_default_ops" class="sref">sfb_default_ops
/a>;o 495
/a>        
a href="+code=u32" class="sref">u32
/a> 
a href="+code=limit" class="sref">limit
/a>;o 496
/a>        int 
a href="+code=err" class="sref">err
/a>;o 497
/a>o 498
/a>        if (
a href="+code=opt" class="sref">opt
/a>) {o 499
/a>                
a href="+code=err" class="sref">err
/a> = 
a href="+code=nla_parse_nested" class="sref">nla_parse_nested
/a>(
a href="+code=tb" class="sref">tb
/a>, 
a href="+code=TCA_SFB_MAX" class="sref">TCA_SFB_MAX
/a>, 
a href="+code=opt" class="sref">opt
/a>, 
a href="+code=sfb_policy" class="sref">sfb_policy
/a>);o 500
/a>                if (
a href="+code=err" class="sref">err
/a> < 0)o 501
/a>                        return -
a href="+code=EINVAL" class="sref">EINVAL
/a>;o 502
/a>o 503
/a>                if (
a href="+code=tb" class="sref">tb
/a>[
a href="+code=TCA_SFB_PARMS" class="sref">TCA_SFB_PARMS
/a>] == 
a href="+code=NULL" class="sref">NULL
/a>)o 504
/a>                        return -
a href="+code=EINVAL" class="sref">EINVAL
/a>;o 505
/a>o 506
/a>                
a href="+code=ctl" class="sref">ctl
/a> = 
a href="+code=nla_data" class="sref">nla_data
/a>(
a href="+code=tb" class="sref">tb
/a>[
a href="+code=TCA_SFB_PARMS" class="sref">TCA_SFB_PARMS
/a>]);o 507
/a>        }o 508
/a>o 509
/a>        
a href="+code=limit" class="sref">limit
/a> = 
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=limit" class="sref">limit
/a>;o 510
/a>        if (
a href="+code=limit" class="sref">limit
/a> == 0)o 511
/a>                
a href="+code=limit" class="sref">limit
/a> = 
a href="+code=max_t" class="sref">max_t
/a>(
a href="+code=u32" class="sref">u32
/a>, 
a href="+code=qdisc_dev" class="sref">qdisc_dev
/a>(
a href="+code=sch" class="sref">sch
/a>)->
a href="+code=tx_queue_len" class="sref">tx_queue_len
/a>, 1);o 512
/a>o 513
/a>        
a href="+code=child" class="sref">child
/a> = 
a href="+code=fifo_create_dflt" class="sref">fifo_create_dflt
/a>(
a href="+code=sch" class="sref">sch
/a>, &
a href="+code=pfifo_qdisc_ops" class="sref">pfifo_qdisc_ops
/a>, 
a href="+code=limit" class="sref">limit
/a>);o 514
/a>        if (
a href="+code=IS_ERR" class="sref">IS_ERR
/a>(
a href="+code=child" class="sref">child
/a>))o 515
/a>                return 
a href="+code=PTR_ERR" class="sref">PTR_ERR
/a>(
a href="+code=child" class="sref">child
/a>);o 516
/a>o 517
/a>        
a href="+code=sch_tree_lock" class="sref">sch_tree_lock
/a>(
a href="+code=sch" class="sref">sch
/a>);o 518
/a>o 519
/a>        
a href="+code=qdisc_tree_decrease_qlen" class="sref">qdisc_tree_decrease_qlen
/a>(
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>, 
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>->
a href="+code=q" class="sref">q
/a>.
a href="+code=qlen" class="sref">qlen
/a>);o 520
/a>        
a href="+code=qdisc_destroy" class="sref">qdisc_destroy
/a>(
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>);o 521
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a> = 
a href="+code=child" class="sref">child
/a>;o 522
/a>o 523
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=rehash_interval" class="sref">rehash_interval
/a> = 
a href="+code=msecs_to_jiffies" class="sref">msecs_to_jiffies
/a>(
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=rehash_interval" class="sref">rehash_interval
/a>);o 524
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=warmup_time" class="sref">warmup_time
/a> = 
a href="+code=msecs_to_jiffies" class="sref">msecs_to_jiffies
/a>(
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=warmup_time" class="sref">warmup_time
/a>);o 525
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=rehash_time" class="sref">rehash_time
/a> = 
a href="+code=jiffies" class="sref">jiffies
/a>;o 526
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=limit" class="sref">limit
/a> = 
a href="+code=limit" class="sref">limit
/a>;o 527
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=increment" class="sref">increment
/a> = 
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=increment" class="sref">increment
/a>;o 528
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=decrement" class="sref">decrement
/a> = 
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=decrement" class="sref">decrement
/a>;o 529
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=max" class="sref">max
/a> = 
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=max" class="sref">max
/a>;o 530
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=bin_size" class="sref">bin_size
/a> = 
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=bin_size" class="sref">bin_size
/a>;o 531
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=penalty_rate" class="sref">penalty_rate
/a> = 
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=penalty_rate" class="sref">penalty_rate
/a>;o 532
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=penalty_burst" class="sref">penalty_burst
/a> = 
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=penalty_burst" class="sref">penalty_burst
/a>;o 533
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=tokens_avail" class="sref">tokens_avail
/a> = 
a href="+code=ctl" class="sref">ctl
/a>->
a href="+code=penalty_burst" class="sref">penalty_burst
/a>;o 534
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=token_time" class="sref">token_time
/a> = 
a href="+code=jiffies" class="sref">jiffies
/a>;o 535
/a>o 536
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=slot" class="sref">slot
/a> = 0;o 537
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=double_buffering" class="sref">double_buffering
/a> = 
a href="+code=false" class="sref">false
/a>;o 538
/a>        
a href="+code=sfb_zero_all_buckets" class="sref">sfb_zero_all_buckets
/a>(
a href="+code=q" class="sref">q
/a>);o 539
/a>        
a href="+code=sfb_init_perturba/opt" class="sref">sfb_init_perturba/opt
/a>(0, 
a href="+code=q" class="sref">q
/a>);o 540
/a>        
a href="+code=sfb_init_perturba/opt" class="sref">sfb_init_perturba/opt
/a>(1, 
a href="+code=q" class="sref">q
/a>);o 541
/a>o 542
/a>        
a href="+code=sch_tree_unlock" class="sref">sch_tree_unlock
/a>(
a href="+code=sch" class="sref">sch
/a>);o 543
/a>o 544
/a>        return 0;o 545
/a>}o 546
/a>o 547
/a>static int 
a href="+code=sfb_init" class="sref">sfb_init
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, struct 
a href="+code=nlattr" class="sref">nlattr
/a> *
a href="+code=opt" class="sref">opt
/a>)o 548
/a>{o 549
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 550
/a>o 551
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a> = &
a href="+code=noop_qdisc" class="sref">noop_qdisc
/a>;o 552
/a>        return 
a href="+code=sfb_change" class="sref">sfb_change
/a>(
a href="+code=sch" class="sref">sch
/a>, 
a href="+code=opt" class="sref">opt
/a>);o 553
/a>}o 554
/a>o 555
/a>static int 
a href="+code=sfb_dump" class="sref">sfb_dump
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>)o 556
/a>{o 557
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 558
/a>        struct 
a href="+code=nlattr" class="sref">nlattr
/a> *
a href="+code=opts" class="sref">opts
/a>;o 559
/a>        struct 
a href="+code=tc_sfb_qopt" class="sref">tc_sfb_qopt
/a> 
a href="+code=opt" class="sref">opt
/a> = {o 560
/a>                .
a href="+code=rehash_interval" class="sref">rehash_interval
/a> = 
a href="+code=jiffies_to_msecs" class="sref">jiffies_to_msecs
/a>(
a href="+code=q" class="sref">q
/a>->
a href="+code=rehash_interval" class="sref">rehash_interval
/a>),o 561
/a>                .
a href="+code=warmup_time" class="sref">warmup_time
/a> = 
a href="+code=jiffies_to_msecs" class="sref">jiffies_to_msecs
/a>(
a href="+code=q" class="sref">q
/a>->
a href="+code=warmup_time" class="sref">warmup_time
/a>),o 562
/a>                .
a href="+code=limit" class="sref">limit
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=limit" class="sref">limit
/a>,o 563
/a>                .
a href="+code=max" class="sref">max
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=max" class="sref">max
/a>,o 564
/a>                .
a href="+code=bin_size" class="sref">bin_size
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=bin_size" class="sref">bin_size
/a>,o 565
/a>                .
a href="+code=increment" class="sref">increment
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=increment" class="sref">increment
/a>,o 566
/a>                .
a href="+code=decrement" class="sref">decrement
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=decrement" class="sref">decrement
/a>,o 567
/a>                .
a href="+code=penalty_rate" class="sref">penalty_rate
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=penalty_rate" class="sref">penalty_rate
/a>,o 568
/a>                .
a href="+code=penalty_burst" class="sref">penalty_burst
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=penalty_burst" class="sref">penalty_burst
/a>,o 569
/a>        };o 570
/a>o 571
/a>        
a href="+code=sch" class="sref">sch
/a>->
a href="+code=qstats" class="sref">qstats
/a>.
a href="+code=backlog" class="sref">backlog
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>->
a href="+code=qstats" class="sref">qstats
/a>.
a href="+code=backlog" class="sref">backlog
/a>;o 572
/a>        
a href="+code=opts" class="sref">opts
/a> = 
a href="+code=nla_nest_start" class="sref">nla_nest_start
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=TCA_OPTIONS" class="sref">TCA_OPTIONS
/a>);o 573
/a>        if (
a href="+code=opts" class="sref">opts
/a> == 
a href="+code=NULL" class="sref">NULL
/a>)o 574
/a>                goto 
a href="+code=nla_put_failure" class="sref">nla_put_failure
/a>;o 575
/a>        if (
a href="+code=nla_put" class="sref">nla_put
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=TCA_SFB_PARMS" class="sref">TCA_SFB_PARMS
/a>, sizeof(
a href="+code=opt" class="sref">opt
/a>), &
a href="+code=opt" class="sref">opt
/a>))o 576
/a>                goto 
a href="+code=nla_put_failure" class="sref">nla_put_failure
/a>;o 577
/a>        return 
a href="+code=nla_nest_end" class="sref">nla_nest_end
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=opts" class="sref">opts
/a>);o 578
/a>o 579
/a>
a href="+code=nla_put_failure" class="sref">nla_put_failure
/a>:o 580
/a>        
a href="+code=nla_nest_cancel" class="sref">nla_nest_cancel
/a>(
a href="+code=skb" class="sref">skb
/a>, 
a href="+code=opts" class="sref">opts
/a>);o 581
/a>        return -
a href="+code=EMSGSIZE" class="sref">EMSGSIZE
/a>;o 582
/a>}o 583
/a>o 584
/a>static int 
a href="+code=sfb_dump_stats" class="sref">sfb_dump_stats
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, struct 
a href="+code=gnet_dump" class="sref">gnet_dump
/a> *
a href="+code=d" class="sref">d
/a>)o 585
/a>{o 586
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 587
/a>        struct 
a href="+code=tc_sfb_xstats" class="sref">tc_sfb_xstats
/a> 
a href="+code=st" class="sref">st
/a> = {o 588
/a>                .
a href="+code=earlydrop" class="sref">earlydrop
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=earlydrop" class="sref">earlydrop
/a>,o 589
/a>                .
a href="+code=penaltydrop" class="sref">penaltydrop
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=penaltydrop" class="sref">penaltydrop
/a>,o 590
/a>                .
a href="+code=bucketdrop" class="sref">bucketdrop
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=bucketdrop" class="sref">bucketdrop
/a>,o 591
/a>                .
a href="+code=queuedrop" class="sref">queuedrop
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=queuedrop" class="sref">queuedrop
/a>,o 592
/a>                .
a href="+code=childdrop" class="sref">childdrop
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=childdrop" class="sref">childdrop
/a>,o 593
/a>                .
a href="+code=marked" class="sref">marked
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=stats" class="sref">stats
/a>.
a href="+code=marked" class="sref">marked
/a>,o 594
/a>        };o 595
/a>o 596
/a>        
a href="+code=st" class="sref">st
/a>.
a href="+code=maxqlen" class="sref">maxqlen
/a> = 
a href="+code=sfb_compute_qlen" class="sref">sfb_compute_qlen
/a>(&
a href="+code=st" class="sref">st
/a>.
a href="+code=maxprob" class="sref">maxprob
/a>, &
a href="+code=st" class="sref">st
/a>.
a href="+code=avgprob" class="sref">avgprob
/a>, 
a href="+code=q" class="sref">q
/a>);o 597
/a>o 598
/a>        return 
a href="+code=gnet_stats_copy_app" class="sref">gnet_stats_copy_app
/a>(
a href="+code=d" class="sref">d
/a>, &
a href="+code=st" class="sref">st
/a>, sizeof(
a href="+code=st" class="sref">st
/a>));o 599
/a>}o 600
/a>o 601
/a>static int 
a href="+code=sfb_dump_class" class="sref">sfb_dump_class
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, unsigned long 
a href="+code=cl" class="sref">cl
/a>,o 602
/a>                          struct 
a href="+code=sk_buff" class="sref">sk_buff
/a> *
a href="+code=skb" class="sref">skb
/a>, struct 
a href="+code=tcmsg" class="sref">tcmsg
/a> *
a href="+code=tcm" class="sref">tcm
/a>)o 603
/a>{o 604
/a>        return -
a href="+code=ENOSYS" class="sref">ENOSYS
/a>;o 605
/a>}o 606
/a>o 607
/a>static int 
a href="+code=sfb_graft" class="sref">sfb_graft
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, unsigned long 
a href="+code=arg" class="sref">arg
/a>, struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=new" class="sref">new
/a>,o 608
/a>                     struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> **
a href="+code=old" class="sref">old
/a>)o 609
/a>{o 610
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 611
/a>o 612
/a>        if (
a href="+code=new" class="sref">new
/a> == 
a href="+code=NULL" class="sref">NULL
/a>)o 613
/a>                
a href="+code=new" class="sref">new
/a> = &
a href="+code=noop_qdisc" class="sref">noop_qdisc
/a>;o 614
/a>o 615
/a>        
a href="+code=sch_tree_lock" class="sref">sch_tree_lock
/a>(
a href="+code=sch" class="sref">sch
/a>);o 616
/a>        *
a href="+code=old" class="sref">old
/a> = 
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>;o 617
/a>        
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a> = 
a href="+code=new" class="sref">new
/a>;o 618
/a>        
a href="+code=qdisc_tree_decrease_qlen" class="sref">qdisc_tree_decrease_qlen
/a>(*
a href="+code=old" class="sref">old
/a>, (*
a href="+code=old" class="sref">old
/a>)->
a href="+code=q" class="sref">q
/a>.
a href="+code=qlen" class="sref">qlen
/a>);o 619
/a>        
a href="+code=qdisc_reset" class="sref">qdisc_reset
/a>(*
a href="+code=old" class="sref">old
/a>);o 620
/a>        
a href="+code=sch_tree_unlock" class="sref">sch_tree_unlock
/a>(
a href="+code=sch" class="sref">sch
/a>);o 621
/a>        return 0;o 622
/a>}o 623
/a>o 624
/a>static struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sfb_leaf" class="sref">sfb_leaf
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, unsigned long 
a href="+code=arg" class="sref">arg
/a>)o 625
/a>{o 626
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 627
/a>o 628
/a>        return 
a href="+code=q" class="sref">q
/a>->
a href="+code=qdisc" class="sref">qdisc
/a>;o 629
/a>}o 630
/a>o 631
/a>static unsigned long 
a href="+code=sfb_get" class="sref">sfb_get
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=classid" class="sref">classid
/a>)o 632
/a>{o 633
/a>        return 1;o 634
/a>}o 635
/a>o 636
/a>static void 
a href="+code=sfb_put" class="sref">sfb_put
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, unsigned long 
a href="+code=arg" class="sref">arg
/a>)o 637
/a>{o 638
/a>}o 639
/a>o 640
/a>static int 
a href="+code=sfb_change_class" class="sref">sfb_change_class
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=classid" class="sref">classid
/a>, 
a href="+code=u32" class="sref">u32
/a> 
a href="+code=parentid" class="sref">parentid
/a>,o 641
/a>                            struct 
a href="+code=nlattr" class="sref">nlattr
/a> **
a href="+code=tca" class="sref">tca
/a>, unsigned long *
a href="+code=arg" class="sref">arg
/a>)o 642
/a>{o 643
/a>        return -
a href="+code=ENOSYS" class="sref">ENOSYS
/a>;o 644
/a>}o 645
/a>o 646
/a>static int 
a href="+code=sfb_delete" class="sref">sfb_delete
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, unsigned long 
a href="+code=cl" class="sref">cl
/a>)o 647
/a>{o 648
/a>        return -
a href="+code=ENOSYS" class="sref">ENOSYS
/a>;o 649
/a>}o 650
/a>o 651
/a>static void 
a href="+code=sfb_walk" class="sref">sfb_walk
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, struct 
a href="+code=qdisc_walker" class="sref">qdisc_walker
/a> *
a href="+code=walker" class="sref">walker
/a>)o 652
/a>{o 653
/a>        if (!
a href="+code=walker" class="sref">walker
/a>->
a href="+code=stop" class="sref">stop
/a>) {o 654
/a>                if (
a href="+code=walker" class="sref">walker
/a>->
a href="+code=count" class="sref">count
/a> >= 
a href="+code=walker" class="sref">walker
/a>->
a href="+code=skip" class="sref">skip
/a>)o 655
/a>                        if (
a href="+code=walker" class="sref">walker
/a>->
a href="+code=fn" class="sref">fn
/a>(
a href="+code=sch" class="sref">sch
/a>, 1, 
a href="+code=walker" class="sref">walker
/a>) < 0) {o 656
/a>                                
a href="+code=walker" class="sref">walker
/a>->
a href="+code=stop" class="sref">stop
/a> = 1;o 657
/a>                                return;o 658
/a>                        }o 659
/a>                
a href="+code=walker" class="sref">walker
/a>->
a href="+code=count" class="sref">count
/a>++;o 660
/a>        }o 661
/a>}o 662
/a>o 663
/a>static struct 
a href="+code=tcf_proto" class="sref">tcf_proto
/a> **
a href="+code=sfb_find_tcf" class="sref">sfb_find_tcf
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, unsigned long 
a href="+code=cl" class="sref">cl
/a>)o 664
/a>{o 665
/a>        struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a> *
a href="+code=q" class="sref">q
/a> = 
a href="+code=qdisc_priv" class="sref">qdisc_priv
/a>(
a href="+code=sch" class="sref">sch
/a>);o 666
/a>o 667
/a>        if (
a href="+code=cl" class="sref">cl
/a>)o 668
/a>                return 
a href="+code=NULL" class="sref">NULL
/a>;o 669
/a>        return &
a href="+code=q" class="sref">q
/a>->
a href="+code=filter_list" class="sref">filter_list
/a>;o 670
/a>}o 671
/a>o 672
/a>static unsigned long 
a href="+code=sfb_bind" class="sref">sfb_bind
/a>(struct 
a href="+code=Qdisc" class="sref">Qdisc
/a> *
a href="+code=sch" class="sref">sch
/a>, unsigned long 
a href="+code=parent" class="sref">parent
/a>,o 673
/a>                              
a href="+code=u32" class="sref">u32
/a> 
a href="+code=classid" class="sref">classid
/a>)o 674
/a>{o 675
/a>        return 0;o 676
/a>}o 677
/a>o 678
/a>o 679
/a>static const struct 
a href="+code=Qdisc_class_ops" class="sref">Qdisc_class_ops
/a> 
a href="+code=sfb_class_ops" class="sref">sfb_class_ops
/a> = {o 680
/a>        .
a href="+code=graft" class="sref">graft
/a>          =       
a href="+code=sfb_graft" class="sref">sfb_graft
/a>,o 681
/a>        .
a href="+code=leaf" class="sref">leaf
/a>           =       
a href="+code=sfb_leaf" class="sref">sfb_leaf
/a>,o 682
/a>        .
a href="+code=get" class="sref">get
/a>            =       
a href="+code=sfb_get" class="sref">sfb_get
/a>,o 683
/a>        .
a href="+code=put" class="sref">put
/a>            =       
a href="+code=sfb_put" class="sref">sfb_put
/a>,o 684
/a>        .
a href="+code=change" class="sref">change
/a>         =       
a href="+code=sfb_change_class" class="sref">sfb_change_class
/a>,o 685
/a>        .
a href="+code=delete" class="sref">delete
/a>         =       
a href="+code=sfb_delete" class="sref">sfb_delete
/a>,o 686
/a>        .
a href="+code=walk" class="sref">walk
/a>           =       
a href="+code=sfb_walk" class="sref">sfb_walk
/a>,o 687
/a>        .
a href="+code=tcf_chain" class="sref">tcf_chain
/a>      =       
a href="+code=sfb_find_tcf" class="sref">sfb_find_tcf
/a>,o 688
/a>        .
a href="+code=bind_tcf" class="sref">bind_tcf
/a>       =       
a href="+code=sfb_bind" class="sref">sfb_bind
/a>,o 689
/a>        .
a href="+code=unbind_tcf" class="sref">unbind_tcf
/a>     =       
a href="+code=sfb_put" class="sref">sfb_put
/a>,o 690
/a>        .
a href="+code=dump" class="sref">dump
/a>           =       
a href="+code=sfb_dump_class" class="sref">sfb_dump_class
/a>,o 691
/a>};o 692
/a>o 693
/a>static struct 
a href="+code=Qdisc_ops" class="sref">Qdisc_ops
/a> 
a href="+code=sfb_qdisc_ops" class="sref">sfb_qdisc_ops
/a> 
a href="+code=__read_mostly" class="sref">__read_mostly
/a> = {o 694
/a>        .
a href="+code=id" class="sref">id
/a>             =       
span class="string">"sfb",o 695
/a>        .
a href="+code=priv_size" class="sref">priv_size
/a>      =       sizeof(struct 
a href="+code=sfb_sched_data" class="sref">sfb_sched_data
/a>),o 696
/a>        .
a href="+code=cl_ops" class="sref">cl_ops
/a>         =       &
a href="+code=sfb_class_ops" class="sref">sfb_class_ops
/a>,o 697
/a>        .
a href="+code=enqueue" class="sref">enqueue
/a>        =       
a href="+code=sfb_enqueue" class="sref">sfb_enqueue
/a>,o 698
/a>        .
a href="+code=dequeue" class="sref">dequeue
/a>        =       
a href="+code=sfb_dequeue" class="sref">sfb_dequeue
/a>,o 699
/a>        .
a href="+code=peek" class="sref">peek
/a>           =       
a href="+code=sfb_peek" class="sref">sfb_peek
/a>,o 700
/a>        .
a href="+code=init" class="sref">init
/a>           =       
a href="+code=sfb_init" class="sref">sfb_init
/a>,o 701
/a>        .
a href="+code=reset" class="sref">reset
/a>          =       
a href="+code=sfb_reset" class="sref">sfb_reset
/a>,o 702
/a>        .
a href="+code=destroy" class="sref">destroy
/a>        =       
a href="+code=sfb_destroy" class="sref">sfb_destroy
/a>,o 703
/a>        .
a href="+code=change" class="sref">change
/a>         =       
a href="+code=sfb_change" class="sref">sfb_change
/a>,o 704
/a>        .
a href="+code=dump" class="sref">dump
/a>           =       
a href="+code=sfb_dump" class="sref">sfb_dump
/a>,o 705
/a>        .
a href="+code=dump_stats" class="sref">dump_stats
/a>     =       
a href="+code=sfb_dump_stats" class="sref">sfb_dump_stats
/a>,o 706
/a>        .
a href="+code=owner" class="sref">owner
/a>          =       
a href="+code=THIS_MODULE" class="sref">THIS_MODULE
/a>,o 707
/a>};o 708
/a>o 709
/a>static int 
a href="+code=__init" class="sref">__init
/a> 
a href="+code=sfb_module_init" class="sref">sfb_module_init
/a>(void)o 710
/a>{o 711
/a>        return 
a href="+code=register_qdisc" class="sref">register_qdisc
/a>(&
a href="+code=sfb_qdisc_ops" class="sref">sfb_qdisc_ops
/a>);o 712
/a>}o 713
/a>o 714
/a>static void 
a href="+code=__exit" class="sref">__exit
/a> 
a href="+code=sfb_module_exit" class="sref">sfb_module_exit
/a>(void)o 715
/a>{o 716
/a>        
a href="+code=unregister_qdisc" class="sref">unregister_qdisc
/a>(&
a href="+code=sfb_qdisc_ops" class="sref">sfb_qdisc_ops
/a>);o 717
/a>}o 718
/a>o 719
/a>
a href="+code=module_init" class="sref">module_init
/a>(
a href="+code=sfb_module_init" class="sref">sfb_module_init
/a>)o 720
/a>
a href="+code=module_exit" class="sref">module_exit
/a>(
a href="+code=sfb_module_exit" class="sref">sfb_module_exit
/a>)o 721
/a>o 722
/a>
a href="+code=MODULE_DESCRIPTION" class="sref">MODULE_DESCRIPTION
/a>(
span class="string">"Stochastic Fair Blue queue discipline");o 723
/a>
a href="+code=MODULE_AUTHOR" class="sref">MODULE_AUTHOR
/a>(
span class="string">"Juliusz Chroboczek");o 724
/a>
a href="+code=MODULE_AUTHOR" class="sref">MODULE_AUTHOR
/a>(
span class="string">"Eric Dumazet");o 725
/a>
a href="+code=MODULE_LICENSE" class="sref">MODULE_LICENSE
/a>(
span class="string">"GPL");o 726
/a>
lxr.linux.no kindly hosted by Redpill Linpro AS /a>, provider of Linux consulting and operations services since 1995.