The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netpfil/ipfw/dn_aqm_pie.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * PIE - Proportional Integral controller Enhanced AQM algorithm.
    3  *
    4  * $FreeBSD$
    5  * 
    6  * Copyright (C) 2016 Centre for Advanced Internet Architectures,
    7  *  Swinburne University of Technology, Melbourne, Australia.
    8  * Portions of this code were made possible in part by a gift from 
    9  *  The Comcast Innovation Fund.
   10  * Implemented by Rasool Al-Saadi <ralsaadi@swin.edu.au>
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright
   16  *    notice, this list of conditions and the following disclaimer.
   17  * 2. Redistributions in binary form must reproduce the above copyright
   18  *    notice, this list of conditions and the following disclaimer in the
   19  *    documentation and/or other materials provided with the distribution.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31  * SUCH DAMAGE.
   32  */
   33 
   34 #ifndef _IP_DN_AQM_PIE_H
   35 #define _IP_DN_AQM_PIE_H
   36 
   37 #define DN_AQM_PIE 2
   38 #define PIE_DQ_THRESHOLD_BITS 14
   39 /* 2^14 =16KB */
   40 #define PIE_DQ_THRESHOLD (1L << PIE_DQ_THRESHOLD_BITS) 
   41 #define MEAN_PKTSIZE 800
   42 
   43 /* 31-bits because random() generates range from 0->(2**31)-1 */
   44 #define PIE_PROB_BITS 31
   45 #define PIE_MAX_PROB ((1LL<<PIE_PROB_BITS) -1)
   46 
   47 /* for 16-bits, we have 3-bits for integer part and 13-bits for fraction */
   48 #define PIE_FIX_POINT_BITS 13
   49 #define PIE_SCALE (1L<<PIE_FIX_POINT_BITS)
   50 
   51 /* PIE options */
   52 enum {
   53         PIE_ECN_ENABLED =1,
   54         PIE_CAPDROP_ENABLED = 2,
   55         PIE_ON_OFF_MODE_ENABLED = 4,
   56         PIE_DEPRATEEST_ENABLED = 8,
   57         PIE_DERAND_ENABLED = 16
   58 };
   59 
   60 /* PIE parameters */
   61 struct dn_aqm_pie_parms {
   62         aqm_time_t      qdelay_ref;     /* AQM Latency Target (default: 15ms) */
   63         aqm_time_t      tupdate;                /* a period to calculate drop probability (default:15ms) */
   64         aqm_time_t      max_burst;      /* AQM Max Burst Allowance (default: 150ms) */
   65         uint16_t        max_ecnth;      /*AQM Max ECN Marking Threshold (default: 10%) */
   66         uint16_t        alpha;                  /* (default: 1/8) */
   67         uint16_t        beta;                   /* (default: 1+1/4) */
   68         uint32_t        flags;                  /* PIE options */
   69 };
   70 
   71 /* PIE status variables */
   72 struct pie_status{
   73         struct callout  aqm_pie_callout;
   74         aqm_time_t      burst_allowance;
   75         uint32_t        drop_prob;
   76         aqm_time_t      current_qdelay;
   77         aqm_time_t      qdelay_old;
   78         uint64_t        accu_prob;
   79         aqm_time_t      measurement_start;
   80         aqm_time_t      avg_dq_time;
   81         uint32_t        dq_count;
   82         uint32_t        sflags;
   83         struct dn_aqm_pie_parms *parms; /* pointer to PIE configurations */
   84         /* pointer to parent queue of FQ-PIE sub-queues, or  queue of owner fs. */
   85         struct dn_queue *pq;    
   86         struct mtx      lock_mtx;
   87         uint32_t one_third_q_size; /* 1/3 of queue size, for speed optization */
   88 };
   89 
   90 enum { 
   91         ENQUE = 1,
   92         DROP,
   93         MARKECN
   94 };
   95 
   96 /* PIE current state */
   97 enum { 
   98         PIE_ACTIVE = 1,
   99         PIE_INMEASUREMENT = 2
  100 };
  101 
  102 /* 
  103  * Check if eneque should drop packet to control delay or not based on
  104  * PIe algorithm.
  105  * return  DROP if it is time to drop or  ENQUE otherwise.
  106  * This function is used by PIE and FQ-PIE.
  107  */
  108 __inline static int
  109 drop_early(struct pie_status *pst, uint32_t qlen)
  110 {
  111         struct dn_aqm_pie_parms *pprms;
  112 
  113         pprms = pst->parms;
  114 
  115         /* queue is not congested */
  116 
  117         if ((pst->qdelay_old < (pprms->qdelay_ref >> 1)
  118                 && pst->drop_prob < PIE_MAX_PROB / 5 )
  119                 ||  qlen <= 2 * MEAN_PKTSIZE)
  120                 return ENQUE;
  121 
  122         if (pst->drop_prob == 0)
  123                 pst->accu_prob = 0;
  124 
  125         /* increment accu_prob */
  126         if (pprms->flags & PIE_DERAND_ENABLED)
  127                 pst->accu_prob += pst->drop_prob;
  128 
  129         /* De-randomize option 
  130          * if accu_prob < 0.85 -> enqueue
  131          * if accu_prob>8.5 ->drop
  132          * between 0.85 and 8.5 || !De-randomize --> drop on prob
  133          * 
  134          * (0.85 = 17/20 ,8.5 = 17/2)
  135          */
  136         if (pprms->flags & PIE_DERAND_ENABLED) {
  137                 if(pst->accu_prob < (uint64_t) (PIE_MAX_PROB * 17 / 20))
  138                         return ENQUE;
  139                  if( pst->accu_prob >= (uint64_t) (PIE_MAX_PROB * 17 / 2))
  140                         return DROP;
  141         }
  142 
  143         if (random() < pst->drop_prob) {
  144                 pst->accu_prob = 0;
  145                 return DROP;
  146         }
  147 
  148         return ENQUE;
  149 }
  150 
  151 #endif

Cache object: 261e19a26a14d982dd9e633d0c949b57


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.