// -*- mode: c++; c-basic-offset: 4 -*-
#ifndef CLICK_PI_HH
#define CLICK_PI_HH
#include <click/element.hh>
#include <click/ewma64.hh>
#include <click/timer.hh>
CLICK_DECLS
class Storage;
class PI : public Element { public:
PI();
~PI();
const char *class_name() const { return "PI"; }
const char *port_count() const { return "1/1-2"; }
const char *processing() const { return "a/ah"; }
int queue_size() const;
const DirectEWMA64 &average_queue_size() const { return _size; }
int drops() const { return _drops; }
int configure(Vector<String> &, ErrorHandler *);
int check_params(double, double, double, unsigned, unsigned, ErrorHandler *) const ;
int initialize(ErrorHandler *);
void cleanup(CleanupStage);
void take_state(Element *, ErrorHandler *);
void configuration(Vector<String> &) const;
bool can_live_reconfigure() const { return true; }
int live_reconfigure(Vector<String> &, ErrorHandler *);
void add_handlers();
bool should_drop();
void handle_drop(Packet *);
void push(int port, Packet *);
Packet *pull(int port);
void run_timer(Timer *);
protected:
Timer _timer;
Storage *_queue1;
Vector<Storage *> _queues;
// Queue sizes are shifted by this much.
static const unsigned QUEUE_SCALE = 10;
DirectEWMA64 _size;
int _random_value;
int _last_jiffies;
int _drops;
double _a, _b, _w, _p;
unsigned _target_q, _old_q;
Vector<Element *> _queue_elements;
static String read_stats(Element *, void *);
static String read_queues(Element *, void *);
static String read_parameter(Element *, void *);
static const int MAX_RAND=2147483647;
};
CLICK_ENDDECLS
#endif
syntax highlighted by Code2HTML, v. 0.9.1