#ifndef CLICK_SUPPRESSOR_HH
#define CLICK_SUPPRESSOR_HH
#include <click/element.hh>
CLICK_DECLS

/*
 * =c
 * Suppressor
 * =s classification
 * passes packets unchanged, optionally dropping some input ports
 * =d
 *
 * Suppressor has I<n> inputs and I<n> outputs. It generally passes packets
 * from input I<i> to output I<i> unchanged. However, any input port can be
 * suppressed, through a handler or a method call by another element. Packets
 * arriving on suppressed push input ports are dropped; pull requests arriving
 * on suppressed pull output ports are ignored.
 *
 * =h active0...activeI<N-1> read/write
 * Returns or sets whether each port is active (that is, not suppressed).
 * Every port starts out active.
 *
 * =h reset write-only
 * Resets every port to active. */

class Suppressor : public Element {
  
  fd_set _suppressed;
  
 public:
  
  Suppressor();
  ~Suppressor();
  
  const char *class_name() const		{ return "Suppressor"; }
  const char *port_count() const		{ return "-/="; }
  const char *processing() const		{ return AGNOSTIC; }
  const char *flow_code() const			{ return "#/#"; }
  
  int initialize(ErrorHandler *);
  void add_handlers();
  
  void push(int port, Packet *p);
  Packet *pull(int port);
  
  bool suppressed(int output) const { return FD_ISSET(output, &_suppressed); }
  void suppress(int output) { FD_SET(output, &_suppressed); }
  void allow(int output)    { FD_CLR(output, &_suppressed); }
  void allow_all()          { FD_ZERO(&_suppressed); }

  bool set(int output, bool suppressed);

};

CLICK_ENDDECLS
#endif


syntax highlighted by Code2HTML, v. 0.9.1