#ifndef CLICK_GRID_PROXY_HH
#define CLICK_GRID_PROXY_HH
#include <click/element.hh>
#include <click/ipaddress.hh>
#include <click/glue.hh>
#include <click/atomic.hh>
#include <click/hashmap.hh>
#include <clicknet/ip.h>
CLICK_DECLS

/*
 * =c
 * GridProxy(IP)
 * =d
 * a simple mobile-ip proxy
 * Input 0: ipip packets from a gateway
 * Input 1: ip packets for a mobile host
 * Output 0: ip packets for the outside world
 * Output 1: ipip packets for current "gateway" machine
 *
 * GridProxy tracks the last gateway a host sent an ip packet
 * through and when it receives packets for that host, it sends
 * then to the gateway it was last heard through using an 
 * ipip tunnel.
 */
class GridProxy : public Element { 

  class DstInfo {
  public:
    IPAddress _ip;
    timeval _last_updated;
    IPAddress _gw;
    DstInfo() {_ip = IPAddress(0); _last_updated.tv_sec = 0; _gw = IPAddress(0); }
    DstInfo(IPAddress ip, IPAddress gw, timeval now) {
      _ip = ip;
      _last_updated = now;
      _gw = gw;
    }

  };
  typedef HashMap<IPAddress, DstInfo> ProxyMap;
  ProxyMap _map;
  
  click_ip _iph;
  uatomic32_t _id;
#if HAVE_FAST_CHECKSUM && FAST_CHECKSUM_ALIGNED
  bool _aligned;
#endif
  
  void reverse_mapping(Packet *p_in);
  void forward_mapping(Packet *p_in);
  

public:
    GridProxy();
    ~GridProxy();

    const char *class_name() const { return "GridProxy"; }
    const char *port_count() const { return "2/2"; }
    const char *processing() const { return PUSH; }

    int configure(Vector<String> &, ErrorHandler *);
    int initialize(ErrorHandler *);
    void add_handlers();
    void cleanup(CleanupStage);

    void push(int, Packet *);
  
  static String static_print_stats(Element *e, void *);
  String print_stats();

    
};

#include <click/hashmap.cc>
CLICK_ENDDECLS
#endif


syntax highlighted by Code2HTML, v. 0.9.1